Proguard 保留接口和抽象类的参数名称

Posted

技术标签:

【中文标题】Proguard 保留接口和抽象类的参数名称【英文标题】:Proguard keep parameter names for interface and abstract class 【发布时间】: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”标志的问题 【参考方案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 以寻找想法。

【讨论】:

以上是关于Proguard 保留接口和抽象类的参数名称的主要内容,如果未能解决你的问题,请参考以下文章

接口和抽象类

抽象类接口作为方法返回值和参数

接口抽象类

Java抽象类和接口详解

java中关键字和名词理解

抽象类和接口的对比