Proguard 规则 -keep vs -keepclassmembers vs -keepclasseswithmembers

Proguard rules -keep vs -keepclassmembers vs -keepclasseswithmembers

阅读proguard rules

我发现自己面临三个看起来非常相似的术语 keep keepclassmembers keepclasswithmembers

我不明白这三个规则之间的区别,谁能更好地解释一下区别,也许还有一个例子

1) 保留 - 保留 classes

2) keepclassmembers - 保留 class 字段和方法等成员

3) keepclasseswithmembers - 保留 classes 如果他们满足基于成员

的某些条件

例子

1) 保留所有扩展 android.app.Activity

的 classes
-keep public class * extends android.app.Activity

2) 保留所有名为 CREATOR 的成员(静态字段),条件是它们正在实施 android.os.Parcelable

-keepclassmembers class * implements android.os.Parcelable { 
static ** CREATOR; 
} 

3) 保留所有 classes,如果它们有带有参数(Context,AttributeSet)或(Context,AttributeSet,int)的构造函数(下面提到的 init)。

-keepclasseswithmembers class * { 
public <init>(android.content.Context, android.util.AttributeSet); 
} 

-keepclasseswithmembers class * { 
public <init>(android.content.Context, android.util.AttributeSet, int); 
}