You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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:

  1. 解压java.base.jmod到临时目录:
    unzip "$JAVA_HOME/jmods/java.base.jmod" -d temp_jmod_dir
    
  2. 将解压后的classes目录打包为Jar:
    jar cvf java.base.jar -C temp_jmod_dir/classes .
    
  3. 在R8配置中引用这个Jar:
    -libraryjars path/to/java.base.jar(!module-info.class)
    

方法2:直接引用解压后的classes目录(更快捷)

如果不想生成Jar文件,也可以直接将解压后的classes目录作为库路径配置给R8:

  1. 先完成方法1的第一步解压操作;
  2. 在R8配置中添加:
    -libraryjars path/to/temp_jmod_dir/classes(!module-info.class)
    

注意事项

  • 两种方式都不会将完整Java SE代码打包进应用,仅用于让R8识别核心类,避免误优化;
  • 若使用Android Gradle Plugin(AGP),部分场景下AGP已自动处理JDK类依赖,可先尝试移除手动配置看是否仍能正常构建。

内容的提问来源于stack exchange,提问作者AndreaF

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 12:45:42