原文链接:http://stormzhang.com/devtools/2015/01/15/android-studio-tutorial6/

由于国内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'
...
}

最新文章

  1. linq的简单增删改查
  2. JavaScript强化教程 —— Cocos2d-JS的屏幕适配方案
  3. javascript之聊天室(单机)来自于冷的锋刃
  4. C# in VS
  5. java实现吸血鬼数字
  6. POJ 3292
  7. 【Linux高频命令专题(10)】mv
  8. OD: Kernel Exploit - 1
  9. UITableVIewcell中图片不能改变大小的原因
  10. 用qsort排序
  11. java.lang.UnsupportedClassVersionError: com/T : Unsupported major.minor version问题解决
  12. 开关调色新世界BP2888电源解决方案
  13. Nginx学习——Nginx基本配置
  14. 1.常用turtle功能函数
  15. 文本主题模型之非负矩阵分解(NMF)
  16. JSP介绍
  17. Lock和Static使用说明和区别
  18. Enrolment注册插件
  19. Py中的矩阵乘法【转载】
  20. pta l2-4(这是二叉搜索树吗?)

热门文章

  1. web前端
  2. ubuntu的使用
  3. BeautifulSoup 的用法
  4. 根据浏览器显示界面大小变换,替换css文件方法
  5. BZOJ4520 [Cqoi2016]K远点对
  6. [bigdata] 使用Flume hdfs sink, hdfs文件未关闭的问题
  7. 69个经典Spring面试题和答案
  8. 触发器运用示例---laobai
  9. xpth 字符串截取
  10. 将DataTable生成树json