我试图混淆我的Android项目代码,在proguard.cfg中包含以下内容时,我设法使ProGuard正常工作:
-keep class javax.** { *; }
-keep class org.codehaus.jackson.** { *; }
-keep class org.springframework.** { *; }
-keep class com.google.ads.**
这些是我在项目中使用的第三方依赖性(spring android,google ads等)。
问题是,在手机/模拟器上运行最终apk时,出现NullPointerException。
似乎我的代码(经过混淆的类,例如ab等)正在从这些第三方依赖项调用经过混淆的方法和类,但是类名现在有所不同(例如:名为Foo的类仍然是Foo,因为我并未对其进行混淆,但是我的实际代码调用了其他内容)。
有没有人设法使这种设置起作用?我也应该混淆这些第三方库吗?
最佳答案
不一定总是以您的方式保留第三方库,但是如果出现问题,这是一个很好的第一步。
如果已处理的代码与序列化数据不兼容,则您可能仍会遇到JSON序列化/反序列化的问题。然后,您必须确保还保留序列化的类和字段,以防止ProGuard删除或重命名它们。
同样,如果删除或重命名带注释的类,字段和方法,则可能会遇到Spring问题。您必须保持它们。您还必须保留注释本身:
-keepattributes *Annotation*,Signature
从本质上讲,这始终是反射失败的问题,因为ProGuard无法预见并已删除或重命名了部分代码。 NullPointerException的堆栈跟踪应提供有关查找位置的更多信息。
有关更多建议,请参见cfr。 ProGuard手册> Troubleshooting。