我有一个相当大的项目,在代码中使用了一些反射。导致以下崩溃的代码行:
W/System.err(22122): java.lang.NoSuchMethodException: <init> [class com.DynaZu.Tracker.cd]
W/System.err(22122): at java.lang.Class.getConstructorOrMethod(Class.java:460)
W/System.err(22122): at java.lang.Class.getDeclaredConstructor(Class.java:588)
W/System.err(22122): at com.DynaZu.Tracker.ItemAdapter.getView(SourceFile:356)
W/System.err(22122): at android.widget.AbsListView.obtainView(AbsListView.java:2267)
是SourceFile:356行:
try {
itemViewHolder = mViewHolderClass.getDeclaredConstructor(item.getClass())
.newInstance(item);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
文件中的其他地方:
Class<? extends ItemViewHolder> mViewHolderClass;
并且该项是几个可能从类Item派生的潜在类之一。
当我查看dump.txt等时...我看到很多很多东西我不能完全转回proguard.cfg的特定指令。来自dump.txt:
+ Methodref [com/DynaZu/Tracker/cd.<init> (Ljava/lang/String;)V]
+ Methodref [com/DynaZu/Tracker/cd.a ()Ljava/lang/String;]
+ Methodref [com/DynaZu/Tracker/cd.equals (Ljava/lang/Object;)Z]
+ Methodref [com/DynaZu/Tracker/cd.h ()J]
+ Methodref [com/DynaZu/Tracker/cd.o ()Ljava/lang/String;]
+ Methodref [com/DynaZu/Tracker/cd.p ()Lcom/DynaZu/Tracker/cd;]
+ Methodref [com/DynaZu/Tracker/cd.q ()F]
+ Methodref [com/DynaZu/Tracker/ce.a (J)Lcom/DynaZu/Tracker/cd;]
+ Methodref [com/DynaZu/Tracker/ce.a (Lcom/DynaZu/Tracker/cd;)V]
+ InterfaceMethodref [com/DynaZu/Tracker/ac.a (IILcom/DynaZu/Tracker/cd;ZZ)V]
+ NameAndType [<init> (Lcom/DynaZu/Tracker/cd;)V]
+ NameAndType [a (IILcom/DynaZu/Tracker/cd;ZZ)V]
+ NameAndType [a (J)Lcom/DynaZu/Tracker/cd;]
+ NameAndType [a (Lcom/DynaZu/Tracker/cd;)V]
+ NameAndType [a Lcom/DynaZu/Tracker/cd;]
+ NameAndType [b (Lcom/DynaZu/Tracker/cd;I)V]
+ NameAndType [c Lcom/DynaZu/Tracker/cd;]
+ NameAndType [p ()Lcom/DynaZu/Tracker/cd;]
+ Utf8 [()Lcom/DynaZu/Tracker/cd;]
对于proguard.cfg,我意识到我想要的东西:
-keepclassmembers class * extends Item
-keep class * extends Item
任何建议都会有所帮助。例如,有没有办法为一个java文件或这个java文件的一个部分转换proguard ???
考虑到这一点,我相信我需要添加类似的内容:
-keepclassmembers class com.DynaZu.Tracker.TaskViewHolder
{
<init>(com.DynaZu.Tracker.Task);
}
等...但是ProGuard抱怨这些课程是未知的......?那么应该如何在proguard.cfg中记录项目中的现有类。 ???我自己也尝试过类名TaskViewHolder。
答案 0 :(得分:2)
我能够通过查看proguard / .. dump.txt以及特别是mapping.txt来解决这个问题。 从那里我理解了我的一些课程是如何被命名的。所以我在proguard.cfg中添加了以下内容:
-keepclassmembers class com.DynaZu.Tracker.ItemViewHolder$TaskViewHolder
{
<init>(com.DynaZu.Tracker.Task);
}
-keepclassmembers class com.DynaZu.Tracker.ItemViewHolder$ProjectViewHolder
{
<init>(com.DynaZu.Tracker.Project);
}
-keepclassmembers class com.DynaZu.Tracker.ItemViewHolder
{
<init>(com.DynaZu.Tracker.Item);
}
-keep class com.DynaZu.Tracker.Item
-keep class com.DynaZu.Tracker.Task
-keep class com.DynaZu.Tracker.Project
一旦我理解了发生了什么,就不难了。我希望这对其他人有困难。我不得不说拥有一个社区和Stack Overflow的可用性是节省生命的!