您的位置:首页 > 产品设计 > UI/UE

gradle 构建不同渠道 APK 包

2015-04-27 11:58 357 查看
在写这篇文章之前必须要对我们万恶的墙吐槽一下,同样的关键字,在百度和google就是完全两个不同的结果。

背景
            在目前开发一个app当中,应用一般都会分为内测版、正式版。二者可能会有不同的配置,例如,Constants、packageName、xml等;

                如果你是第一次使用gradle 构建android项目建议你先使用
gradle clean
 把android
gradle 插件,还有相关依赖包下载下来并且对环境进行初始化,如果出错了,一般可能是下载超时,试多几次即可,最后你会看到如下提示:
BUILD SUCCESSFUL


The TaskContainer.add() method has been deprecated and is scheduled to be remove d in Gradle 2.0. Please use the create() method instead.

:clean UP-TO-DATE

BUILD SUCCESSFUL

Total time: 7.847 secs

完成以上的步骤,就可以正式使用gralde 构建你的android项目了。

然后使用
gradle build
 就完成了android 项目的构建了。如果,你是照着以上步骤走的话,你将会想项目目录里面看到一个build 的目录,里面就是用gradle 构建android项目的全部例如了,结构目录看附录。

最终打包的apk 就在build/apk 目录下了。然后,你会发现,两个apk 一个是 [项目名]-debug-unaligned [项目名]-release-unsigned

gradle 打包一般默认 会打出两个包 一个是 debug 和 release

那么问题来了,这两个版本的apk是如何产生的呢。

解决方案
            以前可以通过MAVEN的地址变量对应来解决,而现在gradle提供了 BuildTypes和productFlavors
两种问题的解决方案

1. BuildTypes



            
buildTypes{} 这种语法是对 debug 和 release 两种版本的apk进行的配置。 在buildTypes当中对于 release版本的apk的配置 可以 配置其签名,log,混淆,zipAlign,报名;等等


修正资源文件里的包名

如果你的项目里使用了自定义的View,且有自定义的属性时,会需要修正一下xml命名空间里的包名。
android.applicationVariants.all { variant ->

def buildType = variant.buildType

def encoding = java.nio.charset.Charset.defaultCharset().toString()

if (buildType.applicationIdSuffix) {

def defaultPackageId = variant.packageName.replaceAll(buildType.applicationIdSuffix,'')

variant.mergeResources.doLast {

def dir = file("${buildDir}/intermediates/res/${variant.dirName}/layout")

dir.listFiles().each { f->

String content = f.getText(encoding)

content = content.replaceAll("res/"+defaultPackageId, "res/"+variant.packageName)

f.write(content, encoding)

}

}

}

}



定制APK的应用名称

如果同时安装两个版本,那么最好能从应用名称上来区别一下,一般我们在
AndroidManifest.xml
中使用String resource来命名,如下:
<application

...

android:label="@string/app_name" >


build.gradle
里增加下面的代码就可以为debug版一个特殊的命名了
android.applicationVariants.all { variant ->

def buildType = variant.buildType

def encoding = java.nio.charset.Charset.defaultCharset().toString()

if (buildType.applicationIdSuffix) {

def defaultPackageId = variant.packageName.replaceAll(buildType.applicationIdSuffix,'')

variant.mergeResources.doLast {

def f = file("${buildDir}/intermediates/res/${variant.dirName}/values/values.xml")

String content = f.getText(encoding)

content = content.replaceAll('来往','来往Beta')

f.write(content,encoding)

}

}

}


2. productFlavors 
在build.gradle 当中填写



在 src 下 目录下 新建 与main 同级的 production 和staging 目录,同样里面的目录结构与main一致



注意:如果你的project不是按照上述目录构建,例如你是从eclipse当中导出的AS项目,也没有关系,gradle支持灵活设置项目目录

build.gradle



 增加 两个目录 deploy 和 staging 两个目录; 同时需要注意建立的目录顺序一定和主目录的一致(这里同Maven打出不同版本,渠道的apk一样的方式)



在build.gradle当中 可以设置 sourceSets当中指定 staging 和deploy 的目录



3. 运行

          


           
 图中红色标记的都是 都是不同的打包命令, 可以在AS当中点击单个,同样也可以在命令行当中运行 gradle assembleDeployDebug 等类似命令;图为打包产生apk 的目录



配置默认运行的打包命令



通过图中的配置,就可以配置你要运行到手机或者模拟器当中的apk是那个环境的包了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息