有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java防止ProGuard混淆类成员名称

我的类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;
       }
    }
 }

我将从parseGSON中获取对象oPoints的值:

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

我尝试使用oPoints.message

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

我认为问题是:proguard将我的类的属性'oPoints.message'重命名为short'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 安卓.app.Activity
-keep public class * extends 安卓.app.Application
-keep public class * extends 安卓.app.MapActivity
-keep public class * extends 安卓.app.Service
-keep public class * extends 安卓.content.BroadcastReceiver
-keep public class * extends 安卓.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 安卓.view.View {
    public <init>(安卓.content.Context);
    public <init>(安卓.content.Context, 安卓.util.AttributeSet);
    public <init>(安卓.content.Context, 安卓.util.AttributeSet, int);
    public void set*(...);
}

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

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

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

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

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

保持我的one(静态)类的方法和属性名称的正确方法是什么


共 (6) 个答案

  1. # 1 楼答案

    我还发现在使用Dexguard的Optimize选项时需要-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.** { *; }
    
  2. # 2 楼答案

    如果您不希望类成员被混淆,那么使用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

  3. # 3 楼答案

    谢谢Waqas

    我为我的案例找到了解决方案:

    -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"),上面的配置在没有序列化的情况下可以正常工作

  4. # 4 楼答案

    您使用了一个内置的@Keep注释,请参考此link

  5. # 5 楼答案

    如果你像我一样使用@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 *
    
  6. # 6 楼答案

    要从混淆中排除类,请保留InnerClass的属性,保留类并保留类的类成员,例如

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

    有关详细信息http://proguard.sourceforge.net/manual/examples.html