gradle多渠道打包

来源:互联网 发布:linux 获取北京时间 编辑:程序博客网 时间:2024/05/22 03:50

原文链接:http://blog.csdn.net/javazejian/article/details/50760590        

首先我们看一下集成后的AndroidManifest.xml文件:

[html] view plain copy
 print?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="com.zejian.application">  
  4.     <!--友盟渠道的权限-->  
  5.     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>  
  6.     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />  
  7.     <uses-permission android:name="android.permission.INTERNET"></uses-permission>  
  8.     <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>  
  9.     <application  
  10.         android:allowBackup="true"  
  11.         android:icon="@mipmap/ic_launcher"  
  12.         android:label="@string/app_name"  
  13.         android:supportsRtl="true"  
  14.         android:theme="@style/AppTheme">  
  15.         <!--友盟渠道app_key-->  
  16.         <meta-data android:value="56cfb5a3e0f55abed60023fd " android:name="UMENG_APPKEY"></meta-data>  
  17.         <activity  
  18.             android:name=".MainActivity"  
  19.             android:label="@string/app_name"  
  20.             android:theme="@style/AppTheme.NoActionBar">  
  21.             <intent-filter>  
  22.                 <action android:name="android.intent.action.MAIN" />  
  23.                 <category android:name="android.intent.category.LAUNCHER" />  
  24.             </intent-filter>  
  25.         </activity>  
  26.         <!--友盟渠道渠道号-->  
  27.         <meta-data  
  28.             android:name="UMENG_CHANNEL"  
  29.             android:value="${UMENG_CHANNEL_VALUE}" />  
  30.     </application>  
  31. </manifest>  
其他不用看,我们可以先看:

[html] view plain copy
 print?
  1. <!--友盟渠道渠道号-->  
  2. <meta-data  
  3.    android:name="UMENG_CHANNEL"  
  4.    android:value="${UMENG_CHANNEL_VALUE}" />  

${UMENG_CHANNEL_VALUE}这个就是我们要用于多渠道打包的,需要要被替换成渠道名称的占位符字段,现在先知道这点就行,后面我们会说明。

 要配置多渠道打包,我们首先需要一个打包key,这个大家自己提前准备好就行,我这是使用的是我用来测试的key-->debug4zj.jks。然后配置在gradle文件中,如下:


然后在构建类型(buildTypes)中配置我们的要打包的信息:


这些都搞定后,我们就需要来配置渠道了,gradle多渠道打包是通过productFlavors来配置的,如下:

在这里需要说明一下就是productFlavors中配置的每一个flavors都代表着一个渠道的apk信息,如haiwei渠道号就代表着华为渠道的apk。那么这个渠道号又是如何替换的呢?我们可以看到manifestPlaceholders这个字段,其实可以把它理解为一个HashMap的键值对容器,通过这个键值对容器,我们就可以替换AndroidManifest.xml里面的友盟渠道配置信息即前面所说过的${UMENG_CHANNEL_VALUE}占位符字段的值,要注意名称配置一定要跟gadle中的名称一致。这样就完成了多渠道的替换循环工作,当然多渠道打包的工作也就完成了。上面的多渠道打包配置是不是很明朗也很清晰,但却略带麻烦,其实还有下面一种多渠道配置写法,显得相当简洁,不过就是不太明朗罢了,各自选择吧:

到此gradle多渠道打包的配置已经完成,我们打开as的命令行,直接执行./gradlew assembleDebug4zj,然后回车,打包就开始执行了。打包完成log如下:



接下来我们就用友盟渠道来测试一下,看看渠道号是否集成成功,这里我们使用友盟的集成测试功能,因为这个功能是实时的,方便我们观察,至于友盟集成测试功能如何使用,请大家自行参考官方文档哈。集成后我们就来进行测试吧,我使用的测试机以及未测试的数据如下:


我们以360,豌豆荚,百度的apk安装到我们的测试机器上,然后再观察友盟后台的数据,如下:


可以看到数据都实时显示出来了,说明我的多渠道打包apk没问题。到这里本该结束,但我们最后再来唠叨一下一个概念Buid Variants ,这个又是什么呢?我们先来认识一下assemble这个命令,还记得刚才我们打包所用的命令嘛?./gradlew assembleDebug4zj,对于assemble这个命令,它可以结合构建类型(buildTypes)去创建task,如下根据我们的gradle文件的buildTypes类型,我们可以创建两种Task:


assembleDebug4zj这个就是我们刚才打包执行的任务。如果我们执行assembleRelease这个任务的话,as就会根据gradle配置的构建类型去执行相应的操作。除了这个外assemble还可以结合Buid Variants来创建新的Task,而对于Buid Variants则是projectFlavors+buildTypes的结合,举个例子,比如我们想打百度渠道debug4zj版本的包,则可以在命令行输入如下命令:./ gradlew assembleBaiduDebug4zj 这样就会单独打出这个版本的包,其他包都不会有:


至为什么每次都会打出一个未zipaligned的包,我也还没搞清楚原因(知道原因的给我留一下言哈,谢了)。但签名好的包只有百度版本的渠道包,这点肯定是没错的。当然我们也可只打百度版本的而不区分构建类型也就是debug4zj和release版本都打,我们可以这样输入命令: ./gradlew assembleBaidu ,这样就会出现debug4zj和release版本的百度渠道包了。

最后献上完整的grdlew文件:

[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. android {  
  8.     signingConfigs {  
  9.         debug4zj {  
  10.             keyAlias 'debug4zj'  
  11.             keyPassword 'debug4zj'  
  12.             storeFile file('/Users/zejian/Documents/android-studio-workplace/debug4zj.jks')  
  13.             storePassword 'debug4zj'  
  14.         }  
  15.     }  
  16.     compileSdkVersion 23  
  17.     buildToolsVersion "23.0.2"  
  18.     defaultConfig {  
  19.         applicationId "com.zejian.application"  
  20.         minSdkVersion 15  
  21.         targetSdkVersion 23  
  22.         versionCode 1  
  23.         versionName "1.0"  
  24.         // dex突破65535的限制  
  25.         multiDexEnabled true  
  26.     }  
  27.     buildTypes {  
  28.         debug {  
  29.             minifyEnabled false  
  30.             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'  
  31.         }  
  32.         debug4zj {  
  33.             // 不显示Log  
  34.             buildConfigField "boolean""LOG_DEBUG""false"  
  35.             //是否混淆  
  36.             minifyEnabled true  
  37.             //是否进行zipalign优化  
  38.             zipAlignEnabled true  
  39.             // 移除无用的resource文件  
  40.             shrinkResources true  
  41.             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'  
  42.             signingConfig signingConfigs.debug4zj  
  43.   
  44.             applicationVariants.all { variant ->  
  45.                 variant.outputs.each { output ->  
  46.                     def outputFile = output.outputFile  
  47.                     if (outputFile != null && outputFile.name.endsWith('.apk')) {  
  48.                         // 输出apk名称为zejian_v1.0_2015-01-15_wandoujia.apk  
  49.                         def fileName = "zejian_v${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk"  
  50.                         output.outputFile = new File(outputFile.parent, fileName)  
  51.                     }  
  52.                 }  
  53.             }  
  54.         }  
  55.   
  56.     }  
  57.   
  58.     //配置多渠道  
  59.     productFlavors {  
  60.         zejian {  
  61.             manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]  
  62.         }  
  63.         huawei {  
  64.             manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]  
  65.         }  
  66.         _360 {  
  67.             manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]  
  68.         }  
  69.         baidu {  
  70.             manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]  
  71.         }  
  72.         wandoujia {  
  73.             manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]  
  74.         }  
  75.     }  
  76. //  
  77. //    productFlavors {  
  78. //        zejian {}  
  79. //        huawei {}  
  80. //        _360 {}  
  81. //        baidu {}  
  82. //        wandoujia {}  
  83. //    }  
  84. //  
  85. //    productFlavors.all {  
  86. //        flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]  
  87. //    }  
  88.   
  89. }  
  90.   
  91. dependencies {  
  92.     compile fileTree(include: ['*.jar'], dir: 'libs')  
  93.     testCompile 'junit:junit:4.12'  
  94.     compile 'com.android.support:appcompat-v7:23.1.1'  
  95.     compile 'com.android.support:design:23.1.1'  
  96.     compile files('libs/umeng-analytics-v5.6.4.jar')  
  97. }  
原创粉丝点击