需求
国内Android app发布一般会有多个渠道,为了跟踪发展情况,通常会为每一个渠道定制一个特别的apk。
一般友盟之类第三方统计的渠道ID定义如下,以wandoujia为例
<meta-data android:name="UMENG_CHANNEL" android:value="wandoujia" />
如果不使用第三方统计,自己也可以在AndroidManifest.xml中定义类似meta-data
如果每个渠道都手工修改,打包,10几个渠道下来??
咱还是自动化来得方便
解决方案
Gradle Android Plugin 0.10 新增了Manifest Merger
For custom placeholders replacements, use the following DSL to configure the placeholders values :
android {
defaultConfig {
manifestPlaceholders = [ activityLabel:"defaultName"]
}
productFlavors {
free {
}
pro { manifestPlaceholders = [ activityLabel:"proName" ]
}
}
}
Manifest Merger 可以替换Manifest中对应key的值
所以,可以利用Product flavor + manifestPlaceholder 来替换对应渠道的key
假如我们有wandoujia, Google Play, 两个渠道,可以这么写
AndroidManifest.xml
<meta-data android:name="UMENG_CHANNEL" android:value="$[CHANNEL_KET]" />
build.gradle
productFlavors {
wandoujia{
manifestPlaceholders = [ UMENG_CHANNEL_VALUE:name]
}
google_play{
manifestPlaceholders = [ UMENG_CHANNEL_VALUE:name]
}
}
ok, 搞定,几行代码自动生成对应渠道的apk。 其实是将Manifest中的 UMENG_CHANNEL_VALUE替换成了flavorbuild的name
可以看到每个flavor里面的代码一样,比较啰嗦,还能在简化下,
productFlavors {
wandoujia{
}
google_play{
}
}
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [ UMENG_CHANNEL_VALUE:name ]
}
一个循环搞定~
-------------------------------------------------------------------------------------------------------------------------------
原文章地址:http://devyang.com/blog/2014/11/03/android-gradle-duo-qu-dao-da-bao-pei-zhi/