当我们代码将minifyEnabled true后开启混淆,最终打包可能会出现AGPBI: {"kind":"error","text":"Type a.a is defined multiple times: F:\classes.jar:a/a.class,出现原因是是因为 R8/Projguard 混淆器 介入后,将原本不同的类都重命名为了最简短的 a.a
在 Android 组件化架构中,如果你在 alibrary和 blibrary 两个库模块中都开启了 minifyEnabled true:
-
隔离编译 :Gradle 在编译 Library 时是相互隔离的。R8 在处理
alibrary时,并不知道blibrary的存在。 -
重名碰撞 :R8 的混淆算法通常从
a,b,c开始。alibrary里的某个核心类(比如DataBinderMapperImpl)被混淆成了a.a;凑巧blibrary里的某个类也被混淆成了a.a。 -
合并冲突 :当 App 模块尝试将这两个已经混淆好的
.jar文件合并到一个 DEX 文件时,由于它们都叫a.a,编译器无法分辨该保留哪一个,为了程序安全只能报错
知道原因后我们只需要aliberary跟blibrary 的android{resourcePrefix "a_"}跟android{resourcePrefix "b_"}即可