我有一个问题,当你在一个匿名类中声明一个匿名类时,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
如果我将代码更改为只有一个"级别"的匿名类,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项目,尽管据我所知这应该没有关系。
我为Class1
尝试了所有不同类型的-keep
规则,但都不起作用。这是不支持Proguard还是我必须添加一个规则来让它工作?
如所要求的结构,如果用于匿名类的接口。Class2
接口定义如下:
public class Class2IntefaceEnclosingClass {
public interface Class2 {
void function2();
}
}
Class3
的接口略有不同:
public interface Class3IntefaceEnclosingInterface {
interface Class3 {
void function3();
}
}
注意:我不能改变界面的布局,因为它们是由android提供的。
您可以尝试在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
}
}
}
}
}
}