Proguard 如何跳过一些保留名称作为映射结果
How proguard can skip some reserved names as mapping result
我正在开发一个 gradle 插件。它在基于 mapping.txt 的 proguard 之后生成一个源 java 文件。内容如下。
public class bmdb {
private static Map<Class<?>, Injector<Object>> map = new HashMap<>();
static {
try {
map.put(a.a.b.c.class, new a.a.b.d());
} catch (Exception e) {
e.printStackTrace();
}
}
public static Map<Class<?>, Injector<Object>> a() {
return map;
}
}
而这个java文件将被编译成class文件。但是,有时映射的结果会是 java 个关键字,例如 a.a.for.class
、a.a.int.class
。并且编译会失败。
所以我想知道proguard是否有任何选项可以排除映射结果中的某些单词。
您可以为 class 名称指定自定义混淆字典,如下所示:
-classobfuscationdictionary dict.txt
该文件应该是一个简单的文本文件,其中包含用于混淆的有效 characters/strings,例如:
a
b
c
d
e
f
你可能仍然会得到保留字,但如果你去掉所有元音字母,我认为它应该工作得很好。
最后发现proguard不支持这样的配置。
我使用以下解决方法:
1. 我写了一个包含 Java 个关键字的字符串数组,如下所示:
String[] keyWords = ["do", "if", ...];
2.如果proguard结果在上面的数组中,我会检查它。如果为 NO,将使用正常 new abc()
,如果为 YES,将使用反射 Class.forName("for")
。
所以结果可能如下所示:
map.put(a.a.b.c.class, new d());
map.put(a.a.b.d.class, Class.forName("for").newInstance());
我正在开发一个 gradle 插件。它在基于 mapping.txt 的 proguard 之后生成一个源 java 文件。内容如下。
public class bmdb {
private static Map<Class<?>, Injector<Object>> map = new HashMap<>();
static {
try {
map.put(a.a.b.c.class, new a.a.b.d());
} catch (Exception e) {
e.printStackTrace();
}
}
public static Map<Class<?>, Injector<Object>> a() {
return map;
}
}
而这个java文件将被编译成class文件。但是,有时映射的结果会是 java 个关键字,例如 a.a.for.class
、a.a.int.class
。并且编译会失败。
所以我想知道proguard是否有任何选项可以排除映射结果中的某些单词。
您可以为 class 名称指定自定义混淆字典,如下所示:
-classobfuscationdictionary dict.txt
该文件应该是一个简单的文本文件,其中包含用于混淆的有效 characters/strings,例如:
a
b
c
d
e
f
你可能仍然会得到保留字,但如果你去掉所有元音字母,我认为它应该工作得很好。
最后发现proguard不支持这样的配置。
我使用以下解决方法:
1. 我写了一个包含 Java 个关键字的字符串数组,如下所示:
String[] keyWords = ["do", "if", ...];
2.如果proguard结果在上面的数组中,我会检查它。如果为 NO,将使用正常 new abc()
,如果为 YES,将使用反射 Class.forName("for")
。
所以结果可能如下所示:
map.put(a.a.b.c.class, new d());
map.put(a.a.b.d.class, Class.forName("for").newInstance());