0
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

但是添加那 2 行没有任何效果。

所以现在我想知道是否;

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

1 回答 1

0

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

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

于 2013-05-22T11:50:03.780 回答