【发布时间】:2012-06-13 20:50:39
【问题描述】:
您好,我正在编写一个 Android 应用程序,并且我已经设置了 Proguard 来混淆我的应用程序。然而,我使用类加载器将不同的扩展动态加载到我的应用程序中。问题是,如果它们的名称被更改,它们将无法正确加载。如何防止 Proguard 混淆特定的类名?
【问题讨论】:
标签: java android obfuscation proguard
您好,我正在编写一个 Android 应用程序,并且我已经设置了 Proguard 来混淆我的应用程序。然而,我使用类加载器将不同的扩展动态加载到我的应用程序中。问题是,如果它们的名称被更改,它们将无法正确加载。如何防止 Proguard 混淆特定的类名?
【问题讨论】:
标签: java android obfuscation proguard
在 proguard.cfg 中使用 -keepnames 选项
参考手册 https://www.guardsquare.com/en/proguard/manual/usage#keepoptions:
-keepnamesclass_specification
-keep,allowshrinkingclass_specification 的缩写指定要保留其名称的类和类成员,如果它们在收缩阶段没有被删除的话。例如,您可能希望保留实现 Serializable 接口的类的所有类名,以便处理后的代码与任何最初序列化的类保持兼容。完全不使用的类仍然可以删除。仅在混淆时适用。
【讨论】:
这样可以保持类名不变:
-keepnames class com.somepackage.*
【讨论】:
给不想让 ProGuard 更改任何类名的每个人的实用提示:
# please KEEP ALL THE NAMES
-keepnames class ** { *; }
这样您将获得可读的堆栈跟踪,同时仍然丢弃您不需要的东西。 :-)
【讨论】:
-dontobfuscate 是禁用混淆的正确方法。
如果有人对如何指定要保留的多个类名感兴趣,那么这些类可以用逗号分隔。示例:
-keepnames class com.foo.**,com.bar.** { *; }
也可以使用否定,因为通常只有自己的类会被混淆,并且可以保留第 3 方库:
-keepnames class !com.foo.**,!com.bar.** { *; }
【讨论】: