開發中很多時候我們會遇到這種場景,比如說:在用到一個第三方sdk,但是這個sdk并沒有區分開發環境和線上環境,這時候我們就可能會申請兩個不同的key標識,而且很多key標識都只能在androidmanifest里面配置。所以每次上線生成apk就必須手動去更改key標識,如果渠道版本少也還好,打包速度快也還行,需要區分環境的的key標識相對較少也還不錯 ,但是如果你一項都沾不到邊,到時忘記哪個key忘記替換了,一定會有種“身體被掏空的趕腳”,別問我為什么知道,感覺身體被掏空?。?!
先在androidmanifest文件配置一個節點,這里以極光為例
<meta-data
android:name="JPUSH_APPKEY"
android:value="${jpush_appkey}"/>
再看看build.gradle里面怎么寫
這里寫圖片描述
在bulidtypes節點下有release節點和debug節點,正式簽名時就會走release節點的下編譯腳本,調試簽名時就會走debug節點。 本文主要點就是紅框標記的manifestPlaceholders的用法,jpush_appkey對應的就是之前在androidmanifest文件配置的${jpush_appkey}的這個值。
點進源碼我們可以發現manifestPlaceholders接收是一個Map的參數,所以這樣其實還有很多可以自定義的地方。這里寫圖片描述
比如說在多渠道打包我們也用到了manifestPlaceholders,androidstudio多渠道打包方式網上教程已經很多了, 這里就不多說了,具體內容可以google或者bing,百度就不推薦,以免被坑,嘿嘿嘿。
這里寫圖片描述
我們在程序入口出打上log,用來輸出key的值
String jpush_appkey;
try {
ApplicationInfo appInfo = getPackageManager() .getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
jpush_appkey = appInfo.metaData.getString("JPUSH_APPKEY");
Logger.d("jpush_appkey=" + jpush_appkey);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
正式環境的key值
這里寫圖片描述
測試環境的key值
這里寫圖片描述
可以看到這個和之前我們在build.gradle只配置的一樣的。
總結
manifestPlaceholders 可以替換androidmanifest文件中的標簽,可作為快速渠道打包替換渠道名的一種方式,也可以自定義標簽用來替換需要的文本,多作為不同環境不同key的修改。