使用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的主要作用就是将硬件和软件进行分离,做软件 ...
随机推荐
- PIL处理图片信息
最近遇到了图片处理的一些问题,python提供了一些库可以很方便地帮助我们解决这些问题,在这里把我这几天的学习总结一下. 一.提取图片的RGB值 1.非代码:如果只是为了提取某张图片或者某个像素点的R ...
- mui初探笔记
/* MUI 使用说明: * * 1.每个用到mui的页面都调用下mui.init. * 2.如果需要使用大H5+对象,就写到plusReady中,如plus对象. */ '''[MUI开发注意事项] ...
- Redis -- 数据类型小结
redis key 的命名规则: 对象类型:对象id:对象属性 (hset car:1: price 500.hset car:1: name:tom) 一.redis 数据类型: 1. 字符串类型 ...
- mac date命令
usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... [-f fmt date | [[[mm]dd ...
- win10网速慢
升级到win10之后发现网速特别慢,搜了下,网上的解决办法果然好使,按照如下操作即可. 返回桌面,按WIN+R键组合,运行gpedit.msc 打开组策略 依次展开管理模板->网络->Qo ...
- LeetCode解题报告—— 1-bit and 2-bit Characters & 132 Pattern & 3Sum
1. 1-bit and 2-bit Characters We have two special characters. The first character can be represented ...
- 【JBPM4】判断节点decision 方法3 handler
JPDL <?xml version="1.0" encoding="UTF-8"?> <process key="decision ...
- Linux下cp命令的使用说明
[root@www ~]# cp [-adfilprsu] 来源档(source) 目标档(destination)[root@www ~]# cp [options] source1 source2 ...
- Spring注解@Scope("prototype")
spring 默认scope 是单例模式 这样只会创建一个Action对象 每次访问都是同一个Action对象,数据不安全 struts2 是要求 每次次访问 都对应不同的Action scope=& ...
- Sqlite的导入导出功能
导出,使用dump命令 导入,使用read命令 可以直接执行,类似 sqlite xxx.db3 ".read ../sss.sql"