標籤:android android studio gradle
之前整合UMeng提供的一些服務時接觸過多渠道打包,UMeng要根據各應用市場渠道號來進行一些統計和分析,比如各渠道的下載數、活躍度、自動更新等等。UMeng提供了一個打包工具(這裡),但官方很久沒有更新了,自己也切換到Android Studio IDE上,Gradle外掛程式可以很好的實現多渠道打包的需求。
多渠道打包的大概思想是(針對UMeng): 動態更改AndroidManifest.xml檔案中的一個屬性值(渠道號),從而來標識不同的渠道。
Gradle的Product flavors特性(這裡)可以很方便的實現功能,簡單的說下實現方式:不同的flavor指定不同渠道的AndroidManifest.xml檔案。這種方式有很大的弊端,重複性工作太多了,只為了更改其中的一個屬性而要維護太多的AndroidManifest.xml檔案。可喜的是Android Studio 1.0 提供了更強大的Manifest Merger(這裡)功能,其中的Placehodler Support(這裡)特性可以大大的簡化上面的做法,不需要再維護這麼多的AndroidManifest.xml檔案了!但把所有的渠道都配置在build.gradle檔案中畢竟不好維護(應用市場多達幾十個),下面主要介紹通過程式的方式來讀取設定檔,產生不同的渠道包。
通過程式的方式也要藉助於Placehodler Support特性,所以Android Studio請升級到1.0以上。
具體的思路是通過讀取設定檔中的渠道號來動態產生build type。具體的代碼如下:
// 多渠道打包def channels() { if (project.hasProperty("channel")) { // 渠道號設定檔路徑 def path = "./build-types/channels.txt" file(path).eachLine { line -> if(!line.startsWith("//")){ //剔除注釋行 android.buildTypes.create(line, { manifestPlaceholders = [ channel:line ] }) } } }}
AndroidManifest.xml檔案更改如下:
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.tubb.cityindex" > <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.tubb.cityindex.CitySelectorActivity" android:label="@string/app_name" > <intent-filter><meta-data android:name="UMENG_CHANNEL" android:value="${channel}"/> </application></manifest>
最後只需要在工程app目錄下現在build-types檔案夾添加channels設定檔
// 百度應用市場baidu// 360應用市場m360
測試代碼託管在(這裡),歡迎大夥來討論~~
Android Studio Gradle 多渠道打包