如何在 Proguard 中保留内部 Class 的字段和方法(不仅是 Class 本身)

How to keep Fields and Methods of Inner Class in Proguard (Not only the Class itself)

我创建了一个注释,可以帮助我标记 class 那些应该在混淆步骤中完整保留的内容。

然后我将使用以下 proguard 配置来保留所有内容:

-keep @com.my.project.annotations.ProguardKeepEverything class * { *; }

因此将保留以下 class 及其成员(包括名称):

@ProguardKeepEverything
public class APublicModel {
    private String aField;
}

但现在我的内心 class 像:

@ProguardKeepEverything
public class APublicModel {
    private String aField;

    public static class InnerPublicClass {
        private String innerAField; 
    }
}

所以我添加了以下规则:

-keep @com.my.project.annotations.ProguardKeepEverything class *$* { *; }

也尝试过

-keep @com.my.project.annotations.ProguardKeepEverything class *$** { *; }

但现在它只保留内部 class(和名称)本身,但它的字段和方法被混淆了。如何防止内部 classes 的方法和字段被混淆(即名称完好无损)?

我检查 classes 是否被 seed.txtapktool 混淆了。


以下问题只关心保留 classe,而不关心它的方法:

从字节码来看,内部类是普通的类;它们只有 ...$... 个名称(和 InnerClasses 属性,为了反射和编译器)。 ProGuard 不会区别对待它们。因此,您的附加规则将仅匹配具有注释的内部 类 。我目前看到的最佳解决方案是指定主要规则,然后将内部 类 也注释掉。

背景:ProGuard 规则中的模式指定匹配的元素和作为结果保留的元素(-keep-keepclassmembers-keepclasseswithmembers 之间略有不同).因此您不能指定 "IF some class is matched THEN keep some other class"。这很少需要,规则可能已经很复杂,但我正在考虑更通用的扩展。