我可以将反射与 ProGuard 混淆类一起使用吗?

mav*_*ros 3 java reflection android proguard

我有一个我想invoke使用的类方法Reflection
这是我的代码示例Activity onCreate

try {
    aMethod = getClass().getDeclaredMethod("myMethodName", SomeParameter.class);
} catch (NoSuchMethodException e) {
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

当我直接从 Android Studio 运行它时,它可以工作,但是当我创建发布版本时,ProGuard 不会自动更改方法名称。我能做什么?

mav*_*ros 5

ProGuard 文档提到了以下内容:

通常不可能计算出哪些类必须保留(使用它们的原始名称),因为例如类名可能是从配置文件中读取的。因此,您必须在 ProGuard 配置中使用相同的简单 -keep 选项指定它们。

不过,也有一些案件中,ProGuard的自动处理思考。这些是以下内容:(请参阅文档以获取最新列表)

  • Class.forName("SomeClass") SomeClass.class
  • SomeClass.class.getField("someField")
  • SomeClass.class.getDeclaredField("someField")
  • SomeClass.class.getMethod("someMethod", new Class[] {})
  • SomeClass.class.getMethod("someMethod", new Class[] { A.class })
  • SomeClass.class.getMethod("someMethod", new Class[] { A.class, B.class })
  • SomeClass.class.getDeclaredMethod("someMethod", new Class[] {})
  • SomeClass.class.getDeclaredMethod("someMethod", new Class[] { A.class })
  • SomeClass.class.getDeclaredMethod("someMethod", new Class[] { A.class, B.class })
  • AtomicIntegerFieldUpdater.newUpdater(SomeClass.class, "someField")
  • AtomicLongFieldUpdater.newUpdater(SomeClass.class, "someField")
  • AtomicReferenceFieldUpdater.newUpdater(SomeClass.class, SomeType.class, "someField")

所以,就我而言,我的错误是我使用getClass().
以下行确实很好用。

aMethod = MainActivity.class.getDeclaredMethod("myMethodName", SomeParameter.class);
Run Code Online (Sandbox Code Playgroud)