『譯』Android Studio 合并多個(gè) Manifest

轉(zhuǎn)載請(qǐng)注明原文地址:http://www.reibang.com/p/e501e2bcf315

引子


在引入第三方庫時(shí)讼育,經(jīng)常會(huì)出現(xiàn)下面兩個(gè)編譯錯(cuò)誤:

  • com.android.builder.packaging.DuplicateFileException
  • Manifest merger failed with multiple errors

其中,DuplicateFileException 通過查看第三方庫,依賴的額外庫固额,然后使用 exclude 語句即可解決,具體語法如下圖:

圖- 1. exclude 官方文檔.png

而 "Manifest merger failed" ,就是本文主要闡述的問題 —— 合并多個(gè)清單文件

概述


APK 文件只能包含一個(gè)AndroidManifest.xml 文件,但 Android Studio 項(xiàng)目可以包含多個(gè)文件(通過主源集妖滔、構(gòu)建變體和導(dǎo)入的庫提供)。因此桶良,在構(gòu)建應(yīng)用時(shí)座舍,Gradle 構(gòu)建會(huì)將所有清單文件合并到一個(gè)封裝到 APK 的清單文件中。

清單合并工具通過遵循某些合并啟發(fā)式算法陨帆,并遵守您通過特殊XML 屬性定義的合并首選項(xiàng)曲秉,來合并各個(gè)文件中的所有 XML 元素。 本頁介紹清單合并的工作方式以及如何應(yīng)用合并首選項(xiàng)來解決合并沖突疲牵。

提示: 使用 Merged Manifest 視圖預(yù)覽合并清單的效果并找出沖突錯(cuò)誤承二。


圖- 2. Merged Manifest 視圖.png

合并優(yōu)先級(jí)


合并工具根據(jù)每個(gè)清單文件的優(yōu)先級(jí)將所有清單文件按順序合并到一個(gè)文件中。 例如瑰步,如果您有 3 個(gè)清單文件矢洲,則會(huì)先將優(yōu)先級(jí)最低的清單合并到優(yōu)先級(jí)第 2 高的清單中璧眠,然后再將合并后的清單合并到優(yōu)先級(jí)最高的清單中缩焦,如下圖所示:

圖- 3. 合并 3 個(gè)清單文件示例.png

有 3 種基本的清單文件可以互相合并,它們的合并優(yōu)先級(jí)如下(按優(yōu)先級(jí)由高到低的順序):

  1. 清單文件構(gòu)建變體
    如果您的變體有多個(gè)源集责静,則其清單優(yōu)先級(jí)如下:
    a. 構(gòu)建變體清單(如 src/demoDebug/)
    b. 構(gòu)建類型清單(如 src/debug/)
    c. 產(chǎn)品定制清單(如 src/demo/)
    如果您使用的是定制維度袁滥,清單優(yōu)先級(jí)將與每個(gè)維度在flavorDimensions屬性中的列示順序(按優(yōu)先級(jí)由高到低的順序排列)對(duì)應(yīng)。
  2. 應(yīng)用模塊的主清單文件
  3. 所包括庫中的清單文件

如果您有多個(gè)庫灾螃,則其清單優(yōu)先級(jí)與依賴順序(庫出現(xiàn)在Gradledependencies 塊中的順序)匹配题翻。

例如,庫清單合并至主清單腰鬼,然后主清單合并至構(gòu)建變體清單嵌赠。

注:這些是對(duì)所有源集都相同的合并優(yōu)先級(jí),如使用源集構(gòu)建 中所述熄赡。

重要說明:build.gradle 文件中的構(gòu)建配置將替換合并清單文件中的任何對(duì)應(yīng)屬性姜挺。 例如,build.gradle 文件中的minSdkVersion將替換 清單元素中的匹配屬性彼硫。 為了避免混淆炊豪,您只需省去 元素并在build.gradle 文件中定義這些屬性凌箕。 For moredetails, see Configure Your Build.

合并沖突啟發(fā)式算法


合并工具可以在邏輯上將一個(gè)清單中的每個(gè) XML 元素與另一個(gè)清單中的對(duì)應(yīng)元素相匹配。 (有關(guān)匹配如何進(jìn)行的詳細(xì)信息词渤,請(qǐng)參閱有關(guān)合并策略的附錄)牵舱。

如果優(yōu)先級(jí)較低的清單中的元素與優(yōu)先級(jí)較高的清單中的任何元素均不匹配,則該元素將被添加至合并清單缺虐。 但是芜壁,如果有匹配元素,則合并工具會(huì)嘗試將其中的所有屬性合并到相同元素中高氮。如果工具發(fā)現(xiàn)兩個(gè)清單包含相同屬性沿盅,但值不相同,則會(huì)出現(xiàn)合并沖突纫溃。

如圖- 4 即為描述合并工具嘗試將所有屬性合并到同一元素時(shí)可能出現(xiàn)的結(jié)果:


圖- 4 屬性值的默認(rèn)合并行為.png

但是腰涧,在某些情況下,合并工具會(huì)采取其他行為方式以避免合并沖突:

  • <manifest> 元素中的屬性絕不合并—僅使用優(yōu)先級(jí)最高的清單中的屬性紊浩。
  • android:required 屬性 ><uses-feature> and <uses-library> 元素使用 OR 合并窖铡,因此如果出現(xiàn)沖突,系統(tǒng)將應(yīng)用 "true" 并始終包括某個(gè)清單所需的功能或庫坊谁。
  • <uses-sdk> 元素始終使用優(yōu)先級(jí)較高的清單中的值费彼,但以下情況除外:
    • 如果低優(yōu)先級(jí)清單的 minSdkVersion較高,除非您應(yīng)用 overrideLibrary 合并規(guī)則口芍。
    • 如果低優(yōu)先級(jí)清單的 targetSdkVersion較低箍铲,合并工具將使用高優(yōu)先級(jí)清單中的值,但也會(huì)添加任何必要的系統(tǒng)權(quán)限鬓椭,以確保所導(dǎo)入的庫繼續(xù)正常工作(適用于較高的 Android 版本具有更多權(quán)限限制的情況)颠猴。 如需了解有關(guān)此行為的詳細(xì)信息,請(qǐng)參閱有關(guān)隱式系統(tǒng)權(quán)限的部分小染。
  • 絕不會(huì)在清單之間匹配 <intent-filter> 元素翘瓮。 每個(gè)元素都被視為唯一元素,并添加至合并清單中的常用父元素裤翩。

對(duì)于屬性之間的所有其他沖突资盅,您將收到一則錯(cuò)誤,并且必須通過在高優(yōu)先級(jí)清單文件中添加特殊屬性來指示合并工具如何解決此錯(cuò)誤(請(qǐng)參閱下一節(jié)踊赠,其中介紹了有關(guān)合并規(guī)則標(biāo)記的內(nèi)容)呵扛。

不依賴于默認(rèn)屬性值。由于所有唯一屬性都合并到相同元素中筐带,如果高優(yōu)先級(jí)清單實(shí)際上依賴于屬性的默認(rèn)值而不需要聲明今穿,則可能會(huì)導(dǎo)致意外結(jié)果。例如烫堤,如果高優(yōu)先級(jí)清單聲明android:launchMode 屬性荣赶,則會(huì)使用 "standard" 的默認(rèn)值凤价;但如果低優(yōu)先級(jí)清單聲明此屬性具有其他值,該值將應(yīng)用于合并清單(替代默認(rèn)值)拔创。因此利诺,您應(yīng)該按期望明確定義每個(gè)屬性。(每個(gè)屬性的默認(rèn)值都會(huì)記錄在 Manifest reference 中)剩燥。

合并規(guī)則標(biāo)記


合并規(guī)則標(biāo)記是一個(gè) XML 屬性慢逾,可用于表達(dá)您對(duì)關(guān)于如何解決合并沖突或刪除不需要的元素和屬性的首選項(xiàng)。 您可以對(duì)整個(gè)元素或只對(duì)元素中的特定屬性應(yīng)用標(biāo)記灭红。

合并兩個(gè)清單文件時(shí)侣滩,合并工具會(huì)在高優(yōu)先級(jí)清單文件中尋找這些標(biāo)記。

所有標(biāo)記均屬于 Android tools 命名空間变擒,因此您必須先在 <manifest> 元素中聲明此命名空間君珠,如下文所示:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp"
    xmlns:tools="http://schemas.android.com/tools">

節(jié)點(diǎn)標(biāo)記

要向整個(gè) XML 元素(給定清單元素中的所有元素及其所有子標(biāo)記)應(yīng)用合并規(guī)則,請(qǐng)使用以下屬性:

1娇斑、tools:node="merge"

如果使用合并沖突啟發(fā)式算法時(shí)沒有沖突策添,則合并此標(biāo)記中的所有屬性以及所有嵌套元素。這是元素的默認(rèn)行為毫缆。

譯者注:也就是唯竹,當(dāng)使用合并沖突啟發(fā)式算法出現(xiàn)沖突,就會(huì)出現(xiàn)文章引文中提到的 "Manifest merger failed with multiple errors"

低優(yōu)先級(jí)清單:
<activity android:name=”com.example.ActivityOne”
android:windowSoftInputMode=”stateUnchanged”>
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>

高優(yōu)先級(jí)清單:
<activity android:name=”com.example.ActivityOne”
android:screenOrientation=”portrait”
tools:node="merge”>
</activity>

合并的清單結(jié)果:

<activity android:name=”com.example.ActivityOne”
    android:screenOrientation=”portrait”
    android:windowSoftInputMode=”stateUnchanged”>
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

2苦丁、tools:node="merge-only-attributes"

僅合并此標(biāo)記中的屬性浸颓,不合并嵌套元素。

低優(yōu)先級(jí)清單:
<activity android:name=”com.example.ActivityOne”
android:windowSoftInputMode=”stateUnchanged”>
<intent-filter>
<action android:name="android.intent.action.SEND" />
<data android:type="image/*" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>

高優(yōu)先級(jí)清單:
<activity android:name=”com.example.ActivityOne”
android:screenOrientation=”portrait”
tools:node="merge-only-attributes”>
</activity>

合并的清單結(jié)果:

<activity android:name=”com.example.ActivityOne”
    android:screenOrientation=”portrait”
    android:windowSoftInputMode=”stateUnchanged”>
</activity>

3旺拉、tools:node="remove"

從合并清單中刪除此元素产上。 盡管您似乎應(yīng)該僅刪除此元素,但如果您發(fā)現(xiàn)合并清單中有不需要的元素账阻,則必須使用此選項(xiàng)蒂秘。該選項(xiàng)由不受您控制的低優(yōu)先級(jí)清單(如導(dǎo)入的庫)提供泽本。

低優(yōu)先級(jí)清單:
<activity-alias android:name=”com.example.alias”>
<meta-data android:name=”cow”
android:value=”@string/moo”/>
<meta-data android:name=”duck”
android:value=”@string/quack”/>
</activity-alias>

高優(yōu)先級(jí)清單:
<activity-alias android:name=”com.example.alias”>
<meta-data android:name=”cow”
tools:node=”remove”/>
</activity-alias>

合并的清單結(jié)果:

<activity-alias android:name=”com.example.alias”>
  <meta-data android:name=”duck”
      android:value=”@string/quack”/>
</activity-alias>

4淘太、tools:node="removeAll"

與 tools:node="remove" 類似,但它會(huì)刪除與此元素類型相匹配的所有元素(同一父元素內(nèi))

低優(yōu)先級(jí)清單:
<activity-alias android:name=”com.example.alias”>
<meta-data android:name=”cow”
android:value=”@string/moo”/>
<meta-data android:name=”duck”
android:value=”@string/quack”/>
</activity-alias>

高優(yōu)先級(jí)清單:
<activity-alias android:name=”com.example.alias”>
<meta-data tools:node=”removeAll”/>
</activity-alias>

合并的清單結(jié)果:

<activity-alias android:name=”com.example.alias”>
</activity-alias>

5规丽、tools:node="replace"

完全替換低優(yōu)先級(jí)元素蒲牧。 也就是說,如果低優(yōu)先級(jí)清單中有匹配元素赌莺,請(qǐng)將其忽略并完全按照其在此清單中顯示樣子來使用該元素冰抢。

低優(yōu)先級(jí)清單:
<activity-alias android:name=”com.example.alias”>
<meta-data android:name=”cow”
android:value=”@string/moo”/>
<meta-data android:name=”duck”
android:value=”@string/quack”/>
</activity-alias>

高優(yōu)先級(jí)清單:
<activity-alias android:name=”com.example.alias”
tools:node=”replace”>
<meta-data android:name=”fox”
android:value=”@string/dingeringeding”/>
</activity-alias>

合并的清單結(jié)果:
<activity-alias android:name=”com.example.alias”>
<meta-data android:name=”fox”
android:value=”@string/dingeringeding”/>
</activity-alias>

3、tools:node="strict"

當(dāng)此元素在低優(yōu)先級(jí)清單中的情況與在高優(yōu)先級(jí)清單中的情況不完全匹配時(shí)生成構(gòu)建故障(除非已通過其他合并規(guī)則標(biāo)記解決)艘狭。 這將替換合并沖突啟發(fā)式算法挎扰。 例如,如果低優(yōu)先級(jí)清單僅包括額外屬性,則構(gòu)建將會(huì)失旝⒓帧(而默認(rèn)行為會(huì)向合并清單添加額外屬性)额嘿。

低優(yōu)先級(jí)清單:
<activity android:name=”com.example.ActivityOne”
android:windowSoftInputMode=”stateUnchanged”>
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>

高優(yōu)先級(jí)清單:
<activity android:name=”com.example.ActivityOne”
android:screenOrientation=”portrait”
tools:node="strict”>
</activity>

合并的清單結(jié)果:
這會(huì)生成清單合并錯(cuò)誤。兩個(gè)清單元素在嚴(yán)格模式下也完全無法區(qū)分梧躺。 因此似谁,您必須應(yīng)用其他合并規(guī)則標(biāo)記來解決這些差異。 (通常掠哥,這兩個(gè)元素會(huì)完全地合并在一起巩踏,如以上 tools:node="merge" 示例所示)。

屬性標(biāo)記

要改為僅向清單標(biāo)記中的特定屬性應(yīng)用合并規(guī)則续搀,請(qǐng)使用以下屬性塞琼。每個(gè)屬性接受一個(gè)或多個(gè)屬性名稱(包括屬性命名空間),并以逗號(hào)分隔禁舷。

1屈梁、tools:remove="attr, ..."

從合并清單中刪除指定屬性。 盡管 您似乎可以僅刪除這些屬性榛了,但如果 低優(yōu)先級(jí)清單文件不包括這些 屬性在讶,而且您希望確保它們不納入合并 清單,則必須使用此選項(xiàng)霜大。

低優(yōu)先級(jí)清單:
<activity android:name=”com.example.ActivityOne”
android:windowSoftInputMode=”stateUnchanged”>

高優(yōu)先級(jí)清單:
<activity android:name=”com.example.ActivityOne”
android:screenOrientation=”portrait”
tools:remove=”android:windowSoftInputMode”>

合并的清單結(jié)果:

<activity android:name=”com.example.ActivityOne”
    android:screenOrientation=”portrait”>

2构哺、tools:replace="attr, ..."
將低優(yōu)先級(jí)清單中的指定屬性替換為 此清單中的屬性。 換言之战坤,始終保持 高優(yōu)先級(jí)清單的值曙强。

低優(yōu)先級(jí)清單:
<activity android:name=”com.example.ActivityOne”
android:theme=”@oldtheme”
android:exported=”false”
android:windowSoftInputMode=”stateUnchanged”>

高優(yōu)先級(jí)清單:
<activity android:name=”com.example.ActivityOne”
android:theme=”@newtheme”
android:exported=”true”
android:screenOrientation=”portrait”
tools:replace=”android:theme,android:exported”>

合并的清單結(jié)果:

<activity android:name=”com.example.ActivityOne”
    android:theme=”@newtheme”
    android:exported=”true”
    android:screenOrientation=”portrait”
    android:windowSoftInputMode=”stateUnchanged”>

3、tools:strict="attr, ..."

當(dāng)這些屬性在低優(yōu)先級(jí)清單中的情況與 在高優(yōu)先級(jí) 清單中的不完全匹配時(shí)生成構(gòu)建故障途茫。 這是所有屬性的默認(rèn)行為碟嘴,具有 合并沖突啟發(fā)式算法中介紹的特殊行為的屬性除外。

低優(yōu)先級(jí)清單:
<activity android:name=”com.example.ActivityOne”
android:screenOrientation=”landscape”>
</activity>

高優(yōu)先級(jí)清單:
<activity android:name=”com.example.ActivityOne”
android:screenOrientation=”portrait”
tools:strict="android:screenOrientation”>
</activity>

合并的清單結(jié)果:
這會(huì)生成清單合并錯(cuò)誤囊卜。 您必須應(yīng)用其他合并規(guī)則標(biāo)記來解決沖突娜扇。 (請(qǐng)謹(jǐn)記:這是默認(rèn)行為,因此如果您刪除 tools:strict="screenOrientation”栅组,上面的示例將具有相同的結(jié)果雀瓢。)

您也可以對(duì)一個(gè)元素應(yīng)用多個(gè)標(biāo)記,如下所示玉掸。

低優(yōu)先級(jí)清單:
<activity android:name=”com.example.ActivityOne”
android:theme=”@oldtheme”
android:exported=”false”
android:allowTaskReparenting="true"
android:windowSoftInputMode=”stateUnchanged”>

高優(yōu)先級(jí)清單:
<activity android:name=”com.example.ActivityOne”
android:theme=”@newtheme”
android:exported=”true”
android:screenOrientation=”portrait”
tools:replace=”android:theme,android:exported”
tools:remove=”android:windowSoftInputMode”>

合并的清單結(jié)果:

<activity android:name=”com.example.ActivityOne”
    android:theme=”@newtheme”
    android:exported=”true”
    android:allowTaskReparenting="true"
    android:screenOrientation=”portrait”>

標(biāo)記選擇器

如果您想僅對(duì)某個(gè)特定的導(dǎo)入庫應(yīng)用合并規(guī)則標(biāo)記刃麸,請(qǐng)?zhí)砑泳哂袔彀Q的 tools:selector 屬性。

例如司浪,對(duì)于下面的清單泊业,僅在低優(yōu)先級(jí)清單文件來自 com.example.lib1 庫時(shí)應(yīng)用 remove 合并規(guī)則把沼。

<permission android:name="permissionOne"
    tools:node="remove"
    tools:selector="com.example.lib1">

如果低優(yōu)先級(jí)清單來自其他源,系統(tǒng)將會(huì)忽略 remove 合并規(guī)則吁伺。

注: 如果您將此功能與其中一個(gè)屬性標(biāo)記配合使用智政,它將應(yīng)用至標(biāo)記中指定的所有選項(xiàng)。

對(duì)于所導(dǎo)入庫箱蝠,將替換 <uses-sdk>

默認(rèn)情況下续捂,導(dǎo)入 minSdkVersion 值高于主清單文件的庫時(shí)會(huì)出錯(cuò),而且無法導(dǎo)入該庫宦搬。 要使合并工具忽略此沖突并導(dǎo)入庫牙瓢,同時(shí)保持應(yīng)用的低 minSdkVersion 值,請(qǐng)將 overrideLibrary 屬性添加至 <uses-sdk> 標(biāo)記间校。屬性值可以是一個(gè)或多個(gè)庫包名稱(以逗號(hào)分隔)矾克,指明可能替換主清單的 minSdkVersion 的庫。

例如憔足,如果應(yīng)用的主清單按如下所示應(yīng)用 overrideLibrary:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.app"
          xmlns:tools="http://schemas.android.com/tools">
  <uses-sdk android:targetSdkVersion="22" android:minSdkVersion="2"
            tools:overrideLibrary="com.example.lib1, com.example.lib2"/>
...

下面的清單文件就可以直接合并胁附,不會(huì)出現(xiàn)與<uses-sdk> 標(biāo)記相關(guān)的錯(cuò)誤,合并清單將保留應(yīng)用清單中的 minSdkVersion="2"滓彰。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.lib1">
   <uses-sdk android:minSdkVersion="4" />
...

隱式系統(tǒng)權(quán)限

在最近的 Android 版本中控妻,應(yīng)用曾經(jīng)可以自由訪問的某些 Android API 已受 系統(tǒng) 權(quán)限限制。 為了避免中斷預(yù)期會(huì)訪問這些 API 的應(yīng)用揭绑,最近的 Android 版本允許應(yīng)用在無權(quán)限的情況下繼續(xù)訪問這些 API弓候,前提是它們已將 targetSdkVersion 設(shè)置為低于添加限制的版本的值。此行為有效地向應(yīng)用授予了隱式 權(quán)限他匪,以允許訪問 API菇存。 因此,這可能會(huì)對(duì)具有不同targetSdkVersion 值的合并清單產(chǎn)生以下影響邦蜜。

如果低優(yōu)先級(jí)清單文件提供隱式權(quán)限的 targetSdkVersion 值較低依鸥,而且高優(yōu)先級(jí)清單沒有相同的隱式權(quán)限(由于其 targetSdkVersion 等于或高于添加限制的版本),合并工具將向合并清單顯式添加系統(tǒng)權(quán)限悼沈。

例如贱迟,如果您的應(yīng)用將 targetSdkVersion 設(shè)置為 4 或更高值,并且導(dǎo)入了將 targetSdkVersion 設(shè)置為 3 或更低值的庫井辆,合并工具會(huì)將 WRITE_EXTERNAL_STORAGE 權(quán)限添加至合并清單关筒。 表 2 列出了可以添加至合并清單的所有可能權(quán)限。

注:如果您將應(yīng)用的 targetSdkVersion 設(shè)置為 23 或更高值杯缺,則必須在應(yīng)用嘗試訪問受這些權(quán)限保護(hù)的 API 時(shí)為任何危險(xiǎn)權(quán)限執(zhí)行運(yùn)行時(shí)權(quán)限請(qǐng)求。 如需獲得更多指導(dǎo)睡榆,請(qǐng)參閱使用系統(tǒng)權(quán)限萍肆。

圖-5 合并工具可添加至合并清單的權(quán)限列表.png

檢查合并清單并查找沖突

即使在構(gòu)建 APK 之前袍榆,也可以預(yù)覽合并清單,具體方法是:在 Android Studio 中打開您的 AndroidManifest.xml 文件塘揣,然后單擊編輯器底部的 Merged Manifest 選項(xiàng)卡包雀。

Merged Manifest 視圖在左側(cè)顯示合并清單的結(jié)果,在右側(cè)顯示每個(gè)合并清單文件的相關(guān)信息亲铡,如圖-2 所示才写。從低優(yōu)先級(jí)文件中合并的元素在左側(cè)以不同顏色突出顯示。 每種顏色的關(guān)鍵字在右側(cè)的 Manifest Sources 下方指定奖蔓。

圖片請(qǐng)看概述部分

屬于構(gòu)建的一部分但不構(gòu)成元素或?qū)傩缘那鍐挝募性谟覀?cè)的 Other Manifest Files 下方赞草。

要查看有關(guān)元素來源的信息,請(qǐng)?jiān)谧髠?cè)單擊元素吆鹤,詳細(xì)信息將顯示在右側(cè)的 Merging Log 下方厨疙。

如果發(fā)生任何沖突,它們將顯示在右側(cè)的 Merging Errors 下方疑务,并且包含有關(guān)如何使用 合并規(guī)則標(biāo)記解決沖突的建議沾凄。 錯(cuò)誤也會(huì) 打印在 Event Log 窗口(請(qǐng)選擇 View > Tool Windows > Event Log)中。

如果您想要查看合并決策樹的完整日志知允,則可以在模塊的 build/outputs/logs/ 目錄(名為 manifest-merger-buildVariant-report.txt)中查找該日志文件撒蟀。

附錄:合并策略


清單合并工具可以在邏輯上將某個(gè)清單中的每個(gè) XML 元素與其他清單中的對(duì)應(yīng)元素相匹配。 合并工具會(huì)使用“匹配關(guān)鍵字”匹配每個(gè)元素温鸽,匹配關(guān)鍵字可以是唯一的屬性值(如 android:name或標(biāo)記本身的天然唯一性(例如牙肝,只能有一個(gè) <supports-screen> 元素)。 如果兩個(gè)清單具有相同的 XML 元素嗤朴,工具將采用三種合并策略中的一種來合并這兩個(gè)元素:

  • 合并
    將所有非沖突屬性合并到同一標(biāo)記中配椭, 然后按其各自的合并策略合并子元素。 如果任何屬性 相互沖突雹姊,請(qǐng)使用合并規(guī)則標(biāo)記將它們合并在一起股缸。

  • 僅合并子項(xiàng)
    不整合或合并屬性(僅保留 優(yōu)先級(jí)最高的清單文件提供的屬性)并按照其合并策略 合并子項(xiàng)。

  • 保留
    將元素“按原樣”保留吱雏,然后將其添加至 合并文件中的常用父元素敦姻。 此策略僅在可接受相同元素的多個(gè) 聲明時(shí)使用。

下圖歧杏,列出了每種元素類型镰惦、使用的合并策略類型以及用于確定兩個(gè)清單之間的元素匹配的關(guān)鍵字。


圖-6. Manifest element merge policies and match keys.png

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末犬绒,一起剝皮案震驚了整個(gè)濱河市旺入,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖茵瘾,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件礼华,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡拗秘,警方通過查閱死者的電腦和手機(jī)圣絮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雕旨,“玉大人扮匠,你說我怎么就攤上這事》采” “怎么了棒搜?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長突照。 經(jīng)常有香客問我帮非,道長,這世上最難降的妖魔是什么讹蘑? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任末盔,我火速辦了婚禮,結(jié)果婚禮上座慰,老公的妹妹穿的比我還像新娘陨舱。我一直安慰自己,他們只是感情好版仔,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布游盲。 她就那樣靜靜地躺著,像睡著了一般蛮粮。 火紅的嫁衣襯著肌膚如雪益缎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天然想,我揣著相機(jī)與錄音莺奔,去河邊找鬼。 笑死变泄,一個(gè)胖子當(dāng)著我的面吹牛令哟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播妨蛹,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼屏富,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了蛙卤?” 一聲冷哼從身側(cè)響起狠半,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后典予,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體甜滨,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡乐严,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年瘤袖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昂验。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡捂敌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出既琴,到底是詐尸還是另有隱情占婉,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布甫恩,位于F島的核電站逆济,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏磺箕。R本人自食惡果不足惜奖慌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望松靡。 院中可真熱鬧简僧,春花似錦、人聲如沸雕欺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽屠列。三九已至啦逆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間笛洛,已是汗流浹背夏志。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留撞蜂,地道東北人盲镶。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像蝌诡,于是被迫代替她去往敵國和親溉贿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容