Proguard在Java

时间:2016-09-27 09:41:37

标签: java android proguard anonymous-class

当您在匿名类中声明匿名类时,我遇到了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提供的。

1 个答案:

答案 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
            }
          }
        }
     }
  }
}