AndroidStudio多个l清单合并规则
合并多个l清单
APK 或 Android App Bundle ⽂件只能包含⼀个 l ⽂件,但 Android Studio 项⽬可以包含多个清单⽂件,这些清单⽂件由主源代码集、build 变体和导⼊的库提供。因此,在构建应⽤时,Gradle 构建系统会将所有清单⽂件合并成⼀个清单⽂件打包到应⽤中。
清单合并⼯具遵循某些合并启发法和您使⽤特殊 XML 属性定义的合并偏好设置,来将各个清单⽂件中的所有 XML 元素组合在⼀起。
提⽰:使⽤ Merged Manifest 视图可预览合并后的清单结果并出冲突错误。
打开manifest⽂件,在左下⾓的位置;
合并优先级
合并⼯具会根据每个清单⽂件的优先级按顺序合并,将所有清单⽂件组合到⼀个⽂件中。例如,如果您有三个清单⽂件,则会先将优先级最低的清单合并到优先级第⼆⾼的清单中,然后再将合并后的清单合并到优先级最⾼的清单中:
有三种基本的清单⽂件可以互相合并,它们的合并优先级如下(按优先级由⾼到低的顺序):
1. 构建变体的清单⽂件
如果变体有多个源代码集,则其清单优先级如下:
nodeselector构建变体清单(如 src/demoDebug/)
构建类型清单(如 src/debug/)
产品变种清单(如 src/demo/)
如果您使⽤的是变种维度,则清单优先级与每个维度在 flavorDimensions 属性中的列⽰顺序(按优先级由⾼到低的顺序)对应。
2. 应⽤模块的主清单⽂件
3. 所包含的库中的清单⽂件
如果您有多个库,则其清单优先级与依赖顺序(库出现在 Gradle dependencies 代码块中的顺序)⼀致。
例如,先将库清单合并到主清单中,然后再将主清单合并到构建变体清单中。
合并冲突启发法
如果优先级较低的清单中的某个元素与优先级较⾼的清单中的所有元素都不匹配,则会将该元素添加到合并后的清单中。不过,如果有匹配的元素,则合并⼯具会尝试将每个元素的所有属性组合到同⼀元素中。如果该⼯具发现两个清单包含相同的属性,但值不同,就会发⽣合并冲突。
合并⼯具尝试将所有属性组合到同⼀元素中时可能出现的结果:
不过,在某些情况下,合并⼯具会采取其他⾏为⽅式以避免合并冲突:
元素中的属性绝不会合并在⼀起,只会使⽤优先级最⾼的清单中的属性。
和 元素中的 android:required 属性使⽤ OR
合并,这样⼀来,如果发⽣冲突,系统将应⽤ “true” 并始终包含⼀个清单所需的功能或库。
元素中的属性始终使⽤优先级较⾼的清单中的值,但以下情况除外:
a.如果优先级较低的清单中的 minSdkVersion 值较⾼,那么除⾮您应⽤ overrideLibrary 合并规则,否则将会发⽣错误。
b.如果优先级较低的清单中的 targetSdkVersion 值较低,合并⼯具将使⽤优先级较⾼的清单中的值,但也会添加所有必要的系统权
限,以确保所导⼊的库继续正常运作(以防遇到较⾼的 Android 版本具有更多权限限制的情况)。如需详细了解此⾏为,请参阅有关隐式系统权限的部分。
c.绝不会在清单之间匹配 元素。每个该元素都被视为唯⼀的元素,并添加到合并后的清单中的共同⽗元素中。
对于属性之间的其他所有冲突,您将收到⼀条错误,并且必须指⽰合并⼯具如何解决该错误,⽅法是在优先级较⾼的清单⽂件中添加⼀个特殊属性(请参阅下⾯有关合并规则标记的部分)。
注意:
不依赖于默认属性值。简单来说,就是看谁属性设置了值的为准;由于所有唯⼀属性会组合到同⼀元素中,因此如果优先级较⾼的清单实际上依赖于某个属性的默认值⽽不声明该属性,则可能会导致意外结果。例如,如果优先级较⾼的清单不声明 android:launchMode 属性,则会使⽤默认值 “standard”;但如
果优先级较低的清单声明此属性具有其他值,则该值将应⽤于合并后的清单(替换默认值)。因此,您应该将每个属性明确定义为您希望的值。(清单参考⽂档中介绍了每个属性的默认值。)
合并规则标记
合并规则标记是⼀个 XML 属性,可⽤于指定您对如何解决合并冲突或移除不需要的元素和属性的偏好。您可以对整个元素应⽤标记,也可以只对元素中的特定属性应⽤标记。
合并两个清单⽂件时,合并⼯具会在优先级较⾼的清单⽂件中查这些标记。
所有标记都属于 Android tools 命名空间,因此您必须先在 元素中声明此命名空间:
<manifest xmlns:android="schemas.android/apk/res/android"
package="app"
xmlns:tools="schemas.android/tools">
节点标记
如需对整个 XML 元素(给定清单元素中的所有属性及其所有⼦标记)应⽤合并规则,请使⽤以下属性:
tools:node="merge"
在没有冲突的情况下,使⽤合并冲突启发法合并此标记中的所有属性以及所有嵌套元素。这是元素的默认⾏为。
tools:node="merge-only-attributes"
仅合并此标记中的属性,不合并嵌套元素。
tools:node="remove"
从合并后的清单中移除此元素。虽然您似乎只需要删除此元素即可,但如果您发现合并后的清单中有不需要的元素,⽽且该元素是由不受您控制的优先级较低的清单⽂件(如导⼊的库)提供的,则必须使⽤此属性。
tools:node="removeAll"
与 tools:node=“remove” 类似,但它会移除与此元素类型匹配的所有元素(同⼀⽗元素内)。
tools:node="replace"
完全替换优先级较低的元素。也就是说,如果优先级较低的清单中有匹配的元素,会将其忽略并完全按照此元素在此清单中显⽰的样⼦使⽤它。
tools:node="strict"
每当此元素在优先级较低的清单中与在优先级较⾼的清单中不完全匹配时,都会导致构建失败(除⾮已通过其他合并规则标记解决)。这会替换合并冲突启发式算法。例如,如果优先级较低的清单只是包含⼀个额外的属性,构建就会失败(尽管默认⾏为是将该额外属性添加到合并后的清单中)。
这会导致清单合并错误。在严格模式下,这两个清单元素不能有任何不同。因此,您必须应⽤其他合并规则标记解决这些差异。(通常,这两个元素会正常合并在⼀起,如上⾯的 tools:node=“merge” ⽰例中所⽰。)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论