如何纠正Proguard.cfg中缺失的类/方法问题



我有一个相当大的项目,在代码中使用了一些反射。导致以下崩溃的代码行:

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是几个可能从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本身。

我可以通过查看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的可用性是一个救星!

最新更新