Android Studio Proguard / R8删除不应删除的类成员

aurhwmvo  于 2022-12-27  发布在  Android
关注(0)|答案(2)|浏览(134)

我在Profuard/ R8方面没有其他人那么有经验。但是,我想我在Android Studio中使用的Profuard/ R8工具中偶然发现了一个bug。
我有一些在独立应用程序中运行良好的Java代码,当我尝试在Android项目中使用它时,我遇到了崩溃。

Process: com.example.fragmentbasics, PID: 8642 java.lang.NoSuchMethodError: No virtual method findFirst()Ljava/util/Optional; in class Ljava/util/ServiceLoader; or its super classes (declaration of 'java.util.ServiceLoader' appears in /apex/com.android.art/javalib/core-oj.jar)

当我在调试器中查看代码时,它确实看起来好像R8工具已经删除了该方法。

我正在阅读一篇关于Proguard如何经常在反射方面犯错误的文章,这就是这个问题的实质。
我在proguard-android.txt文件中包含了以下几行

-keepclassmembers class java.util.ServiceLoader {
  <methods>;
}

但是,运行代码时不断抛出找不到方法错误。
关于如何强制Profuard/ R8不删除此方法,您有什么想法吗?

2cmtqfgy

2cmtqfgy1#

尝试使用

-keep class java.util.ServiceLoader{ *; }
5lwkijsr

5lwkijsr2#

尝试

-keepclassmembernames class java.util.ServiceLoader {
  java.util.Optional findFirst();
}

-dontoptimize class java.util.ServiceLoader

相关问题