[英]How to use the new manifest merger (of Android Studio and Gradle)?
過去,當 Eclipse&ADT 是為 Android 開發的官方工具時,您只需在應用程序項目的“ project.properties ”中使用“ manifestmerger.enabled=true ”,它就會自動合並所有庫的清單(我已經在這里發布了它)。
這有時奏效。 它有很多奇怪的問題,我總是寧願避免使用它,而是手動將所需的內容放入主清單文件中。
2014 年的某個時候,Google 宣布新的 Android-Studio(我認為是 0.1)與 Gradle 一起將允許您准確選擇如何執行庫組件的合並。
然而,新的說明(鏈接在這里)非常復雜,我真的(真的)試圖了解如何使用它們,也沒有找到如何使用它們的示例。
不是我什么都不懂,但我不確定我是否理解得很好。
從好的方面來說,我發現合並是完全自動完成的,所以如果您在庫的清單上有一個 BroadcastReceiver(當然,作為一個類),它將被添加到使用它的應用程序項目中。
我不能簡單地要求解釋一切。 我認為問這些問題就足夠了:
如何選擇要忽略的應用程序組件(權限、活動等),以免自動合並?
如何指向覆蓋應用程序組件(庫的)屬性(在應用程序的項目上)? 比如活動的主題?
有沒有辦法完全禁用清單文件的自動合並?
存儲庫內的依賴項清單會發生什么? 他們也合並了嗎?
是否有關於這個新(對我來說是新的)功能的教程/示例/視頻?
使用自動合並時有什么我應該注意的事情嗎?
我希望這些問題具有足夠的代表性、足夠的信息,但對於知道的人來說,回答起來並不難。
您始終可以在應用清單中明確禁用權限和功能,並覆蓋任何庫值。 我發現您可以禁用 library 中的元素。
例子
考慮上面鏈接中的以下代碼:
<activity-alias android:name="foo.bar.alias">
<meta-data
android:name="zoo"
tools:node="remove" />
</activity-alias>
通過讓您的清單里面這個代碼可以確保合並發現任何<activity-alias>
的元素android:name="foo.bar.alias"
屬性,並刪除一個<meta-data>
元素,如果有android:name="zoo"
屬性。 它只刪除“動物園”元數據。 不是活動別名。 如果您在主清單中指定它,它將對迄今為止已合並的任何內容(庫中的元素)有效。
示例#2
由於您要求提供活動示例,這就是我想出的:
<activity android:name="com.example.ui.MyActivity" tools:node="remove" />
此行將使合並刪除迄今為止已合並的具有android:name="com.example.ui.MyActivity"
屬性的任何活動。 因此,如果您在主清單中指定它,它將有效地刪除任何可能已從庫中合並的com.example.ui.MyActivity
條目。
此處描述了合並值的順序。 基本上,它是這樣的:庫,然后是主清單,然后是風味和構建類型清單,如果你使用它們的話。
什么是構建類型?
默認為“調試”和“發布”。 您可以定義自己的和覆蓋設置,如簽名或proguard 。 出於您的目的,您可以說它相當於運行配置。
它是這樣工作的:您將默認值和共享值放在main
清單中。 然后在風味清單中覆蓋您需要的值。 谷歌“gradle flavors”了解更多信息。
以下示例取自先前版本的清單合並文檔。
覆蓋來自庫的屬性
使用 tools:replace="x, y, z" 將覆蓋來自導入庫的活動 XML 聲明的 x,y,z 屬性。
更高優先權聲明
<activity android:name="com.foo.bar.ActivityOne" android:screenOrientation="portrait" android:theme="@theme1" tools:replace="theme"/>
具有較低優先級聲明:
<activity android:name="com.foo.bar.ActivityOne" android:theme="@olddogtheme" android:windowSoftInputMode="stateUnchanged" android:exported="true">
將導致:
<activity android:name="com.foo.bar.ActivityOne" android:screenOrientation="portrait" android:theme="@theme1" android:windowSoftInputMode="stateUnchanged" android:exported="true"/>
請參閱在 Android Gradle Build 中禁用清單合並。
android.applicationVariants.all { variant ->
variant.processResources.manifestFile = file('src/main/AndroidManifest.xml')
variant.processManifest.enabled=false
}
你把這個放在什么文件里?
在您的模塊(不是根項目) build.gradle
。
是的,它們是(它們是圖書館)。
有沒有辦法阻止合並某些庫清單?
不是我所知道的,抱歉。
取決於你想達到什么目的。 到目前為止,它對我來說總是開箱即用的。
我不知道任何視頻。
如果您對額外權限等感到懷疑,您可以檢查生成的清單。它位於project/module/build/intermediates/manifests/full/[flavor]/build-type/AndroidManifest.xml
。
來源: https : //developer.android.com/studio/build/manifest-merge
此線程中的某些鏈接已過時。 這是與 Android AAR 的 gradle 自動合並清單相關的主要更新。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.