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 保留接口和抽象类的参数名称的主要内容,如果未能解决你的问题,请参考以下文章