關于Gradle多渠道打包的問題
剛開始用ant的打包方式,后來換了Android-studio開發(fā)之后,就換做gradle多渠道打包,一時間確實方便了很多,配置非常簡單,打包時間跟電腦配置有很大的關系。因為一直用的是友盟統(tǒng)計,下面簡單記錄下大致的流程。
之前打包的代碼是這樣的,因為需要在調用接口的時候傳渠道號
<application>
......
<meta-data
android:name="UMENG_CHANNEL"
android:value="@string/channel_id" />
......
</application>
我們知道友盟的官網(wǎng)文檔建議我們在清單文件中設置name="UMENG_CHANNEL"如下的meta-data標簽
<application>
......
<meta-data
android:name="UMENG_CHANNEL"
android:value="${CHANNEL_VALUE}" />
......
</application>
然后我們在module中的build.gradle文件中可以設置productFlavors ,如圖
android {
......
productFlavors {
anzhi{
manifestPlaceholders = [UMENG_CHANNEL: "anzhi"]
}
baidu {
manifestPlaceholders = [UMENG_CHANNEL: "baidu"]
}
wandoujia {
manifestPlaceholders = [UMENG_CHANNEL: "wandoujia"]
}
}
......
}
假如你要打很多的渠道包的情況,是不是要寫很多?現(xiàn)在我們可以用下面的快速設置
productFlavors {
anzhi{}
baidu {}
wandoujia {}
}
這時候也需要加上下面這句話,意思就是包含了上面所有的渠道。
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [CHANNEL_VALUE: name]
}
這樣我們就可以直接打包了,當然gradle打包只是將清單文件中的UMENG_CHANNEL的值更改為我們所寫的渠道號,與我們之前打包的方式不同的是String里面的值并沒有改,那么假如業(yè)務需求要在用戶注冊和充值的時候傳渠道號,怎么辦呢?給大家介紹一個常用的方法。
ApplicationInfo appInfo = null;
try {
appInfo = this.getPackageManager()
.getApplicationInfo(getPackageName(),
PackageManager.GET_META_DATA);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
String msg = appInfo.metaData.getString("UMENG_CHANNEL");
通過這個方法可以得到清單文件中的UMENG_CHANNEL的Values,這樣的話我們的業(yè)務就可以完整實現(xiàn)了。