Android Studio之Gradle多渠道打包

来源:互联网 发布:php汽车管理系统 编辑:程序博客网 时间:2024/05/16 14:28

Android Studio之Gradle多渠道打包


由于国内Android市场众多渠道,为了统计每个渠道的下载及其它数据统计,就需要我们针对每个渠道单独打包,如果让你打几十个市场的包岂不烦死了,不过有了Gradle,这事就简单了。

友盟多渠道打包

废话不多说,以友盟统计为例,在AndroidManifest.xml里面会有这么一段:
[html] view plain copy
 print?
  1. <meta-data  
  2.     android:name="UMENG_CHANNEL"  
  3.     android:value="Channel_ID" />  
里面的 Channel_ID 就是渠道标示。我们的目标就是在编译的时候这个值能够自动变化。

第一步 在 AndroidManifest.xml 里配置 PlaceHolder
[html] view plain copy
 print?
  1. <meta-data  
  2.     android:name="UMENG_CHANNEL"  
  3.     android:value="${UMENG_CHANNEL_VALUE}" />  

第二步 在 build.gradle 设置 ProductFlavors

[java] view plain copy
 print?
  1. android {    
  2.     productFlavors {  
  3.         xiaomi {  
  4.             manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]  
  5.         }  
  6.         _360 {  
  7.             manifestPlaceholders = [UMENG_CHANNEL_VALUE: "_360"]  
  8.         }  
  9.         baidu {  
  10.             manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]  
  11.         }  
  12.         wandoujia {  
  13.             manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]  
  14.         }  
  15.     }    
  16. }  

或者批量修改

[java] view plain copy
 print?
  1. android {    
  2.     productFlavors {  
  3.         xiaomi {}  
  4.         _360 {}  
  5.         baidu {}  
  6.         wandoujia {}  
  7.     }    
  8.   
  9.   
  10.     productFlavors.all {   
  11.         flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]   
  12.     }  
  13. }  

很简单,直接执行 ./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文件配置:

[java] view plain copy
 print?
  1. apply plugin: 'com.android.application'  
  2.   
  3. def releaseTime() {  
  4.     return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))  
  5. }  
  6.   
  7.   
  8. android {  
  9.     compileSdkVersion 21  
  10.     buildToolsVersion '21.1.2'  
  11.   
  12.   
  13.     defaultConfig {  
  14.         applicationId "com.boohee.*"  
  15.         minSdkVersion 14  
  16.         targetSdkVersion 21  
  17.         versionCode 1  
  18.         versionName "1.0"  
  19.           
  20.         // dex突破65535的限制  
  21.         multiDexEnabled true  
  22.         // 默认是umeng的渠道  
  23.         manifestPlaceholders = [UMENG_CHANNEL_VALUE: "umeng"]  
  24.     }  
  25.   
  26.   
  27.     lintOptions {  
  28.         abortOnError false  
  29.     }  
  30.   
  31.   
  32.     signingConfigs {  
  33.         debug {  
  34.             // No debug config  
  35.         }  
  36.   
  37.   
  38.         release {  
  39.             storeFile file("../yourapp.keystore")  
  40.             storePassword "your password"  
  41.             keyAlias "your alias"  
  42.             keyPassword "your password"  
  43.         }  
  44.     }  
  45.   
  46.   
  47.     buildTypes {  
  48.         debug {  
  49.             // 显示Log  
  50.             buildConfigField "boolean""LOG_DEBUG""true"  
  51.   
  52.   
  53.             versionNameSuffix "-debug"  
  54.             minifyEnabled false  
  55.             zipAlignEnabled false  
  56.             shrinkResources false  
  57.             signingConfig signingConfigs.debug  
  58.         }  
  59.   
  60.   
  61.         release {  
  62.             // 不显示Log  
  63.             buildConfigField "boolean""LOG_DEBUG""false"  
  64.   
  65.   
  66.             minifyEnabled true  
  67.             zipAlignEnabled true  
  68.             // 移除无用的resource文件  
  69.             shrinkResources true  
  70.             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'  
  71.             signingConfig signingConfigs.release  
  72.   
  73.   
  74.             applicationVariants.all { variant ->  
  75.                 variant.outputs.each { output ->  
  76.                     def outputFile = output.outputFile  
  77.                     if (outputFile != null && outputFile.name.endsWith('.apk')) {  
  78.                         // 输出apk名称为boohee_v1.0_2015-01-15_wandoujia.apk  
  79.                         def fileName = "boohee_v${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk"  
  80.                         output.outputFile = new File(outputFile.parent, fileName)  
  81.                     }  
  82.                 }  
  83.             }  
  84.         }  
  85.     }  
  86.   
  87.   
  88.     // 友盟多渠道打包  
  89.     productFlavors {  
  90.         wandoujia {}  
  91.         _360 {}  
  92.         baidu {}  
  93.         xiaomi {}  
  94.         tencent {}  
  95.         taobao {}  
  96.         ...  
  97.     }  
  98.   
  99.   
  100.     productFlavors.all { flavor ->  
  101.         flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]  
  102.     }  
  103. }  
  104.   
  105.   
  106. dependencies {  
  107.     compile fileTree(dir: 'libs', include: ['*.jar'])  
  108.     compile 'com.android.support:support-v4:21.0.3'  
  109.     compile 'com.jakewharton:butterknife:6.0.0'  
  110.     ...  
  111. }  


参考:http://stormzhang.com/posts.html

0 0
原创粉丝点击