繁体   English   中英

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

[英]proguard - what is difference between - keep and keep { } statement?

我无法完全理解 { ---- } 在 -keep 之后的意义,有人可以用下面的例子解释区别吗?

声明 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*(...); 
} 

这一行:

-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*(...); 
} 

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

-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 IE:

-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保留类成员和类本身。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM