在build.gradle設置AndroidManifest.xml里的meta-data數據,以及代碼獲取方式

2017-06-12 遇到的一點小問題
最近應用打包需要不同的渠道,里面有些第三方的key是不一樣的。每次打包前都手動改,很麻煩,又容易出錯。所以網上找了一下,統一把key寫到build.gradle里面。

meta-data

AndroidManifest.xml里寫一個meta-data測試一下。
然后在build.gradle里設置不同渠道的值
設置不同渠道內容.png

在Generate Signed APK時可選取不同的渠道包。
打包時可選渠道

在代碼中測試了一下,沒問題了。

ApplicationInfo appInfo = null;
try {
    appInfo = getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}
if (null != appInfo && appInfo.metaData != null) {
    String appid = appInfo.metaData.getString("WANNOO");
    String appi2d = appInfo.metaData.getString("RRG");
}
獲取META_DATA

這是最簡單的,但實際項目可不止一項meta-data需要填寫,如果只是簡單的復制就可能會出現問題。

Error:Execution failed for task ':app:processHuasDebugManifest'.
 Manifest merger failed with multiple errors, see logs
錯誤寫法
Error:15:43:44.643 [ERROR] [org.gradle.api.Project] D:\rrg\Wannoo\app\src\main\AndroidManifest.xml:316:13-43 Error:
    Attribute meta-data#JPUSH_APPKEY@value at AndroidManifest.xml:316:13-43 requires a placeholder substitution but no value for <JPUSH_VALUE> is provided.
15:43:44.643 [ERROR] [org.gradle.api.Project] D:\rrg\Wannoo\app\src\main\AndroidManifest.xml:324:13-43 Error:
    Attribute meta-data#UMENG_APPKEY@value at AndroidManifest.xml:324:13-43 requires a placeholder substitution but no value for <UMENG_VALUE> is provided.
15:43:44.643 [ERROR] [org.gradle.api.Project] D:\rrg\Wannoo\app\src\main\AndroidManifest.xml:341:13-43 Error:
    Attribute meta-data#QBSDKAppKey@value at AndroidManifest.xml:341:13-43 requires a placeholder substitution but no value for <QBSDK_VALUE> is provided.
15:43:44.643 [ERROR] [org.gradle.api.Project] D:\rrg\Wannoo\app\src\main\AndroidManifest.xml:345:13-43 Error:
    Attribute meta-data#com.baidu.lbsapi.API_KEY@value at AndroidManifest.xml:345:13-43 requires a placeholder substitution but no value for <BAIDU_VALUE> is provided.
15:43:44.651 [ERROR] [org.gradle.api.Project] D:\rrg\Wannoo\app\src\main\AndroidManifest.xml Error:
    Validation failed, exiting
15:43:44.664 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 
15:43:44.664 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] FAILURE: Build failed with an exception.
15:43:44.664 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 
15:43:44.664 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] * What went wrong:
15:43:44.665 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] Execution failed for task ':app:processHuasDebugManifest'.
15:43:44.665 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] > Manifest merger failed with multiple errors, see logs
15:43:44.665 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 
15:43:44.665 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] * Try:
15:43:44.665 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] Run with --stacktrace option to get the stack trace. 

錯誤日志

網上看了下,剛好看到原來是會被覆蓋。
正確寫法

這樣子就沒問題。然后在自己項目試了下,沒想到還是出現了剛才的問題。看了下,只是多了個友盟渠道統計。

productFlavors.all { flavor ->
    flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}

網上看了下,這個和剛才那個其實一個意思,只是將名字作為值批量寫入,省得一直復制黏貼。改為剛才那種套路,就沒問題了。但這明顯開倒車,以后遇到還是沒法解決。所以又
網上看了下,發現原來在defaultConfig里面,忘了也配置一下了。把某個渠道里的內容拷過去,正常了。正好項目里有兩個渠道的內容需要一樣,這下正好省了填寫。

最終確定

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,466評論 25 708
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,981評論 19 139
  • Gradle對于很多開發者來說有一種既熟悉又陌生的感覺,他是離我們那么近,以至于我每天做項目都需要他,但是他又是離...
    阿_希爸閱讀 9,600評論 10 199
  • 這一章主要針對項目中可以用到的一些實用功能來介紹Android Gradle,比如如何隱藏我們的證書文件,降低風險...
    acc8226閱讀 7,694評論 3 25
  • 天空將亮未亮,恐懼的烏黑透出一抹魚肚白,白色那么微弱,似乎將要被吞沒。
    重新活過閱讀 820評論 0 0