有没有办法只混淆真正的代码,而不是混淆库?

3

我在使用ProGuard混淆代码时遇到了一些问题。基本上,GSON库给了我很大的麻烦。

所以我想只混淆 com.mypackages.* 而不是混淆使用的库。

这种做法可行吗?

这个叫什么名字?我在混淆方面有点困惑,也找不到任何相关示例。

非常感谢任何提示。

编辑:

java.lang.AssertionError
        at com.google.gson.internal.bind.TypeAdapters$EnumTypeAdapter.<init>(Unknown Source)
        at com.google.gson.internal.bind.TypeAdapters$26.create(Unknown Source)
        at com.google.gson.Gson.getAdapter(Unknown Source)

添加后

-keepnames class com.google.gson.** {*;}

编辑2: 我一直在尝试新的事物,比如:

-keep class com.google.**
-keepnames class com.google.** {*;}
-keepnames enum com.google.** {*;}
-keepnames interface com.google.** {*;}

到目前为止,还没有运气。


是的,虽然你需要研究细节,但这是可能的。但请注意,每当您通过明确的名称调用某些内容时,特别是如果它是像一个众所周知的库或平台API这样的东西,您就会留下一个大提示,说明您的代码正在做什么。 - Chris Stratton
这是 ProGuard 的参考手册链接:http://proguard.sourceforge.net/#manual/introduction.html - kabuko
@Radu 不是很确定...我已经尝试了所有的方法,但仍然面临这个问题。几个月前我放弃了,但我想很快再试一次,不过现在,代码在生产环境中完全干净 :D - Reinherd
2
@kabuko 我的解决方法是这样的:将以下代码更改为 -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(); - Radu
@Radu 我目前正在处理其他更高优先级的任务 :P 所以我现在无法检查它,尽快我会回复你 :) - Reinherd
显示剩余3条评论
3个回答

1
我能想到的最简单的方法来防止GSON库被混淆是将以下内容添加到您的ProGuard配置文件中:
-keepnames com.google.gson.** {*;}

这个 keepnames 没有什么东西。 - Reinherd

0

使用-keepnames选项,ProGuard的混淆步骤将保留指定类、字段和方法的名称。如果它们没有被使用,ProGuard的缩小步骤和优化步骤仍然可以删除这些类、字段和方法本身。您应该使用更常见的-keep选项:

-keep class com.google.gson.** { *; }

这行代码保留了匹配的类、字段和方法及其原始名称。它还匹配接口类和枚举类。

请参阅ProGuard手册 > 用法 > 保留选项概述



0

我也曾花费时间与此纠结。在我的情况下,问题不在于 Gson 方面,而是它试图反序列化的枚举(在这种情况下是 MyClass.MyEnum)。我使用了以下方法:

-keep class com.google.gson.** { *; }
-keep enum com.abc.MyClass$MyEnum { *; }

在上面添加第二行代码后,我的程序成功地解决了问题,应用程序也恢复正常。希望这能帮到你!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接