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.classa.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());