使用Gradle構建Android應用的渠道包


原文: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本身不能有自動更新功能,這需要改動代碼,所以就無能爲力了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章