2

我试图混淆我的 Android 项目代码,当在我的 proguard.cfg 中包含以下内容时,我设法让 ProGuard 工作:

-keep class javax.** { *; }
-keep class org.codehaus.jackson.** { *; }
-keep class org.springframework.** { *; }
-keep class com.google.ads.**

这些是我在项目中使用的第 3 方依赖项(spring android、google ads 等)。

问题是,在我的手机/模拟器上运行最终的 apk 时,我得到了 NullPointerException。似乎我的代码(混淆的类,如 ab 等)正在从这些 3rd 方依赖项中调用混淆的方法和类,但类名现在不同(例如:名为 Foo 的类仍然是 Foo 因为我没有混淆它但是我的实际代码调用了其他东西)。

有没有人设法让这种设置工作?我也应该混淆这些 3rd 方库吗?

4

1 回答 1

1

并不总是需要以您的方式保留第三方库,但如果出现问题,这是一个很好的第一步。

如果处理的代码与序列化数据不兼容,您可能仍会遇到 JSON 序列化/反序列化问题。然后,您必须确保还保留序列化的类和字段,以防止 ProGuard 删除或重命名它们。

同样,如果带注释的类、字段和方法被删除或重命名,您可能会看到 Spring 出现问题。你必须保留它们。您还必须保留注释本身:

-keepattributes *Annotation*,Signature

本质上,它总是一个反射问题,因为 ProGuard 无法预见它并删除或重命名了部分代码,所以它总是失败。NullPointerException 的堆栈跟踪应提供有关查看位置的更多信息。

如需更多建议,请参阅 CFR。ProGuard 手册 >故障排除

于 2013-06-02T14:19:34.747 回答