当一个包含 DataBinding 的 Android 库被打包成 AAR 文件,并在主工程中引入时,在构建 Release 版本时可能会遇到 androidx.databinding.DataBindingComponent 类被重复定义的错误,而 Debug 构建通常是正常的。
典型的错误信息如下:
Task :app:mergeDexRelease
AGPBI: {"kind":"error","text":"Type androidx.databinding.DataBindingComponent is defined multiple times: D:\\as\\work\\***\\build\\app\\intermediates\\project_dex_archive\\release\\dexBuilderRelease\\out\\androidx\\databinding\\DataBindingComponent.dex, D:\\as\\work\\***\\build\\app\\intermediates\\external_libs_dex\\release\\mergeExtDexRelease\\classes.dex","sources":[{"file":"D:\\as\\work\\***\\build\\app\\intermediates\\project_dex_archive\\release\\dexBuilderRelease\\out\\androidx\\databinding\\DataBindingComponent.dex"}],"tool":"D8"}
com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives:
Learn how to resolve the issue at https://developer.android.com/studio/build/dependencies#duplicate_classes.
Type androidx.databinding.DataBindingComponent is defined multiple times: D:\as\work\***\build\app\intermediates\project_dex_archive\release\dexBuilderRelease\out\androidx\databinding\DataBindingComponent.dex, D:\as\work\***\build\app\intermediates\external_libs_dex\release\mergeExtDexRelease\classes.dex
...
为了更直观地展示此问题在构建过程中的表现,可以参考以下错误示意图:

错误原因分析
这个问题通常由以下原因导致:
- 库工程打包了 DataBinding 依赖:AAR 库自身引入了 DataBinding 的相关库(如
databinding-runtime),并将其打包到了 AAR 文件中。当主工程也使用 DataBinding 时,就会在最终的 APK 中出现两份相同的类定义,这在 Android 构建过程中是不允许的。
- 传递依赖冲突:库工程依赖的其他第三方库可能没有使用 DataBinding,但在库工程中为它们开启了 DataBinding 支持,这可能导致在打包 AAR 时包含了不必要的 DataBinding 组件。
解决方案
根本的解决思路是:确保 DataBinding 相关的库只被主工程编译和链接,而不被打包进 AAR 库中。这可以通过在库工程的 build.gradle 文件中,将 DataBinding 依赖的声明方式从 implementation 或 api 改为 compileOnly 来实现。
具体修改如下:
dependencies {
// 将原有的 implementation/ api 依赖改为 compileOnly
compileOnly 'androidx.databinding:databinding-runtime:8.13.0'
compileOnly 'androidx.databinding:databinding-adapters:8.13.0'
compileOnly 'androidx.databinding:databinding-ktx:8.13.0'
compileOnly 'androidx.databinding:databinding-common:8.13.0'
// ... 其他依赖
}
compileOnly 的作用:依赖项在编译时可用,用于满足代码编译需求,但最终的 AAR 包中不会包含这些依赖。这样,主工程在引入此 AAR 时,需要自己声明这些 DataBinding 依赖,从而保证了类定义的唯一性。
完成以上修改后,重新打包 AAR 库,并将其集成到主工程中,即可解决 DataBindingComponent 类重复定义的构建错误。这种对依赖范围的精细控制,是解决复杂项目间 依赖冲突 的常用技巧。
|