Manifest merger failed with multiple errors, see logs解决方案
组件化开发,在测试单个组件的时候,有时编译会出现这样的问题
以本人的项目模拟:
当前要测试的是 lib_news
lib_news 需要用到lib_web的webview
lib_news 的 build.gradle
if (isRelease) {
apply plugin: 'com.android.library'
} else {
apply plugin: 'com.android.application'
}
apply plugin: 'org.jetbrains.kotlin.android'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'kotlin-parcelize'
android{
……
defaultConfig {
……
kapt {
arguments {
arg("AROUTER_MODULE_NAME", project.getName())
}
}
buildConfigField("boolean", "isRelease", String.valueOf(isRelease))
}
sourceSets{
main {
if (isRelease) {
//如果是library,则编译manifest下AndroidManifest.xml
manifest.srcFile 'src/main/manifest/AndroidManifest.xml'
} else {
//如果是application,则编译主目录下AndroidManifest.xml
manifest.srcFile 'src/main/AndroidManifest.xml'
}
}
}
……
dependencies{
……
implementation project(path: ':lib_web') //导入lib_web的依赖
}
}
project config.gradle
ext{
isRelease = false
//isUseWeb = true 先注释,一般的配置文件只配置了isRelease
……
}
lib_web 的 build.gradle
if (isRelease) {
apply plugin: 'com.android.library'
} else {
apply plugin: 'com.android.application'
}
apply plugin: 'org.jetbrains.kotlin.android'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'kotlin-parcelize'
android{
……
defaultConfig {
……
kapt {
arguments {
arg("AROUTER_MODULE_NAME", project.getName())
}
}
buildConfigField("boolean", "isRelease", String.valueOf(isRelease))
}
sourceSets{
main {
if (isRelease) {
//如果是library,则编译manifest下AndroidManifest.xml
manifest.srcFile 'src/main/manifest/AndroidManifest.xml'
} else {
//如果是application,则编译主目录下AndroidManifest.xml
manifest.srcFile 'src/main/AndroidManifest.xml'
}
}
}
……
dependencies{
……
}
}
一般我们组件化开发,只设置isRelease
来判断 单个组件测试 还是 集成编译
所以测试lib_news
, 直接将isRelease
改为false
,而同样lib_web
也会变成application
,相当于我们在lib_news
导入了application
而不是library
,就会涉及到合并AndroidManifest.xml
的问题
展示一下
AndroidManifest.xml
lib_web
分组件模式
lib_web
集成模式
解决方案:
project config.gradle
添加一个isUseWeb
用来标识组件化模式下要用到lib_web
ext{
isRelease = false
isUseWeb = true
……
}
修改lib_web
的build.gradle
if (isUseWeb) {
apply plugin: 'com.android.library'
} else {
apply plugin: 'com.android.application'
}
android {
……
defaultConfig {
……
//记得这个↓
buildConfigField("boolean", "isUseWeb", String.valueOf(isUseWeb))
}
……
sourceSets{
main {
if (isUseWeb) {
//如果是library,则编译manifest下AndroidManifest.xml
manifest.srcFile 'src/main/manifest/AndroidManifest.xml'
} else {
//如果是application,则编译主目录下AndroidManifest.xml
manifest.srcFile 'src/main/AndroidManifest.xml'
}
}
}
}
第一次写博客,见识少,可能会有错误,请大佬们指正