代码之家  ›  专栏  ›  技术社区  ›  Jinesh Francis

Proguard模糊注释

  •  7
  • Jinesh Francis  · 技术社区  · 6 年前

    我需要保持所有模型类都不模糊,所以我在proguard规则中添加了这一行以保持所有模型类:

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

    所有模型类都由该命令保留,但它仍然混淆了模型类内的注释。我尝试添加以下行:

    -keepattributes *Annotation*
    -keepattributes EnclosingMethod
    

    但结果仍然是一样的。我的模型类包含以下两个注释:

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

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

    6 回复  |  直到 4 年前
        1
  •  9
  •   Alexander Deych    6 年前

    尝试以下操作:

    -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上的官方回购中有一个proguard配置 https://github.com/google/gson/blob/master/examples/android-proguard-example/proguard.cfg

        2
  •  6
  •   Muzammil Husnain    6 年前

    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
    
        3
  •  3
  •   Robert K.    6 年前

    -保留@包装。注释ClassName公共类*

        4
  •  3
  •   T. Neidhart    6 年前

    规则

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

    将在包com中保留所有批注。谷歌。格森。注释,包括SerializedName和Expose您使用过的注释。

        5
  •  1
  •   Dus    6 年前

    添加到proguard:它可以防止特定类被混淆。

    1. 强制性的: -dontshrink . : https://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;
          }
      }
      

      }

    在proguard中,需要指定 Child 类别:

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

        6
  •  1
  •   Anh Tuan    4 年前

    您可能需要在项目中创建名为DontObfuscate的注释 更多信息请查看此 Managing obfuscation with annotations