KMM项目生成签名Release App Bundle时出现BuildConfig重复定义问题求助
我之前也碰到过KMM项目里这个一模一样的问题!核心原因就是你的Android app模块和shared模块用了相同的包名,导致Release构建时两个模块生成的BuildConfig类重名冲突了——Debug模式下因为构建流程的差异(比如Debug的BuildConfig会有特殊处理,不会触发类路径冲突)没暴露问题,但Release模式下就撞车了。
下面是几个亲测有效的解决方法,按优先级推荐:
方案一:给shared模块的Android目标指定独立包名
这是最直接也最规范的做法,在shared模块的build.gradle.kts里找到Android目标配置,修改namespace为一个和app模块不同的名称,比如:android { namespace = "com.yourcompany.project.shared" // 比如app模块用com.yourcompany.project // 其他Android配置... }这样两个模块的
BuildConfig会生成在不同的包路径下,彻底避免重名冲突。方案二:禁用shared模块的BuildConfig生成
如果你根本不需要shared模块生成BuildConfig,可以直接关掉这个功能。在shared模块的build.gradle.kts的Android配置中添加:android { buildFeatures { buildConfig = false } // 其他Android配置... }这样shared模块就不会生成
BuildConfig类,自然不会和app模块的版本冲突。方案三:通过R8规则处理重复类(不优先推荐)
虽然你Release模式没开混淆,但可以添加R8规则来忽略重复的BuildConfig。在app模块的proguard-rules.pro文件中添加:-keep class com.yourcompany.project.BuildConfig { *; } -dontobfuscate注意把
com.yourcompany.project换成你实际的包名。不过这个方案只是绕过问题,不如前两个方案从根源解决,所以只作为备选。
额外补充:为什么Debug模式没问题?因为Debug构建时,Android Gradle插件会给每个模块的BuildConfig添加模块相关的标识,或者在类加载逻辑上做了区分,所以不会触发重复定义的错误;但Release模式下会合并所有模块的类路径,严格检测重复类,就会抛出这个异常。
内容的提问来源于stack exchange,提问作者S Haque

