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();
}
}
注:因爲它們被提供我不能改變接口的佈局機器人。
Class2必須擴展某個類(如Foo)。你可以保留子句這樣的東西。 -keep class * extends Foo {public void function2;} – kujeensiti
Class2實現一個接口。它又被定義爲一個界面的內部界面(它來自Android)。我試過:'-keep class * extends package.OuterInterface {*; }'和'-keep class * extends package.OuterInterface.InnerInterface {*; }'和'-keep class * extends package.OuterInterface $ InnerInterface {*; }'。我也激活了'-keepattributes InnerClasses'。不幸的是不幸運。 –
請您分享接口的確切結構及其用法,以瞭解嵌套。 (完全不具有完全限定名稱) – kujeensiti