【发布时间】: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 混淆了什么,什么没有。