Proguard导致NoSuchMethodException

时间:2013-05-21 22:52:36

标签: android proguard

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) {
....
}

1 个答案:

答案 0 :(得分:0)

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

对于通过反射调用的所有方法,您必须明确地将它们从obfsucation中排除。使用该选项输出混淆映射文件,以查看您的规则是否具有所需的效果。