如何在Android的R8中正确引入jmods替代rt.jar?
JDK 8+ 下 R8 替代 rt.jar 引入 Java SE 类的正确方式
问题说明
在旧版JDK中,通过配置-libraryjars <java.home>/lib/rt.jar可以让R8识别Java SE核心类,避免优化时误剥离非Android专属Java库依赖的关键代码(不会打包完整rt.jar到应用)。但JDK 8及以上移除了rt.jar改用jmods,直接使用ProGuard的jmod配置语法会触发R8报错:
Unexpected input type. Only archive types are supported, e.g., .jar, .zip, etc.
这是因为R8不直接支持jmod格式作为输入文件。
解决方案
方法1:将java.base.jmod转换为Jar文件
jmod本质是zip格式的归档文件,可先解压再重新打包为R8支持的Jar:
- 解压java.base.jmod到临时目录:
unzip "$JAVA_HOME/jmods/java.base.jmod" -d temp_jmod_dir - 将解压后的
classes目录打包为Jar:jar cvf java.base.jar -C temp_jmod_dir/classes . - 在R8配置中引用这个Jar:
-libraryjars path/to/java.base.jar(!module-info.class)
方法2:直接引用解压后的classes目录(更快捷)
如果不想生成Jar文件,也可以直接将解压后的classes目录作为库路径配置给R8:
- 先完成方法1的第一步解压操作;
- 在R8配置中添加:
-libraryjars path/to/temp_jmod_dir/classes(!module-info.class)
注意事项
- 两种方式都不会将完整Java SE代码打包进应用,仅用于让R8识别核心类,避免误优化;
- 若使用Android Gradle Plugin(AGP),部分场景下AGP已自动处理JDK类依赖,可先尝试移除手动配置看是否仍能正常构建。
内容的提问来源于stack exchange,提问作者AndreaF
相关产品推荐
相关产品推荐

