原文:http://www.cnblogs.com/shanpow/p/4097320.html?utm_source=tuicool
所有做Android App的同志們應該都知道渠道包是什麼,得力於Android生態的多樣性,我等寫Android應用的人類每次發佈App都需要面對數十個市場,而爲了能夠採集到市場的表現數據,就必須爲每一個市場生成相應的apk包,也就是俗稱的渠道包。
如此這般,如何更加便捷的生成渠道包就成了各顯神通的地方。
友盟、酷傳等第三方都有自動化工具來做,同行們也各自寫了很多腳本,但我覺得似乎沒必要那麼複雜。Gradle本身就是一個構建工具,用它應該就能做到。一番研究之後發現果然是可以的,做出來效果也還算不錯,再次跟大家分享一下。
先說一下我的構建環境:
- Android Studio 0.9.1
- Gradle 0.14.1
基本原理是利用Gradle的 manifest merger 功能,這個功能的主要用途是能夠在運行時替換AndroidManifest.xml裏面的內容,具體功能大家自行查看文檔吧,這裏就不贅述了。
我用的是友盟的統計,所以現在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文件的defaultConfig里加上PlaceHolder定義
android {
...
defaultConfig {
...
manifestPlaceholders = [ UMENG_CHANNEL_VALUE:"default_channel" ]
}
}
這裏的作用有兩個,一是聲明UMENG_CHANNEL_VALUE
是可替換值的PlaceHolder,二是爲其設置默認值。
第三步 在模塊的build.gradle文件裏添加ProductFlavors配置
android {
...
defaultConfig {
...
manifestPlaceholders = [ UMENG_CHANNEL_VALUE:"default_channel" ]
}
productFlavors {
default_channel{}
wandoujia{}
_360{}
yingyongbao{}
xiaomi{}
baidu{}
huawei{}
jifeng{}
}
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [ UMENG_CHANNEL_VALUE:name ]
}
}
所謂ProductFlavors其實就是可定義的產品特性,配合manifest
merger
使用的時候就可以達成在一次編譯過程中產生多個具有自己特性配置的版本。
上面這個配置的作用就是,爲每個渠道包產生不同的UMENG_CHANNEL_VALUE
的值。
第四步 一次生成所有渠道包
到工程目錄下運行gradlew
assembleRelease
試試看吧。應該能看到這次編譯一共產生了8個apk,分別對應在productFlavors段定義的8個渠道。
可以用apktools
反編譯每個apk,打開AndroidManifest.xml
看看,就會發現友盟這一段的配置已經相應的被修改了。
<meta-data
android:name="UMENG_CHANNEL"
android:value="default_channel" />
如果只是想生成單個渠道的包呢?
打開AndroidStudio的Gradle tasks面板,會發現模塊多了很多任務,如下圖所示。
此時可以直接雙擊該任務生成對應的apk,也可以用命令行單獨生成,比如
gradlew assembleWandoujiaRelease
好了,到此任務就完成了。當然,這個方式也是有缺陷的,有一些特定的渠道包不是僅僅修改AndroidManifest.xml
就可以的,比如小米就要求app本身不能有自動更新功能,這需要改動代碼,所以就無能爲力了。