40

您好,我正在编写一个 Android 应用程序,并且我已经设置了 Proguard 来混淆我的应用程序。然而,我使用类加载器将不同的扩展动态加载到我的应用程序中。问题是,如果它们的名称被更改,它们将无法正确加载。如何防止 Proguard 混淆特定的类名?

4

4 回答 4

45

使用-keepnamesproguard.cfg 中的选项

请参阅手册 https://www.guardsquare.com/en/proguard/manual/usage#keepoptions

-keepnames类规范

class_specification 的-keep,allowshrinking缩写

指定要保留其名称的类和类成员,如果它们在收缩阶段没有被删除的话。例如,您可能希望保留实现 Serializable 接口的类的所有类名,以便处理后的代码与任何最初序列化的类保持兼容。完全不使用的类仍然可以删除。仅在混淆时适用。

于 2012-06-10T19:55:08.243 回答
41

这使类名保持不变:

-keepnames class com.somepackage.* 
于 2014-09-25T18:25:11.067 回答
16

对于不想让 ProGuard 更改任何类名的每个人的实用提示:

# please KEEP ALL THE NAMES
-keepnames class ** { *; }

这样,您将获得可读的堆栈跟踪,同时仍然丢弃您不需要的东西。:-)

于 2014-10-02T21:20:29.333 回答
4

如果有人对如何指定要保留的多个类名感兴趣,那么这些类可以用逗号分隔。例子:

-keepnames class com.foo.**,com.bar.** { *; }

也可以使用否定,因为通常只有自己的类会被混淆,并且可以保留第 3 方库:

-keepnames class !com.foo.**,!com.bar.** { *; }

请参阅Proguard 文档

于 2019-04-30T12:25:40.070 回答