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

问题描述 投票:0回答:1

我不能完全理解{----}之后的重要性,有人可以采取以下示例并解释其中的区别吗?

声明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*(...); 
} 
android android-studio proguard android-proguard
1个回答
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则保留班级成员和班级。

© www.soinside.com 2019 - 2024. All rights reserved.