2

コードでいくつかのリフレクションを使用するかなり大きなプロジェクトがあります。次のクラッシュの原因となっているコード行:

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 から派生したいくつかの潜在的なクラスの 1 つです。

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

どんな提案も役に立ちます。たとえば、1 つの Java ファイルまたはこの Java ファイルの 1 つのセクションに対してプロガードをオフにする方法はありますか?

これを調べてみると、次のようなものを追加する必要があると思います。

-keepclassmembers class com.DynaZu.Tracker.TaskViewHolder
{
  <init>(com.DynaZu.Tracker.Task);
}

など...しかし、ProGuardはこれらのクラスが不明であると不平を言います...? では、プロジェクト内の既存のクラスを proguard.cfg にどのように記載する必要がありますか。??? また、クラス名 TaskViewHolder だけを試しました。

4

1 に答える 1

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 が利用できることは命の恩人であると言わざるを得ません。

于 2012-12-31T18:36:18.770 に答える