コードでいくつかのリフレクションを使用するかなり大きなプロジェクトがあります。次のクラッシュの原因となっているコード行:
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 だけを試しました。