如何在Android中包含带有R8的jmods?

ruoxqz4g  于 2022-11-27  发布在  Android
关注(0)|答案(1)|浏览(155)

对于较早的JDK版本,我在R8配置中包含了rt.jar

-libraryjars <java.home>/lib/rt.jar

为了满足非Android特定的各种Java库的要求(注意,这并不意味着整个rt.jar将包含在应用程序中,这只是一种避免R8优化剥离重要Java SE代码的实用方法,而无需逐个配置所有保留白名单)
对于8以上的JDK,rt.jar不再可用,并且已被jmods取代,搜索似乎是proguart语法,以包括与rt.jar等效的jmods替代项

-libraryjars  <java.home>/jmods/java.base.jmod(!**.jar,!module-info.class)

所以我已经尝试过了,但不幸的是,使用R8时,我得到了这个错误:

Unexpected input type. Only archive types are supported, e.g., .jar, .zip, etc.

正确的方法是什么?

cetgtptt

cetgtptt1#

当R8 * 不 * 用于Android项目(其中android.jar是运行时库)时,需要Java运行时库,该库在Java 8之前位于rt.jar中。对于更高版本的JDK,文件系统提供程序包含在$JAVA_HOME/lib/jrt-fs.jar中。R8支持通过将JAVA_HOME目录作为库路径传递给R8来使用该库,因此:

$JAVA_HOME/bin/java -cp r8-jar com.android.tools.r8.R8 --lib $JAVA_HOME ...

将适用于所有JDK版本。如果JAVA_HOME具有使用的rt.jar,则使用文件系统提供程序查找运行时库。请参阅此处处理此问题的代码。
注意,当在配置文件中使用-libraryjars时,此操作不起作用,仅当--lib参数直接指向R8时。在该文件上打开issue 260213385
还要注意,当加载文件系统提供程序时,它将始终公开 running JVM的运行时,因此这样做

$JAVA_HOME_1/bin/java -cp r8-jar com.android.tools.r8.R8 --lib $JAVA_HOME_2 ...

如果JAVA_HOME_2用于JDK-9或更高版本,您仍将看到JAVA_HOME_1的运行时。

相关问题