我使用下面的 Proguard 配置构建了一个 Ant,它是由“android”命令行工具生成的,看起来非常简单。但是,当我使用此脚本构建应用程序时,应用程序在设备上执行时会崩溃,并出现一系列空指针异常(混淆过程以某种方式向代码添加错误)。为了修复该应用程序,我只是重新构建它,而没有通过 Proguard 运行它。
对于在 Android 应用中使用 Proguard 的人,您会提供什么建议,以便 a) 对应用进行优化和混淆到合理的程度,但 b) 功能完整性不会受到损害?
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-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
-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);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
最佳答案
我已经找到了针对我遇到的特定案例的解决方案。我将记录解决方案,因为我怀疑其他人可能会觉得它有用。
我有两个专门用于保存进/出 JSON API 调用的有效负载的类。我没有从混淆中排除这些类,因此 GSON 解析器无法正确创建对象,因为类成员名称与 JSON 参数名称不匹配。
所以这个故事的寓意是,如果在反序列化 JSON 数据以使用 GSON 或其他将 JSON 参数名称与类成员名称相匹配的工具创建对象时,请确保 Proguard 不会重命名它们。我看到的空引用异常是因为所有反序列化对象都是空白的。
我应该说我没有遇到 ClassNotFoundException,这是一个不同的问题,最初看起来非常莫名其妙的运行时错误,只是一个有趣的假设组合。
关于java - 如何在 Android 中使用 Proguard 并保护应用程序的功能完整性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5005810/