(轉載)Android多渠道打包沒你想的那麼複雜

Android多渠道打包沒你想的那麼複雜

96  
Aimerd 
2016.06.22 15:55* 字數 1084 閱讀 7649評論 26

今天運營同事給我發了15個應用平臺對應的apk名。我第一反應就是給你個apk本身更名不就完了...因而心中一萬個草泥馬奔騰而過。javascript

 

轉念一想,這事兒可能不是那麼簡單,只怪我圖樣圖森破。因而想到了以前看到過多渠道打包,那麼就引出了第一個問題:php

1、什麼是多渠道

我理解的是:APP發佈到不一樣的應用平臺,監測用戶是從哪一個平臺安裝的。java

2、爲何要多渠道打包

1. 統計用戶安裝APP來源
知道多渠道的意義就不難理解多渠道打包主要是爲了咱們統計分析用的。因此,這樣就很清楚了我最初的想法不是不行,而是很差,對從此的產品分析沒有任何幫助。android

2.批量修改生成的apk文件名
根據運營給的命名規則,若是是一個個的右鍵-重命名,那15個還好,要真是有1000個,運營同事必定會拿刀找個人...而多渠道打包全部的都自動生成。web

3.可更改包名
若是有生成不一樣包名的需求,經過gradle就能夠解決。bash

4.生成不一樣應用名稱或圖標
有的時候你會在不一樣平臺看到XX-小米版,XX-魅族版等等,或者beta版的圖標和正式的不同,其實代碼仍是那個代碼,無非作點小小的改動,具體實現咱們後面會說。閉包

這是我所瞭解到的,可能還有不少我不知道的用途,歡迎你們在下面留言。app

3、如何多渠道打包

多渠道打包網上大概有兩種,一個是經過gradle,另外一個是美團介紹的只打一個包,而後解壓替換文件,二者比較美團的方法要更快,可是今天咱們先不作介紹,若是想了解請看《Android多渠道打包飛通常的感受》。。ide

1. 在AndroidManifest.xml中添加佔位符
通常都是像友盟,騰訊統計分析SDK中使用的方案,網上友盟的較多,我實際用的是騰訊分析因此就拿騰訊的來講(其實都同樣)。
首先,在AndroidManifest.xmlapplication標籤裏添加一個meta-data標籤訂義MTA_CHANNEL佔位符,騰訊分析SDK會讀取裏面的value值傳到後臺,便於咱們往後分析。gradle

<meta-data
            android:name="MTA_CHANNEL" android:value="${MTA_CHANNEL_VALUE}" /> 

2. 修改app下的build.gradle文件,在android閉包中添加productFlavors屬性配置佔位符

apply plugin: 'com.android.application' android { compileSdkVersion 21 buildToolsVersion "21.1.2" defaultConfig { applicationId "com.aimerd.channel" minSdkVersion 11 targetSdkVersion 21 versionCode 1 versionName "1.0.0" multiDexEnabled true } buildTypes { release { // 不顯示Log buildConfigField "boolean", "LOG_DEBUG", "false" //啓用混淆代碼的功能 minifyEnabled true //壓縮對齊生成的apk包 zipAlignEnabled true //指定混淆規則,須要壓縮優化的混淆要把proguard-android.txt換成proguard-android.txt proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' //移除無用的資源文件 shrinkResources true //啓用multidex的支持 multiDexEnabled true } } productFlavors baidu { manifestPlaceholders = [MTA_CHANNEL_VALUE: "baidu"] } _91 { manifestPlaceholders = [MTA_CHANNEL_VALUE: "91"] } wandoujia { manifestPlaceholders = [MTA_CHANNEL_VALUE: "wandoujia"] } xiaomi { manifestPlaceholders = [MTA_CHANNEL_VALUE: "xiaomi"] } } applicationVariants.all { variant -> variant.outputs.each { output -> def outputFile = output.outputFile if (variant.buildType.name.equals('release')) { //生成apk名字的格式:Channel1.0.0_2016-06-22_baidu.apk //可自定義本身想要生成的格式 def fileName = "Channel${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk" output.outputFile = new File(outputFile.parent, fileName) } } } def releaseTime() { return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC")) } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:21.0.3' compile 'com.android.support:multidex:1.0.1' } 

若是以爲productFlavors重複代碼太多,還能夠這樣寫:

productFlavors {
    baidu {}
    _91 {}        
    wandoujia {}
    xiaomi {}
}
//批量處理 productFlavors.all { flavor -> flavor.manifestPlaceholders = [MTA_CHANNEL_VALUE: name] } 

注意:像91和360這種數字的是不能夠的,我試過"91"雖然能夠編譯經過,但打包的時候會報錯

Error:Execution failed for task ':app:transformClassesWithRetrolambdaFor91Release'. > java.lang.NullPointerException (no error message) 

具體緣由我不清楚,還請知道緣由或者知道解決方法的告訴我一下,謝謝!

3. 打包

  • build->Generate Signed APK...
    這個沒什麼好說的,很簡單
  • AS的Terminal輸入:gradle build
    可一次性打包全部渠道,若是想打某個渠道的包,先輸入:gradle tasks
 
gradle tasks信息

找到想要打包的渠道,例如紅框標出的豌豆莢,在終端輸入:gradle assembleWandoujia,就會單獨打包豌豆莢的包了。

注意:有的輸入命令會提示'gradle'不是內部或外部命令,也不是可運行的程序或批處理文件。說明沒有配置gradle的環境變量,配置成功重啓便可。

4.如何更改包名
剛纔提到能夠根據不一樣業務需求,須要更改包名,在productFlavors中指定不一樣的applicationId便可

productFlavors {
    baidu {
        applicationId="com.aimerd.channel" manifestPlaceholders = [MTA_CHANNEL_VALUE:"baidu"] } } 

5.如何生成不一樣應用名稱或圖標
咱們以baidu爲例,在app模塊,src目錄下,新建一個與main目錄同級的baidu目錄(這裏的名字跟productFlavors中定義的渠道名要一致):

 
baidu目錄結構

valuesstrings.xml中的 "app_name"改爲本身想要的應用名稱。

 

<resources> <string name="app_name">哈哈哈-小米版</string> </resources> 

若是須要換圖標,只需更換ic_launcher.png文件便可。

 

原文地址:https://www.jianshu.com/p/a9ccdf67ca6c

相關文章
相關標籤/搜索