什么文件是資源文件?
-
/res
目錄下的所有文件, -
/assets
目錄 -
Manifest
文件
需要合并的資源文件來源是哪?
通常apk中的資源來源有3個语婴,具體可以參考官網(wǎng):
- 主資源(main source set):比如
src/main/res
- 編譯變量(Build variant source set): 比如
src/demoDebug/res
- 庫文件依賴(libraries): 也就是我們引進(jìn)的
aar
。
為什么要合并驶睦?
因為文件沖突了所以要合并砰左。
那么隨之而來的問題是系統(tǒng)如何唯一表示一個資源文件?相同resource type
(anim/drawable/string等)和相同resource qualifier
(比如hdpi, value中的語言等)下相同文件名的資源场航,系統(tǒng)會認(rèn)為他是相同的缠导,會導(dǎo)致沖突,需要合并溉痢。
如何合并僻造?
合并/assets
目錄
asset
沖突只會是文件沖突,規(guī)則也簡單孩饼,優(yōu)先使用本地文件髓削。
合并/res
目錄
單一module
中的資源文件發(fā)生沖突時如何合并?
單一module
下可能就會有相同的資源存在镀娶,比如有多個主資源集立膛。那么當(dāng)出現(xiàn)這種沖突的情況的時候,系統(tǒng)會怎么處理呢汽畴?規(guī)則是低優(yōu)先級的資源會被覆蓋掉旧巾。
覆蓋的優(yōu)先級從高到低如下:
build variant > build type > product flavor > main source set > library dependences
舉個栗子,如果我們主資源集下有兩個資源: res/layout/a.xml
, res/layout/b.xml
, build type
文件夾下面有res/layout/a.xml
忍些。那么最后打包生成的apk中的res/layout/a.xml
來自于build type
, res/layout/b.xml
來自于main source set
鲁猩。
不同module中的資源文件發(fā)生沖突時如何合并?
當(dāng)?shù)谌揭蕾囍械膔es文件與本地文件有沖突時罢坝,會優(yōu)先選用本地文件廓握。但res/values
略有不同,此目錄下的strings.xml
嘁酿、color.xml
隙券、styles.xml
等文件會被整合到一個叫values.xml
的文件中去,后與各第三方依賴中的values.xml
進(jìn)行內(nèi)容上的合并闹司,不會像res
其它子目錄文件一樣直接舍棄第三方?jīng)_突文件娱仔。
Manifest
合并
低優(yōu)先級的manifest被合并到高優(yōu)先級manifest中。
不同來源的manifest優(yōu)先級由高到低:
- 構(gòu)建變體(build variant)中的manifest
- 構(gòu)建變體(build variant)manifest: 例如
src/demoDebug
- 構(gòu)建類型(build type) manifest: 例如
src/debug
- 產(chǎn)品風(fēng)味(product flavor) manifest: 例如
src/demo
- 構(gòu)建變體(build variant)manifest: 例如
- 本地 app module 中的manifest
- 依賴的庫中的manifest
合并 manifest 中的屬性值的默認(rèn)規(guī)則如下:
High priority attribute | Low priority attribute | Attribute's merged result |
---|---|---|
No value | No value | No value (use default value) |
No value | Value B | Value B |
Value A | No value | Value A |
Value A | Value A | Value A |
Value A | Value B | Conflict error—you must add a merge rule marker |
但是也有如下例外:
-
<manifest>
中的屬性不會進(jìn)行合并游桩,直接使用高優(yōu)先級manifest中的屬性 -
<uses-feature>
和<uses-library>
中的android:required
屬性使用or
規(guī)則進(jìn)行合并 -
<uses-sdk>
中的屬性總是使用高優(yōu)先級manifest中的牲迫,但以下情況例外:- 當(dāng)?shù)蛢?yōu)先級中定義的
minSdkVersion
較高時會報錯。但是可以使用overrideLibrary
合并規(guī)則解決此錯誤借卧。 - 當(dāng)?shù)蛢?yōu)先級中定義的
targetSdkVersion
較低時盹憎,合并工具會使用高優(yōu)先級manifest中的較高值。但是铐刘,它還添加了確保導(dǎo)入的庫繼續(xù)正常工作所需的任何系統(tǒng)權(quán)限(以防更高版本的Android增加了權(quán)限限制的情況)陪每。可以點擊這里查看合并工具可能會添加的權(quán)限
- 當(dāng)?shù)蛢?yōu)先級中定義的
-
<intent-filter>
元素在合并中不會被改變,只會被添加到其父節(jié)點中去