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

时间:2017-01-04 12:31:38

标签: java android proguard inner-classes android-proguard

我已经创建了一个注释,可以帮助我在混淆步骤中标记应该完整保留的类。

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

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

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

@ProguardKeepEverything
public class APublicModel {
    private String aField;
}

但现在我有内部课程,如:

@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 *$** { *; }

但现在它只保留内部类(和名称)本身,但其字段和方法是混淆的。如何保持内部类的方法和字段不被混淆(即名称完好无损)?

我检查这些类是否使用seed.txtapktool进行了模糊处理。

以下问题只关心保持classe,而不是其方法:

1 个答案:

答案 0 :(得分:1)

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

背景:ProGuard规则中的模式指定匹配的元素和作为结果保留的元素(-keep-keepclassmembers-keepclasseswithmembers之间略有不同)。因此,您无法指定“如果某个类匹配,则保留其他类”。这很少需要,规则已经很复杂,但我正在考虑更广泛的扩展。