簡體   English   中英

如何使用新的清單合並(Android Studio 和 Gradle)?

[英]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(當然,作為一個類),它將被添加到使用它的應用程序項目中。

問題

我不能簡單地要求解釋一切。 我認為問這些問題就足夠了:

  1. 如何選擇要忽略的應用程序組件(權限、活動等),以免自動合並?

  2. 如何指向覆蓋應用程序組件(庫的)屬性(在應用程序的項目上)? 比如活動的主題?

  3. 有沒有辦法完全禁用清單文件的自動合並?

  4. 存儲庫內的依賴項清單會發生什么? 他們也合並了嗎?

  5. 是否有關於這個新(對我來說是新的)功能的教程/示例/視頻?

  6. 使用自動合並時有什么我應該注意的事情嗎?

我希望這些問題具有足夠的代表性、足夠的信息,但對於知道的人來說,回答起來並不難。

1.禁用元素

您始終可以在應用清單中明確禁用權限和功能,並覆蓋任何庫值。 我發現您可以禁用 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條目。

2. 覆蓋庫中的屬性

此處描述合並值的順序。 基本上,它是這樣的:庫,然后是主清單,然后是風味和構建類型清單,如果你使用它們的話。

什么是構建類型?

默認為“調試”和“發布”。 您可以定義自己的和覆蓋設置,如簽名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"/>

3. 完全禁用清單合並

請參閱在 Android Gradle Build 中禁用清單合並

android.applicationVariants.all { variant ->
    variant.processResources.manifestFile = file('src/main/AndroidManifest.xml')
    variant.processManifest.enabled=false
}

你把這個放在什么文件里?

在您的模塊(不是根項目) build.gradle

4. 是否合並了依賴項的清單?

是的,它們是(它們是圖書館)。

有沒有辦法阻止合並某些庫清單?

不是我所知道的,抱歉。

5. 有教程嗎?

取決於你想達到什么目的。 到目前為止,它對我來說總是開箱即用的。

我不知道任何視頻。

6. 有什么需要注意的嗎?

如果您對額外權限等感到懷疑,您可以檢查生成的清單。它位於project/module/build/intermediates/manifests/full/[flavor]/build-type/AndroidManifest.xml

來源: https : //developer.android.com/studio/build/manifest-merge

此線程中的某些鏈接已過時。 這是與 Android AAR 的 gradle 自動合並清單相關的主要更新。

https://developer.android.com/studio/build/manifest-merge

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM