一、簡介
因爲國內Android應用分發市場的現狀,我們在發佈APP時,一般需要生成多個渠道包,上傳到不同的應用市場。這些渠道包需要包含不同的渠道信息,在APP和後臺交互或者數據上報時,會帶上各自的渠道信息。這樣,我們就能統計到每個分發市場的下載數、用戶數等關鍵數據。
二、Gradle多渠道打包
1、普通做法
通常情況下的做法是在 AndroidManifest
中增加渠道號:
<meta-data android:name="SDK_CHANNEL" android:value="Channel ID" />
如需更改則手動設置,然後再次打包。如此一來,重複的工作量大大增加。於是就有了AndroidStudio上的多渠道打包。
2、Gradle多渠道打包
對於這種情況,Android Gradle提供了非常便捷的方法讓我們來替換AndroidManifest文件中的內容,他就是 manifestPlaceholder
、Manifest
佔位符。
ManifestPlaceholders
是 ProductFlavor
的一個屬性,是一個Map類型,所以我們可以同時配置很多個佔位符。下面我們就通過這個配置渠道號的例子來演示manifestPlaceholders的用法。
在 build.gradle
中的 android
標籤內增加如下代碼:
android {
...
productFlavors{
google{
manifestPlaceholders = [
SDKChannel: "google",
app_name : "@string/app_name",
]
}
baidu{
manifestPlaceholders = [
SDKChannel: "baidu",
app_name : "@string/app_name",
]
}
}
}
在 AndroidManifest.xml
文件中代碼如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.sdk">
<application ...
android:label="${app_name}">
<meta-data
android:name="SDKChannel"
android:value="${SDKChannel}" />
...
</application>
</manifest>
接下來我們就來看看打包效果了。
如果,一個App的渠道號很多的話,我們總不能一個個配置吧,太多也太累,維護也麻煩,我們還可以通過迭代productFlavors批量的方式進行修改。
android {
...
productFlavors{
google{
}
baidu{
}
}
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [SDKChannel: name, app_name : "@string/app_name"]
}
}
我們通過all函數遍歷每一個ProductFlavor,然後把它們的name作爲渠道名,非常方便。這裏不止可以做這一個事情,在遍歷ProductFlavor的時候,你可以做很多你想做的事情,這就是Gradle的靈活之處,把腳本當程序寫。
Android Gradle提供的manifestPlaceholders佔位符的應用方式,讓我們可以替換AndroidManifest文件中任何${Var}格式的佔位符。所以他的使用場景不限於渠道名這一個,比如還有ContentProvider的auth的授權,或者其他動態配置meta信息等。靈活運用它能幫助我們做很多事情,讓我們的構建更靈活,更方便。