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里面会有这么一段:
里面的Channel_ID就是渠道标示。我们的目标就是在编译的时候这个值能够自动变化。
第一步 在AndroidManifest.xml里配置PlaceHolder
第二步 在build.gradle设置productFlavors
或者批量修改
很简单清晰有没有?直接执行 ./gradlew assembleRelease , 然后就可以静静的喝杯咖啡等待打包完成吧。
上一篇博客介绍了 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文件配置:
有的项目下会有
gradlew assembleRelease
就可以一次性生成所有的渠道包了
不过我一般不建议大家使用这个命令,gradlew这个命令的gralde的版本无法控制,有时候会莫名其妙的下载老版本的gradle
所以我个人推荐大家使用以下的用法。
先找到
变量名为:
所以变量值为:
还有一个在系统变量里
我的就是
这里配置完成了,接着在
所有生成的apk在项目的
如果只是想生成单个渠道的包呢?
打开Android Studio的Gradle tasks面板(右边侧边栏),会发现模块多了很多任务,如下图所示。
![](http://xyzphoto.qiniudn.com/wordpress_20_QQ%E6%88%AA%E5%9B%BE20141117162914.png)
此时可以直接双击该任务生成对应的apk,也可以用命令行单独生成,比如
多渠道打包从此就非常快捷了,今天就写到这里,以后Android studio有相应的tips还是会分享给大家。
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面板(右边侧边栏),会发现模块多了很多任务,如下图所示。
![](http://xyzphoto.qiniudn.com/wordpress_20_QQ%E6%88%AA%E5%9B%BE20141117162914.png)
此时可以直接双击该任务生成对应的apk,也可以用命令行单独生成,比如
1 2 | gradle assembleWandoujiaRelease |
相关文章推荐
- 图解Android应用程序构建原理
- Android开发笔记---service的简单使用
- Android-倒计时工具类
- Android端与Java服务端交互——SocketIO
- 解读Android虚拟机工作原理
- android studio Gradle基础
- 深入分析Android系统中SparseArray的源码
- android开源框架(开始开发的时候参考)
- Android性能优化之一:ViewStub
- Android Studio中使用git功能无法clone原因分析
- Android属性动画完全解析(上),初识属性动画的基本用法
- 获取安卓手机设备信息(cpu,手机内存,SD卡,运行内存,mac和开机时间)
- Android之——Surface、SurfaceView与SurfaceHolder.Callback初探
- android杂记5:Android Support Library
- android:button点击
- 自定义viewgroup 继承 FrameLayout 仿QQ侧滑菜单
- Android 记录和恢复ListView滚动的位置的三种方法
- Android中SharedPreferences用法
- Android发送post请求
- android:实现activity跳转,activity数据存储(SharedPreferences)