防止Proguard混淆被覆盖的方法

时间:2014-10-23 16:03:41

标签: java reflection proguard obfuscation

我在我的Proguard配置中使用此块来防止使用@AccessedViaReflection注释的方法被混淆,并且在简单的情况下它可以正常工作:

-keepclassmembers class * {
    @com.mimvista.AccessedViaReflection <fields>;
    @com.mimvista.AccessedViaReflection <methods>;
    @com.mimvista.AccessedViaReflection <init>(...);
}

但是,当类重写使用@AccessedViaReflection注释的方法并缩小返回类型时,重写的方法会被混淆。 (仅在缩小返回类型时才会出现此问题。)例如:

public class A {
   @AccessedViaReflection
   public Object get() {return null;}
}

public class B extends A {
   @Override
   public String get() {return "";}
}

在这种情况下,B的'get()'方法最终会被Proguard混淆。 (实际上,生成的类文件以2个方法结束。一个调用get()返回Object,另一个调用a()返回String。)这是不可取的,会破坏我们的一些反射代码。有没有办法让注释适用于缩小的覆盖?

1 个答案:

答案 0 :(得分:0)

您还必须注释该方法。 javac编译器添加了额外的合成方法,以正确覆盖基本方法。就ProGuard或JVM而言,您的方法只是一种方法,因此它是混淆的。