如何不混淆界面方法&在Android中使用Proguard的参数?

时间:2016-02-09 11:16:19

标签: android obfuscation android-proguard

我有以下代码:

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);
} 

怎么可能?

4 个答案:

答案 0 :(得分:2)

您可以通过向// list of all components without enable field in it Component[] components = obj.GetComponents(typeof(Component)); int indexOfComponentToChange = 1; // index of the component to disable Behaviour castedToBehaviour = components[indexOfComponentToChange] as Behaviour; if ( castedToBehaviour != null ) { castedToBehaviour.enabled = false; } 添加额外标志来保留方法的参数。它们看起来像这样:

-keepattributes

不幸的是,这使得参数不仅在您想要的界面中被混淆,而且在整个项目中。也许那对你没问题。

如果您使用随Android SDK一起提供的默认proguard配置,那么您还可以使用特殊注释来防止某些类进行模糊处理。 Check it out

答案 1 :(得分:0)

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>;
}

答案 2 :(得分:0)

-keepattributes LocalVariableTable,LocalVariableTypeTable

上述keepattributes对我不起作用。但是-keepparameternames做到了。我将此添加到我们的Android库使用的内部Proguard配置中。其他非Keot类仍然对其参数进行了混淆。

注意:我正在使用R8进行模糊处理,这是使用Android Gradle插件since 3.4.0时的默认设置,此外,我们还将源和目标的兼容性强制为1.8(由于不相关的okhttp依赖关系)

答案 3 :(得分:-1)

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

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

如果您的界面不公开。

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