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) {
....
}
答案 0 :(得分:0)
一旦您知道如何使用proguard,就应该添加选项-keepattributes Signature
。这是使用泛型(集合)时的必要条件。
对于通过反射调用的所有方法,您必须明确地将它们从obfsucation中排除。使用该选项输出混淆映射文件,以查看您的规则是否具有所需的效果。