Proguard混淆了注释

时间:2018-01-22 07:39:18

标签: android obfuscation android-proguard

我需要保持所有模型类不被混淆,我在proguard规则中添加了这一行以保留所有模型类。

-keep class my_package_name.model.** { *; }

此命令保留所有模型类,但仍然模糊了Model类中的注释。我尝试添加以下行

-keepattributes *Annotation*
-keepattributes EnclosingMethod

但结果仍然相同。我的模型类包含这两个注释

@SerializedName("message")
@Expose
private String message;

如何保持两个注释不被混淆?

6 个答案:

答案 0 :(得分:3)

使用字段时,Gson使用存储在类文件中的泛型类型信息。 Proguard默认会删除此类信息,因此请将其配置为保留所有信息。

尝试添加

-keepattributes Signature
-keepattributes EnclosingMethod
-keepattributes InnerClasses
-keepattributes Annotation

使用GSON @Expose注释

-keepattributes *Annotation*

对于Gson特定类

-keep class sun.misc.Unsafe { *; }

防止proguard从TypeAdapterFactory,JsonSerializer,JsonDeserializer实例中剥离接口信息(因此它们可以在@JsonAdapter中使用)

-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer

答案 1 :(得分:3)

试试这个:

-keepattributes *Annotation*
-keepattributes Signature
-dontnote sun.misc.**

-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer

实际上,github https://github.com/google/gson/blob/master/examples/android-proguard-example/proguard.cfg上的官方报告中有一个proguard配置

答案 2 :(得分:2)

-keep @package.annotationclassname public class *

答案 3 :(得分:1)

添加到您的proguard:它阻止特定类被混淆。

  1. 必填:-dontshrinkhttps://www.guardsquare.com/en/proguard/manual/usage
  2. 非强制性:尝试使用-dontoptimize
  3. 我真的不明白这个问题,你指的是一个领域还是内部阶级? 如果类中有内部类,则需要指定其内部字段。 例如,如果这是类:

    public class Parent {
    
    protected Child child;
    
    protected class Child {
        private String name;
        private int age;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }
    

    }

  4. 在proguard中,您需要指定Child class:

    -keep class com.package.name.Parent$Child {*; }

答案 4 :(得分:1)

您可能需要在项目中创建名为DontObfuscate的注释 更多检查这个 Managing obfuscation with annotations

答案 5 :(得分:1)

规则

-keep class com.google.gson.annotations.*

会将所有注释保留在com.google.gson.annotations包中,包括您使用过的SerializedName和Expose。