【问题标题】:Proguard keep parameter names for interface and abstract classProguard 保留接口和抽象类的参数名称
【发布时间】:2017-04-05 04:50:14
【问题描述】:

我试图阻止 proguard 混淆接口(或抽象类)方法参数。

假设我的库中有这个接口:

package com.mypackage;
public interface MyLibListener {
    void onSomething(boolean success, String message); 
}

还有这个 proguard 文件:

-keepparameternames
-keep interface com.mypackage.MyLibListener {
    *;
}

然后我组装发布,我得到:

package com.mypackage;
public interface MyLibListener {
    void onSomething(boolean var1, String var2);
}

与抽象类或使用@Keep 注释相同。混淆选项keepparameternames 似乎只适用于普通课程。任何想法?谢谢!

(相关 SO:How to not obfuscate interface methods & it's parameters using Progaurd in android?Proguard keep interface method variable names

【问题讨论】:

  • 这个问题解决了吗?我有同样的问题
  • @sinek 我尝试了很多东西(当时我问过)但从未找到解决方案:(我最近没有尝试抱歉。如果你找到了方法,请告诉我们
  • 我已经解决了编译器“-parameters”标志的问题

标签: android proguard


【解决方案1】:

将以下 ProGuard options 添加到您的配置中。

-keepattributes 方法参数

如果您的类文件有方法参数元数据(使用 Java8 -parameters 或等编译...)`,ProGuard 将保留元数据。

【讨论】:

    【解决方案2】:

    保留所有接口方法:

    -keep interface * {
       <methods>;
    }
    

    保留所有可以通过反射使用的公共和受保护方法:

    -keepclassmembernames class * {
        public protected <methods>;
    }
    

    虽然我不明白,但为什么要保留 abstract 类,无论如何都无法实例化,因此保留和知道它们的名称毫无意义。理论上,可以用以-keep !abstract 开头的规则排除所有不是 abstract 的内容,但这有点多余。

    【讨论】:

      【解决方案3】:

      您的 proguard 文件可能缺少一些 -keepattributes,尤其是 -keepattributes Signature

      查看 proguard 文档中的 this example proguard configuration for a library 以寻找想法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-28
        • 2012-06-13
        • 2015-03-25
        • 2018-02-16
        • 1970-01-01
        • 2023-03-29
        • 2014-05-02
        相关资源
        最近更新 更多