Android构建:如何添加额外AndroidManifest.xml并与现有清单合并?
Android多Manifest文件合并解决方案
问题描述
项目目录结构如下:
app/ ├─ src/ │ ├─ flavor_1/ │ │ ├─ AndroidManifest.xml │ ├─ flavor_2/ │ │ ├─ AndroidManifest.xml │ ├─ flavor_3/ │ │ ├─ AndroidManifest.xml │ ├─ main/ │ │ ├─ AndroidManifest.xml │ ├─ shared_feature/ │ │ ├─ main/ │ │ │ ├─ AndroidManifest.xml // 需要加入合并流程 │ │ │ ├─ java/ │ │ │ ├─ res/
目前main与各flavor专属的AndroidManifest.xml可正常合并,但需要将shared_feature/main/AndroidManifest.xml也加入合并,且不能忽略原flavor的Manifest文件。
错误方案分析
常见的manifest.srcFile写法会直接覆盖flavor的Manifest路径,导致原flavor的Manifest被忽略:
android { sourceSets { flavor_1 { java.srcDirs += 'src/shared_feature/main/java' res.srcDirs += 'src/shared_feature//main/res' manifest.srcFile = 'src/shared_feature//main/AndroidManifest.xml' // 此处会覆盖原flavor的Manifest } } }
正确解决方案
使用manifest.srcDirs添加目录而非替换文件,Gradle会自动合并该目录下的Manifest与原flavor、main的Manifest:
逐个配置flavor
android { sourceSets { flavor_1 { java.srcDirs += 'src/shared_feature/main/java' res.srcDirs += 'src/shared_feature/main/res' manifest.srcDirs += 'src/shared_feature/main' // 添加shared_feature的Manifest目录 } flavor_2 { java.srcDirs += 'src/shared_feature/main/java' res.srcDirs += 'src/shared_feature/main/res' manifest.srcDirs += 'src/shared_feature/main' } flavor_3 { java.srcDirs += 'src/shared_feature/main/java' res.srcDirs += 'src/shared_feature/main/res' manifest.srcDirs += 'src/shared_feature/main' } } }
批量配置所有flavor(推荐)
通过遍历所有product flavor,减少重复代码:
android { // 先定义你的product flavors productFlavors { flavor_1 {} flavor_2 {} flavor_3 {} } sourceSets { productFlavors.all { flavor -> flavor.java.srcDirs += 'src/shared_feature/main/java' flavor.res.srcDirs += 'src/shared_feature/main/res' flavor.manifest.srcDirs += 'src/shared_feature/main' } } }
合并优先级说明
Manifest的合并优先级从高到低为:flavor专属Manifest > shared_feature的Manifest > main的Manifest,即高优先级的配置会覆盖低优先级的重复配置。
内容的提问来源于stack exchange,提问作者Wajid
相关产品推荐
相关产品推荐

