当前位置: 首页 > 知识库问答 >
问题:

防止ProGuard混淆类成员名称

濮升
2023-03-14
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;
       }
    }
 }

我尝试使用opoints.message

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

我认为问题是:proguard将我的类的属性'opoints.message'重命名为简短的'a'

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>;
}

保留my one(静态)类的方法和属性的正确方法是什么?

共有1个答案

姚星河
2023-03-14

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

欲知更多信息,请阅读本文。

 类似资料:
  • 问题内容: 我的班有子班。 我将从解析中获得对象的价值: 我尝试使用。 当我运行我的应用程序而没有运行成功时。当我的应用崩溃时运行我的应用时。 我认为问题是:将班级的属性重命名为short 。 我尝试保持方法和属性的名称不变,但是将其重命名: 保留第一个(静态)类的方法和属性的名称的正确方法是什么? 问题答案: 感谢Waqas! 我为我的情况找到了解决方案: 另外,我不在课堂上使用,上述配置无需序

  • 我已经阅读了几篇关于proguard混淆的stackoverflow帖子 如何在使用ProGuard时保留/排除特定的包路径? 如何让Proguard忽略外部库? 如何在使用proguard进行混淆时从injar中排除特定的jar? 但我没有找到答案来排除一个特定的目录,以防止混淆。

  • 我尝试在android studio中使用Proguard,但Proguard似乎没有混淆类名,例如,我的应用程序结构和配置: 和配置 但当我尝试在应用程序中触发异常时: ADB控制台中列出了异常: 只有方法被混淆了,MainActivity.class没有

  • 我使用的是——保留类和——保留类成员,但这些似乎只保留类中的方法名称和字段,我想告诉Proproaurd不要碰特定方法内部的任何东西,即使是“for”循环或“if”语句,甚至变量名称!,我想看到一个方法在反编译后看起来与原始版本完全相同,就像您在调试模式下反编译程序时一样!,但只有一种方法而不是所有其他方法。 有没有办法使用proGuard做到这一点? 谢谢:)

  • 我对混淆有问题。为了获得更好的想象力: JAVA代码 本机代码 在我想发布一个混淆版本之前,一切都很好。这个类中的Java类(例如)和方法的名称被proGuard重命名为“a”和“a()”(这可能并不总是相同的),但在本机代码中,方法和类的原始名称保持不变,因为它被硬编码为字符串,如下所示: ...有没有办法动态设置方法名?

  • 我正在努力解决JavaFX应用程序的模糊问题。以本项目为基础: Proguard配置文件:-dontoptimized-dontshrink 有人有JavaFX模糊处理的经验吗?