清單文件的合并

資料

官網(wǎng)

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

清單文件在合并時(shí)身冬,會(huì)按優(yōu)先級(jí)進(jìn)行合并桐筏。會(huì)按 優(yōu)先級(jí)從低向高合并液荸,優(yōu)先級(jí)最低的清單文件會(huì)合并到優(yōu)先級(jí)倒數(shù)第二低的文件中,然后今次向下合并琉苇。

優(yōu)先級(jí)按高到低如下:

  1. 主清單文件嘲玫。

  2. 各庫中的文件。如果有多個(gè)庫并扇,其清單優(yōu)先級(jí)與依賴順序(庫出現(xiàn)在 Gradle dependencies 塊中的順序)匹配去团。

合并規(guī)則

  1. 如果優(yōu)先級(jí)較低的清單中的元素與優(yōu)先級(jí)較高的清單中的任何元素均不匹配,則該元素將被添加至合并清單穷蛹。

  2. 如果有匹配元素土陪,則合并工具會(huì)嘗試將其中的所有屬性合并到相同元素中。如果工具發(fā)現(xiàn)兩個(gè)清單包含相同屬性肴熏,但值不相同鬼雀,則會(huì)出現(xiàn)合并沖突。

匹配規(guī)則

但如下幾個(gè)標(biāo)簽不會(huì)出現(xiàn)另外:

  1. <manifest> 元素中的屬性絕不合并 — 僅使用優(yōu)先級(jí)最高的清單中的屬性蛙吏。

  2. <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)限限制的情況)泼诱。

  3. <intent-filter> 每個(gè)元素都被視為唯一元素坛掠,并添加至合并清單中的常用父元素。也就是說,<intent-filter> 不會(huì)被合并却音。

合并規(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)識(shí)分為兩種類型夷陋,一種作用于節(jié)點(diǎn)欠拾,一種作用于屬性。


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

作用于整個(gè) xml 元素骗绕。其對(duì)應(yīng)的屬性名為 node藐窄。值如下:

屬性值 含義
merge 合并此標(biāo)記中的所有屬性以及所有嵌套元素
merge-only-attributes 只合并屬性,不合并子元素
remove 刪除匹配的元素
removeAll 刪除所有匹配的標(biāo)簽
replace 忽略低優(yōu)先級(jí)內(nèi)容酬土,完全使用高優(yōu)先級(jí)內(nèi)容
strict 只要兩個(gè)清單文件不一樣荆忍,無論是否能合并,都會(huì)出現(xiàn)沖突

在比對(duì)元素是否相同時(shí)撤缴,只比例標(biāo)簽名以及其中的 name 屬性值刹枉。如果都相同,則認(rèn)為相同屈呕;否則不相同微宝。

merge

默認(rèn)行為。合并此標(biāo)記中的所有屬性以及所有嵌套元素虎眨。如

低版本為:

       <activity android:name="com.demo.MainActivity"
            android:hardwareAccelerated="false" >
            <meta-data
                android:name="test"
                android:value="test" />
        </activity>

高版本為

        <activity
            android:name="com.demo.MainActivity"
            android:screenOrientation="portrait"
            tools:node="merge">

        </activity>

則合并后為:

 <activity
    android:name="com.demo.MainActivity"
    android:screenOrientation="portrait"
    android:hardwareAccelerated="false">
            <meta-data
                android:name="test"
                android:value="test" />
</activity>

merge-only-attributes

僅合并元素的屬性蟋软,不合并子元素。

remove

刪除滿足條件的元素嗽桩。

如高版本配置如下:

      <meta-data android:name="test"
            android:value="main"
            tools:node="remove" />

則合并后的清單文件中不會(huì)含有該 meta-data岳守。

removeAll

刪除所有標(biāo)配的標(biāo)簽。使用該屬性值時(shí)碌冶,標(biāo)簽中不能含有任何其他屬性湿痢,也就是說該標(biāo)簽中除了 tools:node="removeAll" 外,不能配置任何其他屬性种樱。

        <meta-data
            android:name="test"
            tools:node="removeAll" />

上述配置會(huì)刪除同一父元素內(nèi)的所有 <meta-data> 標(biāo)簽蒙袍。

replace

完全替換低優(yōu)先級(jí)元素。 也就是說嫩挤,如果低優(yōu)先級(jí)清單中有匹配元素害幅,請將其忽略并完全按照其在此清單中顯示樣子來使用該元素。

標(biāo)簽匹配不單指標(biāo)簽名相同岂昭,其 name 元素的值也要相同以现。

<meta-data
      android:name="test"
      tools:node="replace" />

strict

當(dāng)此元素在低優(yōu)先級(jí)清單中的情況與在高優(yōu)先級(jí)清單中的情況不完全匹配時(shí)生成構(gòu)建故障。如:

<!---高優(yōu)先級(jí)-->
<activity
    tools:node="strict"
    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" />

上述兩個(gè)文件在合并時(shí),會(huì)產(chǎn)生沖突邑遏;但如果將 strict 換成 merge 會(huì)合并成功佣赖。


屬性標(biāo)記

屬性標(biāo)記只會(huì)影響某個(gè) xml 標(biāo)簽中的某個(gè)屬性,不會(huì)影響整個(gè)標(biāo)簽记盒。

每個(gè)屬性接受一個(gè)或多個(gè)屬性名稱(包括屬性命名空間)憎蛤,并以逗號(hào)分隔。

replace

將低優(yōu)先級(jí)清單中的指定屬性替換為此清單中的屬性纪吮。 換言之俩檬,始終保持高優(yōu)先級(jí)清單的值

<!--高版本-->
<meta-data
     android:name="test"
     android:resource="@string/test"
     android:value="main"
     tools:replace="android:value,android:resource" />
<!--低版本-->
<meta-data
     android:name="test"
     android:resource="@string/app_name"
     android:value="test" />

首先,replace 的值是 android:value碾盟,而不是 value棚辽。也就是說:在 配置屬性名時(shí),需要帶名稱空間冰肴。

其次屈藐,replace 可以配置多個(gè)屬性,屬性之間通過逗號(hào)分隔熙尉。

上述文件合并后联逻,得到的依舊是高版本的配置。

remove

從合并清單中刪除指定屬性骡尽。

<!--高版本-->
<meta-data
    android:name="test"
    android:value="main"
    tools:remove="android:resource" />
<!--低版本-->
<meta-data
    android:name="test"
    android:resource="@string/app_name" />
<!--合并結(jié)果-->
<meta-data
    android:name="test"
    android:value="main" />

因?yàn)樵诟邇?yōu)先級(jí)中使用了 remove遣妥,則合并后不會(huì)出現(xiàn) android:resource 屬性擅编。

strict

當(dāng)這些屬性在低優(yōu)先級(jí)清單中的情況與在高優(yōu)先級(jí) 清單中的不完全匹配時(shí)生成構(gòu)建故障攀细。 默認(rèn)行為。


選擇器

僅對(duì)某個(gè)特定的導(dǎo)入庫應(yīng)用合并規(guī)則標(biāo)記爱态,需要使用 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ī)則洞渔。


<uses-sdk>

默認(rèn)時(shí)套媚,如果庫的 minSdk 高于主工程的,則會(huì)出錯(cuò)磁椒,無法導(dǎo)入該庫堤瘤。可以將 overrideLibrary 添加至 <uses-sdk> 標(biāo)簽中浆熔。

overrideLibrary 屬性值可以是一個(gè)或多個(gè)庫的包名(以逗號(hào)分隔)本辐,指明可能替換主清單的 minSdkVersion 的庫。

如主工程設(shè)置 minSdk 為 21, library 設(shè)置為 22慎皱。則合并時(shí)會(huì)出現(xiàn)錯(cuò)誤老虫。可以在主工程的清單文件中添加如下配置:

    <uses-sdk tools:overrideLibrary="com.library.package" />

其中 com.library.package 替換為庫的包名茫多。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市天揖,隨后出現(xiàn)的幾起案子菊卷,更是在濱河造成了極大的恐慌宝剖,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件万细,死亡現(xiàn)場離奇詭異,居然都是意外死亡赖钞,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門雪营,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人献起,你說我怎么就攤上這事∏床停” “怎么了姻政?”我有些...
    開封第一講書人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長岂嗓。 經(jīng)常有香客問我汁展,道長,這世上最難降的妖魔是什么厌殉? 我笑而不...
    開封第一講書人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任食绿,我火速辦了婚禮,結(jié)果婚禮上公罕,老公的妹妹穿的比我還像新娘器紧。我一直安慰自己,他們只是感情好熏兄,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開白布品洛。 她就那樣靜靜地躺著树姨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪桥状。 梳的紋絲不亂的頭發(fā)上帽揪,一...
    開封第一講書人閱讀 49,829評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音辅斟,去河邊找鬼转晰。 笑死,一個(gè)胖子當(dāng)著我的面吹牛士飒,可吹牛的內(nèi)容都是我干的查邢。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼酵幕,長吁一口氣:“原來是場噩夢啊……” “哼扰藕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起芳撒,我...
    開封第一講書人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤邓深,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后笔刹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芥备,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年舌菜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了萌壳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,654評(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,940評(píng)論 3 313
  • 文/蒙蒙 一坛吁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧哆姻,春花似錦玫膀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽筋量。三九已至碉熄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間呀酸,已是汗流浹背琼梆。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來泰國打工茎杂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人倾哺。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓羞海,卻偏偏與公主長得像却邓,于是被迫代替她去往敵國和親院水。 傳聞我的和親對(duì)象是個(gè)殘疾皇子简十,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

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