“-keep class ...”规则是否包括 public 和内部 classes?

Does "-keep class ..." rule include public and inner classes?

如果我有如下proguard规则...

-keep class com.mycompany.myapp.** { *; }

...那么下面的两条规则是不是已经过时和不必要了...

-keep public class com.mycompany.myapp.** { *; }
-keep class com.mycompany.myapp.SomeClass$* { *; }

?

即前一条规则是否取代并包括后两条规则?

你是对的

-keep class com.mycompany.myapp.** { *; }

覆盖其他两个规则。这是一个例子:

Proguard 之前:

package com.mycompany.myapp;
public class Main {
    public static void main(String[] args) { new Main().init(); }
    private void init(){
        PackageInnerClass pic1 = new Main.PackageInnerClass();
        PublicInnerClass pic2 = new Main.PublicInnerClass();
        PrivateInnerClass pic3 = new Main.PrivateInnerClass();
    }
    class PackageInnerClass { void method1() { System.out.println("Method 1"); } }
    public class PublicInnerClass { void method2() { System.out.println("Method 2"); } }
    private class PrivateInnerClass { void method3() { System.out.println("Method 3"); } }
}

Proguard 之后 (根据您的规则)

唯一的区别是 classes 被移动到它们自己的 .class 文件中。但在功能上它们是相同的。