您的位置:首页 > 移动开发 > Android开发

android studion Gradle多渠道打包

2015-07-31 11:31 537 查看
本文参考 
http://my.oschina.net/aibenben/blog/370985 http://stormzhang.com/devtools/2014/12/18/android-studio-tutorial4/ http://xuyazhou.com/archives/461 http://www.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'
...
}


一次生成所有渠道包

在android studio底栏中有个命令行工具
Terminal
,打开后就
CMD
可以自动切换到当前项目的目录下。

有的项目下会有
graldew.bat
这个文件,你就可以输入这个命令:

gradlew assembleRelease

就可以一次性生成所有的渠道包了

不过我一般不建议大家使用这个命令,gradlew这个命令的gralde的版本无法控制,有时候会莫名其妙的下载老版本的gradle

所以我个人推荐大家使用以下的用法。

先找到
gralde
的根目录,在系统变量里添加两个环境变量:

变量名为:
GRADLE_HOME
,变量值就为gradle的根目录;

所以变量值为:
C:\Users\yazhou\.gradle\wrapper\dists\gradle-2.1-all\27drb4udbjf4k88eh2ffdc0n55\gradle-2.1


还有一个在系统变量里
PATH
里面添加
gradle
的bin目录

我的就是
C:\Users\yazhou\.gradle\wrapper\dists\gradle-2.1-all\27drb4udbjf4k88eh2ffdc0n55\gradle-2.1\bin


这里配置完成了,接着在
Terminal
中敲下 
gradle assembleRelease
就可以一次性生成所有的渠道包了。

所有生成的apk在项目的
build\outputs\apk
下。

如果只是想生成单个渠道的包呢?

打开Android Studio的Gradle tasks面板(右边侧边栏),会发现模块多了很多任务,如下图所示。



此时可以直接双击该任务生成对应的apk,也可以用命令行单独生成,比如

1
2

gradle
assembleWandoujiaRelease

 

多渠道打包从此就非常快捷了,今天就写到这里,以后Android studio有相应的tips还是会分享给大家。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: