如何在 Android 中使用 Proguard 不混淆接口方法及其参数?
Posted
技术标签:
【中文标题】如何在 Android 中使用 Proguard 不混淆接口方法及其参数?【英文标题】:How to not obfuscate interface methods & its parameters using Proguard in Android? 【发布时间】:2016-05-19 08:29:04 【问题描述】:我有以下代码:
public class MyClass
public void method1(Integer marks)
private String method3(String name)
public interface interface1
void method4(Integer ID);
void method5(Integer rate, boolean status);
我用过 progaurd-rules.pro
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-keepparameternames
-keep public class *
-keepclassmembers public class *
public *;
-keep public interface packageName.MyClass$interface1 *;
混淆代码如下:
public class MyClass
public void method1(Integer marks)
private String a(String var1)
public interface interface1
void method4(Integer var1);
void method5(Integer var1, boolean var2);
我希望接口方法变量(ID、速率和状态)不要混淆。即如下
public interface interface1
void method4(Integer ID);
void method5(Integer rate, boolean status);
这怎么可能?
【问题讨论】:
我不确定这是否对您有帮助。 ***.com/questions/30526173/… @user3796318 谢谢。我可以使用类及其方法和字段来做到这一点。但是在处理接口时遇到了问题。如果您分享将参数保留在界面内的任何想法,我很高兴。 您好,您的问题解决了吗? @韩 如果你使用-dontobfuscate?还是您只想不混淆这个特定的方法? 【参考方案1】:您可以通过向-keepattributes
添加额外的标志来保留方法的参数。它们看起来像这样:
-keepattributes LocalVariableTable,LocalVariableTypeTable
不幸的是,这不仅在您想要的界面中,而且在整个项目中都可以防止参数混淆。也许这对你来说很好。
如果您使用的是随 android SDK 一起提供的默认 proguard 配置,那么您还可以使用特殊注释来防止某些类被混淆。 Check it out.
【讨论】:
我只想在接口中定义的函数中保留参数的var名称,项目的整个其他部分仍应尽可能地混淆【参考方案2】:public interface SSOListener
void sendDataToAnalytics(String event, JSONArray object);
// In my case JsonArray was obfuscated.
Solution :
-keep class org.json.JSONArray**, **
protected <fields>;
public <fields>;
<methods>;
【讨论】:
请在您的代码中添加一些解释,以便其他人可以从中学习【参考方案3】:-keepattributes LocalVariableTable,LocalVariableTypeTable
上面的keepattributes对我不起作用。但是-keepparameternames
做到了。我将此添加到我们的 Android 库使用的内部 Proguard 配置中。其他非 keot 类的参数仍然被混淆。
注意:我使用 R8 来实际混淆,这是使用 Android Gradle 插件 since 3.4.0 时的默认设置,而且我们正在强制对 1.8 的源和目标兼容性(由于不相关的 okhttp 依赖)
【讨论】:
【参考方案4】:ProGuard 使用 Java 字节码的命名约定,如类文件名和堆栈跟踪中所示。因此:
-keep public interface com.somepackage.SomeClass$someInterface *;
如果您的界面不公开。
-keep interface com.somepackage.SomeClass$someInterface *;.
【讨论】:
遗憾的是没有保留接口函数的参数名称以上是关于如何在 Android 中使用 Proguard 不混淆接口方法及其参数?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Eclipse 中使用 Proguard 混淆 Android 库(.jar 文件)
如何在 Android 中使用 Proguard 不混淆接口方法及其参数?
如何在 android studio gradle 中降级 proguard 版本?
如何在android studio中启用proguard? [复制]