【问题标题】:Prevent Proguard from obfuscating overriden method防止 Proguard 混淆被覆盖的方法
【发布时间】:2014-10-23 16:03:40
【问题描述】:

我在我的 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。)这是不可取的,并且会破坏我们的一些反射代码。有没有办法让注释适用于缩小覆盖?

【问题讨论】:

    标签: java reflection proguard obfuscation


    【解决方案1】:

    您还必须注释该方法。 javac 编译器添加了额外的合成方法,以正确覆盖基本方法。就 ProGuard 或 JVM 而言,您的方法与其他任何方法一样,因此被混淆了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-02
      • 2013-11-30
      • 2016-07-04
      • 2013-03-06
      • 1970-01-01
      • 2018-05-10
      • 2014-08-02
      • 1970-01-01
      相关资源
      最近更新 更多