2016-09-27 166 views
12

我有一個問題,當您在匿名類中聲明一個匿名類時,Proguard不工作。這是一個基本示例中的樣子:Proguard在Java匿名類中刪除匿名類

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支持,還是我必須添加一條規則才能使其工作?

UPDATE 1:

作爲請求的結構,如果用於匿名類的接口。 爲Class2的接口被定義爲如下:

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

Class3的接口是稍有不同:

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

注:因爲它們被提供我不能改變接口的佈局機器人。

+1

Class2必須擴展某個類(如Foo)。你可以保留子句這樣的東西。 -keep class * extends Foo {public void function2;} – kujeensiti

+0

Class2實現一個接口。它又被定義爲一個界面的內部界面(它來自Android)。我試過:'-keep class * extends package.OuterInterface {*; }'和'-keep class * extends package.OuterInterface.InnerInterface {*; }'和'-keep class * extends package.OuterInterface $ InnerInterface {*; }'。我也激活了'-keepattributes InnerClasses'。不幸的是不幸運。 –

+1

請您分享接口的確切結構及其用法,以瞭解嵌套。 (完全不具有完全限定名稱) – kujeensiti

回答

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