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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我可以将反射与ProGuard混淆的类一起使用吗?相关的知识,希望对你有一定的参考价值。

我有一个类方法,我想使用invoke Reflection。 以下是我在Activity onCreate中的代码示例:

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

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

答案

ProGuard documentation提到以下内容:

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

但是,有些情况下ProGuard会自动处理Reflection。这些是:(请参阅最新列表的文档)

  • 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);

以上是关于我可以将反射与ProGuard混淆的类一起使用吗?的主要内容,如果未能解决你的问题,请参考以下文章

Proguard 可以混淆 Android 库项目 (APKLIB) 吗?

我如何让 proguard 与 sjersey 一起工作?

如何使用 Proguard 的 GUI?保持正确的类不被混淆的问题

使用混淆ProGuard压缩代码和资源/减少方法数量

Android proguard代码混淆

Proguard:如何避免缩小(和混淆)整个包以避免删除(和混淆)“未使用的方法”?