gradle 构建不同渠道 APK 包

在写这篇文章之前必须要对我们万恶的墙吐槽一下,同样的关键字,在百度和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命名空间里的包名。

  
  
  1. android.applicationVariants.all { variant ->
  2. def buildType = variant.buildType
  3. def encoding = java.nio.charset.Charset.defaultCharset().toString()
  4. if (buildType.applicationIdSuffix) {
  5. def defaultPackageId = variant.packageName.replaceAll(buildType.applicationIdSuffix,'')
  6. variant.mergeResources.doLast {
  7. def dir = file("${buildDir}/intermediates/res/${variant.dirName}/layout")
  8. dir.listFiles().each { f->
  9. String content = f.getText(encoding)
  10. content = content.replaceAll("res/"+defaultPackageId, "res/"+variant.packageName)
  11. f.write(content, encoding)
  12. }
  13. }
  14. }
  15. }

定制APK的应用名称

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

  
  
  1. <application
  2. ...
  3. android:label="@string/app_name" >

build.gradle里增加下面的代码就可以为debug版一个特殊的命名了

  
  
  1. android.applicationVariants.all { variant ->
  2. def buildType = variant.buildType
  3. def encoding = java.nio.charset.Charset.defaultCharset().toString()
  4. if (buildType.applicationIdSuffix) {
  5. def defaultPackageId = variant.packageName.replaceAll(buildType.applicationIdSuffix,'')
  6. variant.mergeResources.doLast {
  7. def f = file("${buildDir}/intermediates/res/${variant.dirName}/values/values.xml")
  8. String content = f.getText(encoding)
  9. content = content.replaceAll('来往','来往Beta')
  10. f.write(content,encoding)
  11. }
  12. }
  13. }

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是那个环境的包了!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值