proguard - keep和keep {}语句有什么区别?

时间:2017-12-22 14:46:34

标签: android android-studio proguard android-proguard

未能充分理解{----}之后的重要性 - 请问有人可以采取以下示例并解释其中的区别吗?

声明1

-keep public class * extends android.view.View ; 

声明2

-keep public class * extends android.view.View { 
  public <init>(android.content.Context); 
  public <init>(android.content.Context, android.util.AttributeSet); 
  public <init>(android.content.Context, android.util.AttributeSet, int); 
  public void set*(...); 
} 

声明3

-keepclassmembers public class * extends android.view.View { 
  public <init>(android.content.Context); 
  public <init>(android.content.Context, android.util.AttributeSet); 
  public <init>(android.content.Context, android.util.AttributeSet, int); 
  public void set*(...); 
} 

1 个答案:

答案 0 :(得分:2)

这一行:

-keep public class * extends android.view.View ; 

阻止单个类被混淆,而这个:

-keep public class * extends android.view.View { 
  public <init>(android.content.Context); 
  public <init>(android.content.Context, android.util.AttributeSet); 
  public <init>(android.content.Context, android.util.AttributeSet, int); 
  public void set*(...); 
} 

阻止(在这种情况下)特定方法被混淆。如果涉及括号,则表示该语句适用于多个项目。它也可以用来保存多个类,或者其他你可以保留其他东西的东西。您也可以将它用于packages或通过包中的特定类。由于通配符,整个系统是灵活的。基本上是:

-keep something;

意味着保持一个,而:

- keep something {
    somethingElse
}

根据参数指定要保留的内容。意思是它可以指定多个来保持。 (评论那个版本:)

- keep something {//When something
    somethingElse//keep somethingElse
    //... and more as needed
}

它在某种程度上与if语句相当。你有两个不同的:

if(something)
     //single line for action

if(something){
    //Do multiple things
}

基本上:

-keep //keep if
     public class * extends Something //the class extends something

-keep //if
    public class * extends Something //the class extends something
    {
        field1//keep field1
        //and whatever else is supplied
    }

你的第三个例子:

-keep public keepclassmembers * extends android.view.View { 
  public <init>(android.content.Context); 
  public <init>(android.content.Context, android.util.AttributeSet); 
  public <init>(android.content.Context, android.util.AttributeSet, int); 
  public void set*(...); 
} 

错了。 keepclassmembers是您使用而非-keep 的内容。即:

-keepclassmembers public class * extends android.view.View {
  public <init>(android.content.Context); 
  public <init>(android.content.Context, android.util.AttributeSet); 
  public <init>(android.content.Context, android.util.AttributeSet, int); 
  public void set*(...); 
}

-keepclassmembers保留班级成员,而-keep则保留班级成员和班级。