我已经创建了一个注释,可以帮助我在混淆步骤中标记应该完整保留的类。
然后我将使用以下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.txt
和apktool进行了模糊处理。
以下问题只关心保持classe,而不是其方法:
答案 0 :(得分:1)
从字节码的角度来看,内部类是普通的类;它们只有...$...
个名称(和InnerClasses属性,为了反射和编译器)。 ProGuard不会以不同方式对待它们。因此,您的附加规则仅匹配具有注释的内部类。我现在看到的最好的解决方案是指定主规则,然后注释内部类。
背景:ProGuard规则中的模式指定匹配的元素和作为结果保留的元素(-keep
,-keepclassmembers
和-keepclasseswithmembers
之间略有不同)。因此,您无法指定“如果某个类匹配,则保留其他类”。这很少需要,规则已经很复杂,但我正在考虑更广泛的扩展。