【问题标题】:Proguard causing NoSuchMethodExceptionProguard 导致 NoSuchMethodException
【发布时间】:2013-05-21 22:52:36
【问题描述】:
Class<?> c = Class.forName("co.uk.MyApp.dir.TargetClass");
Method main = c.getDeclaredMethod("main", Report_Holder.class);

一旦我准备好使用 Proguard 发布应用程序,就会引发“java.lang.NoSuchMethodException.main[class co.uk.MyApp.classes.Report_Holder]”错误。

我花了几个小时认为问题出在“co.uk.MyApp.dir.TargetClass”中,注释掉了一些东西,重新发布应用程序并重新测试。但事实证明,错误就在根源上,在:

Method main = c.getDeclaredMethod("main", Report_Holder.class);

然后我更新了 proguard-project.txt 以包括:

-dontobfuscate
-keeppackagenames

(我使用的是Lint建议的方法,该方法建议将代码放入project.properties并将配置放入文本文件中),例如:

proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt

但是添加这两行没有任何效果。

所以现在我想知道是否;

a) 我应该在 '-keeppackagenames' 等之上添加任何内容。

b) proguard.config 设置是否正确; ${sdk.dir} 实际上应该是 sdk 的正确 uri

它所针对的类是这样的:

public static void main(Report_Holder args) {
....
}

编辑

或者是因为我有 2 个这种类型的实例,都称为 'main' ?但在不同的活动中被调用。

Method main = c.getDeclaredMethod("main", Report_Holder.class);
Method main = c.getDeclaredMethod("main", OtherReport_Holder.class);

两个目标都是这样的:

public static void main(Report_Holder args) {
....
}

public static void main(OtherReport_Holder args) {
....
}

【问题讨论】:

  • main 应该是 main(String[] args)
  • 亚历克斯,您能详细说明一下吗?谢谢
  • 方法的名称 main 是标准入口点,使用名称 main 其他方法签名,工作,但会误导。所以最好选择另一个名字。
  • 所以我应该把它改成 'Method main = c.getDeclaredMethod("blah", Report_Holder.class);'和 'public static void blah(Report_Holder args) {' ?
  • 是的,至少出于设计目的,不要让自己感到困惑。这还不能解决您的问题,但只是第一步。那么你必须从混淆中排除 youmr blah 方法。 (查看 proguad 主页示例)。为了分析,你打印出 obfuscation.map 映射文件,看看 proguard 混淆了什么,什么没有。

标签: android proguard


【解决方案1】:

一旦你知道如何使用 proguard,你应该添加选项-keepattributes Signature 。这在使用泛型(集合)时是必要的。

对于所有通过反射调用的方法,您必须明确地将它们排除在混淆之外。使用输出混淆映射文件的选项,看看你的规则是否达到了预期的效果。

【讨论】:

  • 我在 proguard 中看不到对 -keepsignatures 的任何引用。但是,我已经按照您的建议更新了我的“主要”名称,并且对 proguard 进行了更多研究。正如你所说,它并没有解决我的问题。我已在此链接stackoverflow.com/questions/16703291/… 上发布了后续内容
猜你喜欢
  • 1970-01-01
  • 2020-09-06
  • 2016-11-19
  • 1970-01-01
  • 1970-01-01
  • 2017-05-16
  • 2019-01-09
  • 2018-01-23
  • 1970-01-01
相关资源
最近更新 更多