Class<?> c = Class.forName("co.uk.MyApp.dir.TargetClass");
Method main = c.getDeclaredMethod("main", Report_Holder.class);
抛出一个'java.lang.NoSuchMethodException '。主要co.uk.MyApp.classes[类。当我使用Proguard准备发布应用程序时,会出现错误。
我花了几个小时认为问题出在"co.uk.MyApp.dir"。TargetClass’,注释掉一些东西,重新发布应用,重新测试。但结果是错误就在根,在:
Method main = c.getDeclaredMethod("main", Report_Holder.class);
然后我更新了proguard-project.txt,包括:
-dontobfuscate
-keeppackagenames
(我使用Lint建议的方法,建议将代码放入项目中。属性和将配置放在文本文件中),例如:
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
但是增加这两行没有任何效果。
所以现在我想知道是否;
a)我应该在'-keeppackagenames'等上面添加任何内容。
b)是防护。正确配置设置;$ {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) {
....
}
一旦您知道如何使用proguard,您应该添加选项-keepattributes Signature
。当使用泛型(集合)时,这是必要的。
对于所有通过反射调用的方法,必须显式地将它们排除在湮没之外。使用该选项输出混淆映射文件,看看您的规则是否达到了预期效果。