当前位置: 首页 > 面试题库 >

适用于Android和GSON的ProGuard

魏宸
2023-03-14
问题内容

我正在为我的Android项目设置ProGuard。我的项目也使用GSON。

我已经研究了ProGuard配置与GSON和Android的兼容性,并遇到了由google-gson
https://code.google.com/p/google-gson/source/browse/trunk/examples/android-
proguard-
提供的示例示例/proguard.cfg。

ProGuard配置复制如下:

##---------------Begin: proguard configuration common for all Android apps ----------
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-dontpreverify
-verbose
-dump class_files.txt
-printseeds seeds.txt
-printusage unused.txt
-printmapping mapping.txt
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-allowaccessmodification
-keepattributes *Annotation*
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
-repackageclasses ''

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
-dontnote com.android.vending.licensing.ILicensingService

# Explicitly preserve all serialization members. The Serializable interface
# is only a marker interface, so it wouldn't save them.
-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}

# Preserve all native method names and the names of their classes.
-keepclasseswithmembernames class * {
    native <methods>;
}

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

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

# Preserve static fields of inner classes of R classes that might be accessed
# through introspection.
-keepclassmembers class **.R$* {
  public static <fields>;
}

# Preserve the special static methods that are required in all enumeration classes.
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep public class * {
    public protected *;
}

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}
##---------------End: proguard configuration common for all Android apps ----------

##---------------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  ----------

问题:

  1. 我看到该文件自2011年以来就没有更新过,是否仍建议使用?我问,因为从那时起Android / GSON发生了很大变化,所以我不知道上面有多少是不必要的或不正确的。

  2. 如果不建议这样做,那么在Android中是否有针对GSON的新推荐ProGuard配置?


问题答案:

我认为默认情况下,Android SDK中已包含您拥有的大多数设置。

因此,您可以删除其中的大多数,仅保留GSON专用部分。

我正在使用Android SDK Tools 22.6.3及更高版本的ProGuard在Eclipse中进行开发。

这是我用于GSON
2.2.4的内容(按照他们的示例):

##---------------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

# 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 mypersonalclass.data.model.** { *; }

它看起来和您所拥有的完全一样,只是我不需要有关注释的内容。

您可以看到我已经注释掉了一些自己添加的类。如果要序列化/反序列化自己的类,则需要在此处声明它们以代替对的引用mypersonalclass.data.model。这一点非常重要,因为您不希望ProGuard混淆GSON用于序列化的字段或类名。

我总是在其中保留这些类型的注释,因此我知道如何配置下一个库或应用程序



 类似资料:
  • 我已经编写了整型适配器,并用作注释来实现以下输出,但在gson库中编写的代码完全不允许使用注释配置进行空处理。 如果我取消注释1,2,4行和注释3行,那么我仍然没有实现我的愿望输出。 当我调试第189行的库代码(给定的屏幕截图)时,没有到达我的自定义适配器代码,因此空处理无法使用注释。有没有其他方法可以根据注释配置实现所需的输出? 期望输出: 猫科动物 - "" (用作注释并具有空值) phone

  • 问题内容: 我目前正在做一个小项目,该项目将从URL加载图像,调整大小,并使用指定的调色板将其颜色深度更改为仅16种颜色。我的主要问题是,我需要一个程序,可以在Android设备和台式计算机上使用。您知道在两个系统上都可以使用的良好图像处理库吗? 提前致谢。 问题答案: 有几种工具: 图片J,http: //rsbweb.nih.gov/ij/ 斐济,http://fiji.sc/wiki/ind

  • 问题内容: 如果我为桌面启动它,它运行得很好,但是为我的Android导出后,它在我启动该应用程序后立即崩溃。 所以我的问题…: 它适用于台式机而不适用于我的Android有什么问题? 。 Logcat 我是Java的新手,所以我希望它是正确的部分:x 问题答案: 有一些人例外,logcat说: 这是由于您的模拟器未将gpu用于图形处理,最好的解决方案是使用手机来测试您的应用程序 由于某些原因(可

  • 问题内容: 我正在尝试为Android创建一个仅向SSH服务器发送命令的应用程序。无需响应,我只需要能够发送命令即可。我想知道是否可以使用任何Java库? 不需要高级的东西,只需一个纯粹的连接即可发送命令。 问题答案: 您正在搜索JSch。 其他库是jaramiko,paramiko和trilead- ssh2 。connectbot项目是您可以浏览Trilead源代码的地方。请注意,connec

  • 问题内容: 我正在构建针对移动设备(特别是iPhone和Android)的Web应用程序。我正在使用ASP.NET MVC和JQuery构建它。在一页上,我有一个级联的下拉菜单。我为第一个下拉列表连接了change事件的函数,该函数进行了AJAX调用,并使用JSON响应填充了第二个下拉列表。所有这些都可以在我的台式机上正常运行,但不能在iPhone或Android手机上运行。第二个下拉列表未填充。

  • 问题内容: 我打算使用Google Documents List和Google Documents Spreadsheet API将数据库从我的应用程序上传到在线电子表格,然后进行编辑。 我只是想知道这些API是否是将Google文档用作我在应用程序中收集的数据的在线存储空间的正确方法。 我希望我能从可能有此经验的一些人那里得到反馈。 下面列出了两个API的链接: http://code.goog