如何在 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.txt
和 apktool 混淆了。
以下问题只关心保留 classe,而不关心它的方法:
- Android proguard, keep inner class of Inner class
- ProGuard: keep private Inner Class
- Exposing inner classes when obfuscating with ProGuard
从字节码来看,内部类是普通的类;它们只有 ...$...
个名称(和 InnerClasses 属性,为了反射和编译器)。 ProGuard 不会区别对待它们。因此,您的附加规则将仅匹配具有注释的内部 类 。我目前看到的最佳解决方案是指定主要规则,然后将内部 类 也注释掉。
背景:ProGuard 规则中的模式指定匹配的元素和作为结果保留的元素(-keep
、-keepclassmembers
和 -keepclasseswithmembers
之间略有不同).因此您不能指定 "IF some class is matched THEN keep some other class"。这很少需要,规则可能已经很复杂,但我正在考虑更通用的扩展。
我创建了一个注释,可以帮助我标记 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.txt
和 apktool 混淆了。
以下问题只关心保留 classe,而不关心它的方法:
- Android proguard, keep inner class of Inner class
- ProGuard: keep private Inner Class
- Exposing inner classes when obfuscating with ProGuard
从字节码来看,内部类是普通的类;它们只有 ...$...
个名称(和 InnerClasses 属性,为了反射和编译器)。 ProGuard 不会区别对待它们。因此,您的附加规则将仅匹配具有注释的内部 类 。我目前看到的最佳解决方案是指定主要规则,然后将内部 类 也注释掉。
背景:ProGuard 规则中的模式指定匹配的元素和作为结果保留的元素(-keep
、-keepclassmembers
和 -keepclasseswithmembers
之间略有不同).因此您不能指定 "IF some class is matched THEN keep some other class"。这很少需要,规则可能已经很复杂,但我正在考虑更通用的扩展。