Proguard 规则 -keep vs -keepclassmembers vs -keepclasseswithmembers

joh*_*lib 8 android proguard android-proguard

阅读proguard 规则

我发现我自己面对的三个似乎非常相似的术语 keep keepclassmembers keepclasswithmembers

我无法理解这三个规则之间的区别,有人可以更好地解释这种区别吗,也许还有一个例子

小智 12

1) keep - 保留类

2) keepclassmembers - 保留类成员,如字段和方法

3) keepclasseswithmembers - 如果类满足基于成员的某些条件,则保留类

例子

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

-keep public class * extends android.app.Activity
Run Code Online (Sandbox Code Playgroud)

2)如果他们正在实现 android.os.Parcelable,则在条件下保留所有名为 CREATOR 的成员(静态字段)

-keepclassmembers class * implements android.os.Parcelable { 
static ** CREATOR; 
} 
Run Code Online (Sandbox Code Playgroud)

3) 保留所有类,如果它们具有带参数( 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); 
} 
Run Code Online (Sandbox Code Playgroud)