使用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本身不能有自动更新功能,这需要改动代码,所以就无能为力了。
使用Gradle构建Android应用的渠道包的更多相关文章
- 用Gradle 构建android程序
		前言 android gradle 的插件终于把混淆代码的task集成进去了,加上最近,android studio 用的是gradle 来构建项目, 下定决心把android gralde 构建项目 ... 
- 使用Gradle构建Android项目
		阅读目录 Gradle是什么? 环境需求 Gradle基本结构 任务task的执行 基本的构建定制 目录配置 签名配置 代码混淆设置 依赖配置 输出不同配置的应用 生成多个渠道包(以Umeng为例) ... 
- 在内网使用Gradle构建Android Studio项目
		在Android Studio项目中,默认的远程仓库为jcenter,如果在项目引用了一些类库,Gradle构建程序的时候会将这些依赖类库从jcenter网站下载到本地,如我们在 build.grad ... 
- Gradle 构建 android 应用常见问题解决指南
		前言 android gradle 插件已经发展到0.5.7,同时gradle 本身也到了1.8,相比两个月前,android gradle 更快,更完善,也更好用了,为了让各位androider 早 ... 
- [Gradle]   Gradle 构建 android 应用常见问题解决指南
		转载地址:http://www.cnblogs.com/youxilua/p/3348162.html 1: 使用最新的gradle android插件 以前我们写的时候会这么写 dependenci ... 
- 使用Gradle构建Android应用内测版本
		在开发应用的过程中,有时候需要比较当前线上版本和正在开发中的版本差异,目前的做法只能是在两个不同的设备上面安装线上版本和开发中的版本,因为当前版本在调试过程中会覆盖旧版本.本文通过使用gradle来构 ... 
- gradle构建android项目详解
		1.用Gradle构建 1.1 工程结构 如图所示,这是一个不能更普通的Android的Gradle工程了. 根目录下面的settings.gradle当中主要是用来include子模块的,比如我们这 ... 
- 使用gradle构建Android时 版本号versionName中嵌入git提交信息
		为什么要这么做 在应用开发的版本迭代过程中,通过版本号并不能快速定位到所对应的代码,导致在后面分析问题追溯对应版本的代码时比较麻烦. 如果代码是通过git来管理的,git的commit id等 ... 
- gradle构建android项目
		工具: Android Studio2.0 gradle-2.10 一.Android常识 在做Android开发的时候我们首先必须要有一个SDK.一般SDK的主要作用就是将硬件和软件进行分离,做软件 ... 
随机推荐
- javascript 线程问题小记
			大家都知道javascript是单线程执行的,alert之后,就无法执行以下的函数,浏览器是按照从上到下的顺序来安排解析显示的. 其实虽然javascript是单线程的,但是浏览器是多线程的,典型的浏 ... 
- 23:django 信号(signal)
			django包含了一个“信号分配器”使得当一些动作在框架的其他地方发生的时候,解耦的应用可以得到提醒.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者,这是特别有用的设计因为有些 ... 
- MySQL查找出重复的记录
			问题 查找表中多余的重复记录,重复记录是根据单个字段来判断的.例如:有张表中有uid和uname两个字段,现在需要查找出uname重复的所有数据列.数据表如下: id o_id uname 1 11 ... 
- tomcat  - gc日志输出
			原创 2017年01月04日 14:32:37 2090 tomcat/bin catalina.sh JAVA_OPTS='-server -Xms4g -Xmx4g -Xss256k -XX:Pe ... 
- hdu 3488(KM算法||最小费用最大流)
			Tour Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submis ... 
- XenServer创建镜像Storage
			Youtube:https://www.youtube.com/watch?v=-AK3nauKUw0 在安装了XenServer后,是没有镜像Storage的,我们可以在XenCenter中创建一个 ... 
- 计蒜客 A2232.程序设计:蒜厂年会-单调队列(双端队列(STL deque)实现)滑窗维护最小前缀和
			程序设计:蒜厂年会 问答问题反馈 只看题面 16.79% 1000ms 262144K 在蒜厂年会上有一个抽奖,在一个环形的桌子上,有 nn 个纸团,每个纸团上写一个数字,表示你可以获得多少蒜币. ... 
- nio案例一:个简单的客户-服务的案例
			<Java NIO文档>非阻塞式服务器 原文连接 原文作者:Jakob Jenkov 译者:higher 即使你知道Java NIO 非阻塞的工作特性(如Selector,Channel, ... 
- Sqli-labs less 10
			Less-10 本关我们从标题就可以看到 <基于时间-双引号>,所以很明显的这关要我们利用延时注入进行,同时id参数进行的是 " 的处理.和less9的区别就在于单引号(')变成 ... 
- BZOJ 1229 [USACO2008 Nov]toy 玩具(三分+贪心)
			[题木链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1229 [题目大意] 每天对玩具都有一定的需求ni,每天可以花f价值每条购买玩具, 当天 ... 
