Android多模块项目R8优化时库类与程序类冲突问题
Android R8混淆构建报错解决方案
问题描述
构建Android应用时,R8混淆阶段出现以下警告与错误:
AGPBI: {"kind":"warning","text":"The following library types, prefixed by java., are present both as library and non-library classes: java.util.LinkedHashMap, java.util.HashMap, java.util.AbstractMap, java.util.AbstractList, java.util.AbstractCollection, java.util.IdentityHashMap, java.util.ArrayList, java.util.LinkedList, java.util.Hashtable, java.util.concurrent.ConcurrentLinkedQueue, java.util.AbstractQueue, java.util.Vector, java.util.HashSet, java.util.AbstractSet, java.util.WeakHashMap", "sources":[{}],"tool":"R8"} AGPBI: {"kind":"error","text":"Library class java.util.LinkedHashMap implements program class java.util.Map", "sources":[{}],"tool":"R8"} AGPBI: {"kind":"error","text":"Library class java.util.HashMap implements program class java.util.Map", "sources":[{}],"tool":"R8"}
构建过程截图:
尝试过以下ProGuard规则,但错误仍未解决:
-keep class java.io.UncheckedIOException { *; } -keep class java.lang.Iterable { *; } -keep class java.time.Clock { *; } -keep class java.time.DateTimeException { *; } -keep class java.util.LinkedHashMap { *; } -keep class java.util.Map { *; } -keep class java.util.IdentityHashMap { *; } -keep class java.util.LinkedHashMap implements java.util.Map
核心原因
项目中存在JDK标准库类的重复定义:系统自带的java.util等包下的类,和项目依赖的第三方库/自定义类中的同名类冲突,导致R8无法区分处理。
解决步骤
1. 定位冲突依赖
执行Gradle命令查看项目依赖树,找出打包了JDK标准类的第三方库:
- Mac/Linux终端执行:
./gradlew app:dependencies - Windows终端执行:
gradlew.bat app:dependencies
在输出结果中搜索java.util相关类,重点排查老旧库、自定义JDK实现类(如org.apache.harmony相关依赖)。
2. 排除或替换冲突依赖
找到问题库后,在build.gradle中排除重复的包,或替换为无冲突的版本:
implementation('第三方库坐标') { // 排除包含重复JDK类的分组/模块 exclude group: 'xxx', module: 'xxx' }
如果库本身打包了JDK类,优先更换为不包含这些类的新版本,或寻找替代库。
3. 修正ProGuard规则
- 移除所有针对
java.util、java.lang等系统类的keep规则,R8默认会正确处理系统库类,手动保留反而会干扰混淆逻辑。 - 你写的
-keep class java.util.LinkedHashMap implements java.util.Map是错误语法,ProGuard不支持这种写法,直接删除即可。
4. 检查自定义类
查看项目源码中是否存在自己定义的java.util.Map等JDK同名类,这类自定义类必须重命名或删除,避免和系统类冲突。
内容的提问来源于stack exchange,提问作者Antony Nicolas Huaman Alikhan
相关产品推荐
相关产品推荐

