【问题标题】:How to not obfuscate interface methods & its parameters using Proguard in Android?如何在 Android 中使用 Proguard 不混淆接口方法及其参数?
【发布时间】: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);
} 

这怎么可能?

【问题讨论】:

  • 我不确定这是否对您有帮助。 stackoverflow.com/questions/30526173/…
  • @user3796318 谢谢。我可以使用类及其方法和字段来做到这一点。但是在处理接口时遇到了问题。如果您分享将参数保留在界面内的任何想法,我很高兴。
  • 您好,您的问题解决了吗? @韩
  • 如果你使用-dontobfuscate?还是您只想不混淆这个特定的方法?

标签: android obfuscation android-proguard


【解决方案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 {*;}.
    

    【讨论】:

    • 遗憾的是没有保留接口函数的参数名称
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多