Proguard 在 Java 中的 Anonymous 类中删除了 Anonymous 类

2022-09-04 23:29:54

我有一个问题,当您在匿名类中声明匿名类时,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项目,尽管据我所知,这应该无关紧要。

我尝试了所有不同的规则,但没有任何效果。这是Proguard不支持的,还是我必须添加规则才能使其正常工作?-keepClass1

更新 1:

根据要求结构,如果用于匿名类的接口。的接口定义如下:Class2

public class Class2IntefaceEnclosingClass {
    public interface Class2 {
        void function2();
    }
}

的接口略有不同:Class3

public interface Class3IntefaceEnclosingInterface {
    interface Class3 {
        void function3();
    }
}

注意:我无法更改界面的布局,因为它们是由Android提供的。


答案 1

您可以尝试使用函数 1()、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
            }
          }
        }
     }
  }
}

答案 2

推荐