如何在 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? [复制]

如何在android studio中启用proguard? [重复]

在 Android 中使用 R8 和 Proguard 时如何保护数据模型类免受逆向工程的影响?