Android Studio Private 方法在编译后成为公共最终方法

Android Studio Private method becomes public final after compile

提问人:alphanso 提问时间:2/21/2022 最后编辑:alphanso 更新时间:3/2/2022 访问量:182

问:

使用 android studio AGP 7.0、Java 11 和 minifyEnabled=true

以下是我的方法

private void init(){
}

编译后,这成为公共的最终 init(),因此我得到运行时崩溃,说 LinkageError,为什么访问说明符在编译后会发生变化?

java android-gradle-plugin proguard android-r8

评论

0赞 Sergio 2/21/2022
这不是 Java 中的有效方法定义
0赞 penkzhou 3/2/2022
你能分享整个崩溃堆栈吗?

答:

1赞 sgjesse 3/2/2022 #1

R8 执行整个程序优化,如果该方法没有保留规则,R8 可以对该方法执行任何它想要的事情,包括更改修饰符。如果要确保方法保持不变,可以添加如下所示的保留规则:

-keep class <class name holding method> {
  private void init();
}

则该方法不应被 R8 触及。

是由于在运行时添加 R8 未处理的代码引起的吗?对于整个程序的优化和 R8 未知代码的边界,必须由保留规则覆盖。LinkageError