【问题标题】:Prevent class member name obfuscation by ProGuard防止 ProGuard 混淆类成员名称
【发布时间】:2013-03-06 18:13:34
【问题描述】:

我的班级ClassMultiPoint 有子类。

public class ClassMultiPoints
 {
   public String message;
   public List<ClassPoints> data;

   public class ClassPoints
    {
      public String id;
      public List<ClassPoint> points;
      public class ClassPoint
       {
         public String speed;
         public String bearing;
       }
    }
 }

我将从解析 GSON 中获取对象 oPoints 的值:

oPoints = gson.fromJson( jsonString, ClassMultiPoints.class);

我尝试使用oPoints.message

当我在没有proguard 的情况下运行我的应用程序时,应用程序运行成功。 当我使用proguard 运行我的应用程序时,我的应用程序崩溃了。

我认为问题是:我的班级的proguard 将属性'oPoints.message' 重命名为短'a'

我尽量保持方法和属性的名称不变,但是proguard重命名它:

proguard.cfg:

-injars      bin/classes
-injars      libs
-outjars     bin/classes-processed.jar
-dontpreverify
-repackageclasses ''
-allowaccessmodification
-optimizations !code/simplification/arithmetic
-keepattributes *Annotation*
-dontskipnonpubliclibraryclasses
-optimizationpasses 5
-printmapping map.txt
-flattenpackagehierarchy

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.MapActivity
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider

-libraryjars  libs/commons-io-2.2.jar
-libraryjars  libs/ftp4j-1.7.1.jar
-libraryjars  libs/gson-2.2.2.jar

-keep public class org.apache.commons.io.**
-keep public class it.sauronsoftware.ftp4j.**
-keep public class com.google.gson.**

-keep public class com.mypackagename.ActivityMonitor$*

-keep public class * extends android.view.View {
    public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
    public void set*(...);
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers class * extends android.content.Context {
   public void *(android.view.View);
   public void *(android.view.MenuItem);
}

-keepclassmembers class * implements android.os.Parcelable {
    static android.os.Parcelable$Creator CREATOR;
}

-keepclassmembers class **.R$* {
    public static <fields>;
}

保留我的一个(静态)类的方法和属性名称的正确方法是什么?

【问题讨论】:

    标签: java android proguard obfuscation


    【解决方案1】:

    如果您不希望您的班级成员被混淆,请使用 Gson 提供的 SerializedName 注释。例如:

    public class ClassMultiPoints
    {
       @SerializedName("message")
       public String message;
       @SerializedName("data")
       public List<ClassPoints> data;
    
       ...
    
    }
    

    此外,请确保您也为 Gson 库添加了正确的 proguard 配置。例如:

    ##---------------Begin: proguard configuration for Gson ----------
    # Gson uses generic type information stored in a class file when working with
    #fields. Proguard removes such information by default, so configure it to keep
    #all of it.
    -keepattributes Signature
    
    # For using GSON @Expose annotation
    -keepattributes *Annotation*
    
    # Gson specific classes
    -keep class sun.misc.Unsafe { *; }
    #-keep class com.google.gson.stream.** { *; }
    
    # Application classes that will be serialized/deserialized over Gson
    -keep class com.google.gson.examples.android.model.** { *; }
    
    ##---------------End: proguard configuration for Gson ----------
    

    更多信息请阅读this

    【讨论】:

    • -keep class com.google.gson.examples.android.model.** { *;它对我有用,但是当我在 apk 上应用反向 engg 时,我得到了所有成员没有变化的模型类,它破坏了安全目的,没有其他选择,我们也可以混淆模型吗?
    • 您是否在班级成员之上使用@SerializedName 注释?因为如果你这样做了,那么你就不需要像使用 com.google.gson.examples.android.model.** { *; } 那样绕过 proguard 配置中的自定义类混淆。
    • 不,实际上我想混淆它。但现在我意识到,如果字段名称发生变化,那么它们将与 json 键不匹配,因此 gson 无法解析它。
    • 正是...这就是为什么我们需要使用 @SerializedName
    • 全班都可以使用这个选项吗?
    【解决方案2】:

    感谢瓦卡斯!

    我为我的情况找到了解决方案:

    -optimizationpasses 5
    -dump class_files.txt
    -printseeds seeds.txt
    -printusage unused.txt
    -printmapping mapping.txt
    -optimizations !code/simplification/arithmetic,!field/*,!class/merging*/
    -allowaccessmodification
    -repackageclasses ''
    
    -keep public class * extends android.app.Activity
    -keep public class * extends android.app.Application
    -keep public class * extends android.app.MapActivity
    -keep public class * extends android.app.Service
    -keep public class * extends android.content.BroadcastReceiver
    -keep public class * extends android.content.ContentProvider
    
    -libraryjars  libs/commons-io-2.2.jar
    -libraryjars  libs/gson-2.2.2.jar
    -keep public class org.apache.commons.io.**
    -keep public class com.google.gson.**
    -keep public class com.google.gson.** {public private protected *;}
    
    ##---------------Begin: proguard configuration for Gson ----------
    -keepattributes *Annotation*,Signature
    -keep class com.mypackage.ActivityMonitor.ClassMultiPoints.** { *; }
    -keep public class com.mypackage.ActivityMonitor$ClassMultiPoints     { public protected *; }
    -keep public class com.mypackage.ActivityMonitor$ClassMultiPoints$ClassPoints { public protected *; }
    -keep public class com.mypackage.ActivityMonitor$ClassMultiPoints$ClassPoints$ClassPoint { public protected *; }
    # To support Enum type of class members
    -keepclassmembers enum * { *; } 
    ##---------------End: proguard configuration for Gson ----------
    

    另外,我不在课堂上使用@SerializedName("message"),上面的配置无需序列化即可正常工作。

    【讨论】:

    • @iDroid Explorer 我使用 apkTool 来测试发布的 apk,但混淆对我不起作用,它没有重命名类
    • 此设置不允许混淆代码。您需要混淆代码吗?
    • 是的,这段代码没有混淆或者我正在测试错误的发布 apk
    【解决方案3】:

    我还发现在使用 Dexguard 的优化选项时需要-keepclassmembers。没有这个,我的几个模型对象无法反序列化

    ##---------------Begin: proguard configuration for Gson  ----------
    # Gson uses generic type information stored in a class file when working with fields. Proguard
    # removes such information by default, so configure it to keep all of it.
    -keepattributes Signature
    
    # For using GSON @Expose annotation
    -keepattributes *Annotation*
    
    # Application classes that will be serialized/deserialized over Gson, keepclassmembers
    -keep class com.myapp.model.** { *; }
    -keepclassmembers class com.myapp.model.** { *; }
    

    【讨论】:

    • 特别感谢-keepclassmembers class com.myapp.model.** { *; }。尽管我使用的是jackson lib而不是gson,但那条线帮助了我!谢谢。
    【解决方案4】:

    如果你像我一样使用@Expose 注解,你可以告诉 ProGuard 保留使用它注解的任何字段:

    # keep anything annotated with @Expose
    -keepclassmembers public class * {
        @com.google.gson.annotations.Expose *;
    }
    # Also keep classes that @Expose everything
    -keep @com.google.gson.annotations.Expose public class *
    

    【讨论】:

    • 根据 GSON javadoc @Expose 只能定位字段。所以第二条指令似乎没用
    【解决方案5】:

    要使您的类免于混淆,请保留 InnerClasses 的属性,保留您的类并保留该类的类成员,例如。

    -keepattributes InnerClasses
     -keep class com.yourproject.YourClass**
     -keepclassmembers class com.yourproject.YourClass** {
        *;
     }
    

    更多信息http://proguard.sourceforge.net/manual/examples.html

    【讨论】:

      【解决方案6】:

      你使用了一个内置的@Keep注解,请参考这个link

      【讨论】:

        【解决方案7】:

        Proguard 6.1 无法处理库中带有泛型的接口。请参阅此处的错误报告: https://sourceforge.net/p/proguard/bugs/765/

        【讨论】:

          【解决方案8】:

          您可以在所有请求类型类中跳过混淆

          open class Request
          data class Example(val name: String) : Request()
          

          proguard-rules.pro

          -keepclassmembers class * extends <your-package-name>.util.ws.Request { *; }
          

          GL

          【讨论】:

            【解决方案9】:

            这个帖子已经有了惊人的答案,但是不要忘记添加

            -keep public class * extends java.lang.Exception
            

            否则,当您在 firebase 上看到所有崩溃时,它们都会被混淆。

            在此处查看官方文档:https://firebase.google.com/docs/crashlytics/get-deobfuscated-reports?platform=android

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-08-02
              • 1970-01-01
              • 2012-04-20
              • 1970-01-01
              • 1970-01-01
              • 2015-04-02
              相关资源
              最近更新 更多