studio多渠道打包

时间:2022-04-25
本文章向大家介绍studio多渠道打包,主要内容包括友盟多渠道打包、assemble结合Build Variants来创建task、完整的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' 
     ...