Android Studio使用教程(六):Gradle多渠道打包
由于国内android市场众多渠道,为了统计每个渠道的下载及其它数据统计,就需要我们针对每个渠道单独打包,如果让你打几十个市场的包岂不烦死了,不过有了gradle,这再也不是事了。
友盟多渠道打包
废话不多说,以友盟统计为例,在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设置productflavors
android {
productflavors {
xiaomi {
manifestplaceholders = [umeng_channel_value: "xiaomi"]
}
_360 {
manifestplaceholders = [umeng_channel_value: "_360"]
}
baidu {
manifestplaceholders = [umeng_channel_value: "baidu"]
}
wandoujia {
manifestplaceholders = [umeng_channel_value: "wandoujia"]
}
}
}
或者批量修改
android {
productflavors {
xiaomi {}
_360 {}
baidu {}
wandoujia {}
}
productflavors.all {
flavor -> flavor.manifestplaceholders = [umeng_channel_value: name]
}
}
很简单清晰有没有?直接执行 ./gradlew assemblerelease , 然后就可以静静的喝杯咖啡等待打包完成吧。
assemble结合build variants来创建task
上一篇博客介绍了 assemble 这个命令,会结合 build type 创建自己的task,如:
./gradlew assembledebug
./gradlew assemblerelease
除此之外 assemble 还能和 product flavor 结合创建新的任务,其实 assemble 是和 build variants 一起结合使用的,而 build variants = build type + product flavor , 举个例子大家就明白了:
如果我们想打包wandoujia渠道的release版本,执行如下命令就好了:
./gradlew assemblewandoujiarelease
如果我们只打wandoujia渠道版本,则:
./gradlew assemblewandoujia
此命令会生成wandoujia渠道的release和debug版本
同理我想打全部release版本:
./gradlew assemblerelease
这条命令会把product flavor下的所有渠道的release版本都打出来。
总之,assemble 命令创建task有如下用法:
**assemble**: 允许直接构建一个variant版本,例如assembleflavor1debug。
**assemble**: 允许构建指定build type的所有apk,例如assembledebug将会构建flavor1debug和flavor2debug两个variant版本。
**assemble**: 允许构建指定flavor的所有apk,例如assembleflavor1将会构建flavor1debug和flavor1release两个variant版本。
完整的gradle脚本
最后福利大放送,来一份我在项目中使用的完整的gradle文件配置:
apply plugin: 'com.android.application'
def releasetime() {
return new date().format("yyyy-mm-dd", timezone.gettimezone("utc"))
}
android {
compilesdkversion 21
buildtoolsversion '21.1.2'
defaultconfig {
applicationid "com.boohee.*"
minsdkversion 14
targetsdkversion 21
versioncode 1
versionname "1.0"
// dex突破65535的限制
multidexenabled true
// 默认是umeng的渠道
manifestplaceholders = [umeng_channel_value: "umeng"]
}
lintoptions {
abortonerror false
}
signingconfigs {
debug {
// no debug config
}
release {
storefile file("../yourapp.keystore")
storepassword "your password"
keyalias "your alias"
keypassword "your password"
}
}
buildtypes {
debug {
// 显示log
buildconfigfield "boolean", "log_debug", "true"
versionnamesuffix "-debug"
minifyenabled false
zipalignenabled false
shrinkresources false
signingconfig signingconfigs.debug
}
release {
// 不显示log
buildconfigfield "boolean", "log_debug", "false"
minifyenabled true
zipalignenabled true
// 移除无用的resource文件
shrinkresources true
proguardfiles getdefaultproguardfile('proguard-android.txt'), 'proguard-rules.pro'
signingconfig signingconfigs.release
applicationvariants.all { variant ->
variant.outputs.each { output ->
def outputfile = output.outputfile
if (outputfile != null && outputfile.name.endswith('.apk')) {
// 输出apk名称为boohee_v1.0_2015-01-15_wandoujia.apk
def filename = "boohee_v${defaultconfig.versionname}_${releasetime()}_${variant.productflavors[0].name}.apk"
output.outputfile = new file(outputfile.parent, filename)
}
}
}
}
}
// 友盟多渠道打包
productflavors {
wandoujia {}
_360 {}
baidu {}
xiaomi {}
tencent {}
taobao {}
...
}
productflavors.all { flavor ->
flavor.manifestplaceholders = [umeng_channel_value: name]
}
}
dependencies {
compile filetree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:support-v4:21.0.3'
compile 'com.jakewharton:butterknife:6.0.0'
...
}
大家有问题或疑问、建议欢迎博客留言,android studio的教程暂且到这里结束了,相信大家基本的都已会使用了,还有其他技巧与操作靠大家自己摸索了,之后有时间也会在博客上整理下一些tips之类的,欢迎大家关注。
推荐阅读
-
【Android新手指引】Android Studio如何使用Gradle进行多渠道打包
-
Android Studio使用教程(六):Gradle多渠道打包
-
Android Studio使用教程(五):Gradle命令详解和导入第三方包
-
Android Studio使用教程(四):Gradle基础
-
Android eclipse使用gradle打包的图文教程
-
Android Studio使用教程(六):Gradle多渠道打包
-
Android Studio使用教程(五):Gradle命令详解和导入第三方包
-
Android Studio使用教程(四):Gradle基础
-
【Android新手指引】Android Studio如何使用Gradle进行多渠道打包