如何在Android中使用Proguard不混淆接口方法及其参数?

16

我有以下代码:

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,rate和status)不要被混淆。即如下所示:

public interface interface1 {
    void method4(Integer ID);
    void method5(Integer rate, boolean status);
} 

怎么可能呢?


我不确定这是否对您有帮助。https://dev59.com/9V0a5IYBdhLWcg3wRWyV?rq=1 - DrunkenMaster
@user3796318 谢谢。我可以使用类及其方法和字段来完成此操作。但在处理接口时遇到了问题。如果您能分享将参数放在接口内的任何想法,我会很高兴。 - Pushpa
嗨,你解决了你的问题吗?@Han - frouo
如果你使用 -dontobfuscate?或者你只想让这个特定的方法不混淆? - Jose Gonzalez
4个回答

3
您可以通过向-keepattributes添加额外的标志来保留方法的参数。它们看起来像这样:
-keepattributes LocalVariableTable,LocalVariableTypeTable

很遗憾,这将导致不仅在您想要的接口中,而且在整个项目中防止参数混淆。也许对您来说这没问题。

如果您正在使用随Android SDK一起提供的默认proguard配置,则可以使用特殊注释来防止某些类被混淆。 查看


1
我只想保留在接口中定义的函数参数的变量名称,项目的其他部分仍应尽可能混淆。 - and_dev

1
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
请在您的代码中添加一些解释,以便其他人可以从中学习。 - Nico Haase

0
-keepattributes LocalVariableTable,LocalVariableTypeTable

上述的keepattributes对我没有起作用。然而,-keepparameternames有效。我将其添加到我们的Android库使用的内部Proguard配置中。其他非keep类仍然会使它们的参数混淆。

注意:我正在使用R8进行混淆,这是使用Android Gradle插件自3.4.0版本以来的默认设置,同时我们正在强制执行源和目标兼容性为1.8(由于不相关的okhttp依赖项)。


-1

ProGuard使用Java字节码的命名约定,如类文件名和堆栈跟踪中所见。因此:

-keep public interface com.somepackage.SomeClass$someInterface {*;}

如果您的接口不是公共的。
-keep interface com.somepackage.SomeClass$someInterface {*;}.

3
很遗憾,接口函数的参数名称未被保留。 - and_dev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接