使用Gradle构建Android应用的渠道包
2015-12-22 10:38
369 查看
转载 http://www.cnblogs.com/shanpow/p/4097320.html
所有做Android App的同志们应该都知道渠道包是什么,得力于Android生态的多样性,我等写Android应用的人类每次发布App都需要面对数十个市场,而为了能够采集到市场的表现数据,就必须为每一个市场生成相应的apk包,也就是俗称的渠道包。
如此这般,如何更加便捷的生成渠道包就成了各显神通的地方。
友盟、酷传等第三方都有自动化工具来做,同行们也各自写了很多脚本,但我觉得似乎没必要那么复杂。Gradle本身就是一个构建工具,用它应该就能做到。一番研究之后发现果然是可以的,做出来效果也还算不错,再次跟大家分享一下。
先说一下我的构建环境:
Android Studio 0.9.1
Gradle 0.14.1
基本原理是利用Gradle的 manifest merger 功能,这个功能的主要用途是能够在运行时替换AndroidManifest.xml里面的内容,具体功能大家自行查看文档吧,这里就不赘述了。
我用的是友盟的统计,所以现在AndroidManifest.xml里面会有这么一段:
里面的Channel_ID就是渠道标示。我们的目标就是在编译的时候这个值能够自动变化。
这里的作用有两个,一是声明
所谓ProductFlavors其实就是可定义的产品特性,配合
上面这个配置的作用就是,为每个渠道包产生不同的
可以用
此时可以直接双击该任务生成对应的apk,也可以用命令行单独生成,比如
好了,到此任务就完成了。当然,这个方式也是有缺陷的,有一些特定的渠道包不是仅仅修改
使用Gradle构建Android应用的渠道包
所有做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本身不能有自动更新功能,这需要改动代码,所以就无能为力了。
相关文章推荐
- Android中自定义AlertDialog使用
- Android禁止横屏竖屏切换
- (转)Android系统自带Activity样式(@android:style/)
- 复制Android Studio 工程到其它电脑后遇到The SDK directory 'XXXX‘ does not exist.问题的解决方法
- android 百度地图定位总结
- 兼容 Android 4.4 透明状态栏与导航栏
- Android WebView远程执行代码漏洞浅析
- Android GradientShader
- Android之Dialog列表项对话框
- Android自定义控件初体验
- Android:新手必备的常用代码片段整理(二)
- 安卓开发学习之020 自定义视图的用户交互事件
- android Button上面的英文字符串自动大写的问题解决
- Android多线程之java.lang.IllegalThreadStateException: Thread already started
- android中的 Toast 和 AlertDialog
- Android:新手必备的常用代码片段整理(一)
- Android沉浸式和状态栏透明设置笔记!
- android开发经验笔记总计
- 10个Android开源个性化View控件
- Android自己定义控件实战——仿淘宝商品浏览界面