AndroidManifest.xml
每个module都有一份AndroidManifest来记载其信息,最终生成app的时候,将多个AndroidManifest合并成一个总的,路径为:app/build/intermediates/manifests/full/debug/AndroidManifest.xml。
合并的规则如下:
1 注册Activity
在单module中,name属性可以采用缩进的方式,但是在合并后,name属性则以包名加属性名显示,不这样的话,编译打包的时候会找不到每个文件的具体位置。
2、注册Application
(1)如果功能module有Application,主module没有自定义的Application,这时会引用功能module的Application.
(2)如果主module有自定义的Application,功能module没有Application,则直接引入主module的Application.
(3)如果功能module中 有两个自定义的Application,在解决冲突之后,Application最终会载入最终编译后的module的Application.
(4)如果主module中有自定义的Application,其他功能module也有自定义的Application,在解决冲突之后,最后编译的主module的Application会在AndroidManifest中。
3、权限申明
相同点权限只会被声明一次,所以可以把声明权限全部放在Base module中。
4、主题声明
Activity的每个主题都是独立的,每个Activity的主题都会引用自身的module的AndroidManifest所声明的主题。
5、shareUid
通过声明Share User Id,拥有同一个User id的多个App可以配置成运行在同一个进程中,所以默认可以互相访问任意数据。
只有在主module中声明shareUid,才会最终打包到 full AndroidManifest中,如果只是在功能module中声明,并不会放在最终的AndroidManifest中。
合并冲突的规则
如果不指定uses-sdk,默认的minSdkVersion和targetSdkVersion值为1,当发生冲突时将使用高优先级的值。若不指定targetSdkVersion,其值等于targetSdkVersion
当library工程的minSdkVersion比主工程src/main中的minSdkVersion低时会产生冲突,此时需要添加overLibrary标记解决冲突
当library工程的targetSdkVersion比主工程src/main中的大时,合并过程会增加一些权限保证library工程能正常运行
每个Manifest文件只和其子Manifest文件的属性合并
<intent-filter>的合并规则是叠加而不是覆盖
合并冲突标记
merge
默认合并操作。
replace
高优先级替换低优先级Manifest文件中的属性
strict
属性相同而值不同时会报错,除非通过冲突规则resolved
merge-only
仅合并低优先级的属性
remove
移除指定的低优先级的属性
remove-All
移除相同节点类型下所有低优先级的属性
网友评论