【问题标题】:proguard - what is difference between - keep and keep { } statement?proguard - keep 和 keep { } 语句有什么区别?
【发布时间】:2021-01-11 17:32:31
【问题描述】:

我无法完全理解 -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*(...); 
} 

【问题讨论】:

    标签: android proguard


    【解决方案1】:

    这一行:

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

    【讨论】:

    • 在这种情况下,keep {} 与 keepclassmembers {} 有何不同,因为两者都只阻止成员。我已经更新为声明 3 了?
    • 声明 3 是错字,感谢您的纠正。所以我的理解是 Statement 1 - 防止类 View 被混淆 Statement 2 - 防止某些方法,即 public (android.content.Context);介于 {} 之间的内容被混淆 声明 3 - 防止某些方法,即 public (android.content.Context);在 {} 之间来自被混淆虽然我理解 keep 和 keepclassmembers 之间的区别,但在这种特定情况下,语句 2 和语句 3 的结果将是相同的,如果我错了,请更正。
    • @Girish 是的,它会是一样的。但是使用-keepclassmembers(AFAIK 和 IIRC)你不能保留嵌套类。所以如果你有一个嵌套类,它仍然会被混淆并且不能与-keepclassmembers
    • -keep 类 * 是否也保留了 lass 的成员?看到一些配置有这两个规则: -keep public class com.google.gson.** -keep public class com.google.gson.** {public private protected *;} 为什么?见stackoverflow.com/questions/65613612/…,谢谢!
    猜你喜欢
    • 2013-05-05
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多