【问题标题】:Proguard obfuscating AnnotationsProguard 混淆注解
【发布时间】:2018-01-22 07:39:18
【问题描述】:

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

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

所有模型类都被此命令保存,但它仍然混淆了模型类中的注释。我尝试添加以下行:

-keepattributes *Annotation*
-keepattributes EnclosingMethod

但是,结果还是一样的。我的模型类包含这两个注释:

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

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

【问题讨论】:

标签: android proguard obfuscation


【解决方案1】:

试试这个:

-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

其实在githubhttps://github.com/google/gson/blob/master/examples/android-proguard-example/proguard.cfg的官方repo中有一个proguard config

【讨论】:

    【解决方案2】:

    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】:

      -keep @package.annotationclassname 公共类 *

      【讨论】:

      • 我已经尝试过了,但没有用。它仍在混淆注释
      • 你能在这里写下你的规则吗?也许有一个错误。
      • -keep @com.google.gson.annotations.SerializedName 公共类 *
      【解决方案4】:

      规则

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

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

      【讨论】:

        【解决方案5】:

        添加到您的 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;
              }
          }
          

          }

        在proguard中,需要指定Child类:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 2017-04-01
            • 1970-01-01
            • 2019-07-20
            • 2013-09-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-01-21
            • 1970-01-01
            相关资源
            最近更新 更多