ProGuard 中的 -keep 和 -keepclassmembers 有啥区别?

Posted

技术标签:

【中文标题】ProGuard 中的 -keep 和 -keepclassmembers 有啥区别?【英文标题】:What is the difference between -keep and -keepclassmembers in ProGuard?ProGuard 中的 -keep 和 -keepclassmembers 有什么区别? 【发布时间】:2013-05-05 00:02:23 【问题描述】:

我通读了http://proguard.sourceforge.net/index.html#manual/usage.html,但无法理解它们的区别。

我用 2 个不同的选项进行了测试并反编译了结果。两者似乎产生相同的结果。

-keep class * implements android.os.Parcelable 
    *;


-keepclassmembers class * implements android.os.Parcelable 
    *;

【问题讨论】:

【参考方案1】:

第一个 (-keep) 将防止实现android.os.Parcelable 类和类成员被删除或重命名。

后者 (-keepclassmembers) 将保留实现android.os.Parcelable 的类的类成员不会被删除或重命名。

【讨论】:

你能澄清一下“被删除或重命名”吗? 收缩和混淆是 Proguard 的核心功能之一。 缩小(删除)混淆(重命名)

以上是关于ProGuard 中的 -keep 和 -keepclassmembers 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

Proguard 不保留堆栈跟踪中的行号和方法名称

Proguard中的* vs ** vs ***?

“不能为 child() 中的参数 'pathString' 传递 null”和其他 Proguard 和 Firebase 问题

proguard 规则中的双星号是啥意思?

android应用程序中的proguard

Proguard - 也使用模块中的 proguard 文件