Proguard移除Java匿名类中的匿名类



我有一个问题,当你在一个匿名类中声明一个匿名类时,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还是我必须添加一个规则来让它工作?

更新1:

如所要求的结构,如果用于匿名类的接口。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
            }
          }
        }
     }
  }
}

相关内容

  • 没有找到相关文章

最新更新