轉(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 語句即可解決,具體語法如下圖:
而 "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ò)誤承二。
合并優(yōu)先級(jí)
合并工具根據(jù)每個(gè)清單文件的優(yōu)先級(jí)將所有清單文件按順序合并到一個(gè)文件中。 例如瑰步,如果您有 3 個(gè)清單文件矢洲,則會(huì)先將優(yōu)先級(jí)最低的清單合并到優(yōu)先級(jí)第 2 高的清單中璧眠,然后再將合并后的清單合并到優(yōu)先級(jí)最高的清單中缩焦,如下圖所示:
有 3 種基本的清單文件可以互相合并,它們的合并優(yōu)先級(jí)如下(按優(yōu)先級(jí)由高到低的順序):
- 清單文件構(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)。 - 應(yīng)用模塊的主清單文件
- 所包括庫中的清單文件
如果您有多個(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é)果:
但是腰涧,在某些情況下,合并工具會(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)限的部分小染。
- 如果低優(yōu)先級(jí)清單的
- 絕不會(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)限萍肆。
檢查合并清單并查找沖突
即使在構(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)鍵字。
參考:
https://developer.android.com/studio/build/manifest-merge