当您在匿名类中声明匿名类时,我遇到了Proguard无法正常工作的问题。这就是基本示例中的样子:
public class Class1 {
public void function1 (){
new Class2(){
@Override
public void function2(){
new Class3(){
@Override
public void function3(){
// do something
}
}
}
}
}
}
在gradle构建脚本中,正在执行proguard。现在我收到以下错误:
my.package.Class1$2$1: can't find enclosing method 'void function2()' in program class my.package.Class1$2
如果我将代码更改为只有1个“级别”的匿名类,则proguard正在完成而没有错误。这有效:
public class Class1 {
public void function1 (){
Class3 class3Instance = new Class3(){
@Override
public void function3(){
// do something
}
}
new Class2(){
@Override
public void function2(){
//do something with class3Instance
}
}
}
}
该项目是一个Android项目,但据我所知,这应该不重要。
我为-keep
尝试了所有不同类型的Class1
规则,但没有任何效果。这不是Proguard支持的,还是我必须添加规则才能让它工作?
更新1:
请求结构,如果接口用于匿名类。
Class2
的接口定义如下:
public class Class2IntefaceEnclosingClass {
public interface Class2 {
void function2();
}
}
Class3
的界面略有不同:
public interface Class3IntefaceEnclosingInterface {
interface Class3 {
void function3();
}
}
注意:我无法更改接口的布局,因为它们是由android提供的。
答案 0 :(得分:1)
您可以尝试在function1(),function2()和function3()上使用@Keep注释。
public class Class1 {
@Keep
public void function1 (){
new Class2(){
@Keep
@Override
public void function2(){
new Class3(){
@Keep
@Override
public void function3(){
// do something
}
}
}
}
}
}