所有做Android App的同志们应该都知道渠道包是什么,得力于Android生态的多样性,我等写Android应用的人类每次发布App都需要面对数十个市场,而为了能够采集到市场的表现数据,就必须为每一个市场生成相应的apk包,也就是俗称的渠道包。

如此这般,如何更加便捷的生成渠道包就成了各显神通的地方。

友盟、酷传等第三方都有自动化工具来做,同行们也各自写了很多脚本,但我觉得似乎没必要那么复杂。Gradle本身就是一个构建工具,用它应该就能做到。一番研究之后发现果然是可以的,做出来效果也还算不错,再次跟大家分享一下。

先说一下我的构建环境:

  • Android Studio 0.9.1
  • Gradle 0.14.1

基本原理是利用Gradle的 manifest merger 功能,这个功能的主要用途是能够在运行时替换AndroidManifest.xml里面的内容,具体功能大家自行查看文档吧,这里就不赘述了。

我用的是友盟的统计,所以现在AndroidManifest.xml里面会有这么一段:

<meta-data
android:name="UMENG_CHANNEL"
android:value="Channel_ID" />

里面的Channel_ID就是渠道标示。我们的目标就是在编译的时候这个值能够自动变化。

第一步 在AndroidManifest.xml里配置PlaceHolder

<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />

第二步 在模块的build.gradle文件的defaultConfig里加上PlaceHolder定义

android {
... defaultConfig {
...
manifestPlaceholders = [ UMENG_CHANNEL_VALUE:"default_channel" ]
}
}

这里的作用有两个,一是声明UMENG_CHANNEL_VALUE是可替换值的PlaceHolder,二是为其设置默认值。

第三步 在模块的build.gradle文件里添加ProductFlavors配置

android {
... defaultConfig {
...
manifestPlaceholders = [ UMENG_CHANNEL_VALUE:"default_channel" ]
}
productFlavors {
default_channel{}
wandoujia{}
_360{}
yingyongbao{}
xiaomi{}
baidu{}
huawei{}
jifeng{}
}
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [ UMENG_CHANNEL_VALUE:name ]
}
}

所谓ProductFlavors其实就是可定义的产品特性,配合manifest merger使用的时候就可以达成在一次编译过程中产生多个具有自己特性配置的版本。

上面这个配置的作用就是,为每个渠道包产生不同的UMENG_CHANNEL_VALUE的值。

第四步 一次生成所有渠道包

到工程目录下运行gradlew assembleRelease试试看吧。应该能看到这次编译一共产生了8个apk,分别对应在productFlavors段定义的8个渠道。

可以用apktools反编译每个apk,打开AndroidManifest.xml看看,就会发现友盟这一段的配置已经相应的被修改了。

<meta-data
android:name="UMENG_CHANNEL"
android:value="default_channel" />

如果只是想生成单个渠道的包呢?

打开AndroidStudio的Gradle tasks面板,会发现模块多了很多任务,如下图所示。

此时可以直接双击该任务生成对应的apk,也可以用命令行单独生成,比如

gradlew assembleWandoujiaRelease

好了,到此任务就完成了。当然,这个方式也是有缺陷的,有一些特定的渠道包不是仅仅修改AndroidManifest.xml就可以的,比如小米就要求app本身不能有自动更新功能,这需要改动代码,所以就无能为力了。

最新文章

  1. ASP.net如何保证EF操作类线程内唯一
  2. Firefox使用svg blur滤镜渲染图片
  3. session 加入redis的实现代码方式
  4. jdk 与jre的区别
  5. 套接字I/O模型-select
  6. JVM学习---JAVA内存
  7. Linux - 硬链接与软链接
  8. 学习了几天的jQuery Mobile的一点感受
  9. 【STM32】用DMA实现多路ADC通道数据采集
  10. GridView边线Border设置
  11. oracle一次删除多张表
  12. 还在为CSS布局发愁?你该看看这7条原则
  13. 1.0 添加WEB API项目并按注释生成文档(多项目结构)
  14. Spring @Conditional注解的使用
  15. IDF-简单题目writeup
  16. vs2012密钥
  17. keepalived 高可用配置
  18. Git应用实践(一)
  19. 基于WebQQ3.0协议写一个QQ机器人
  20. ArrayList集合类

热门文章

  1. 20180104 wdcp中的mysql重启不成功
  2. Mysql 数据库学习笔记04 函数
  3. java中的i++与++i有什么区别?
  4. Django在根据models生成数据库表时报错
  5. Longest Valid Parentheses——仍然需要认真看看(动态规划)
  6. 【转】kubernetes 中 deployment 支持哪些键值
  7. CentOS7.5***
  8. 错误:Eclipse老是出现 updating error reports database
  9. HDU 6186 CS Course【前后缀位运算枚举/线段树】
  10. CodeForces 779C Dishonest Sellers