この質問の@AlexWein からの提案に従い、ProGuard トラブルシューティングを参照すると、SherlockFragment に次のように表示されます。
Class<?> c = Class.forName("co.uk.MyApp.pdf.MyData");
Method main = c.getDeclaredMethod("pdfsleep", Report_Holder.class);
Report_Holder paramsh = null;
paramsh = SRH;
main.invoke(null, (Object)paramsh);
「co.uk.MyApp.pdf.Data」コンストラクターは次のとおりです。
public class MyData {
public static void pdfsleep(Report_Holder args) {
...
}
}
Proguard は次のように設定されています。
-keepnames class co.uk.MyApp.classes.Report_Holder
-keepclassmembers class co.uk.MyApp.pdf.Data { public static void pdfsleep(Report_Holder); }
-keepnames class co.uk.MyApp.DataActivity
しかし、私はまだ NoSuchMethodException を取得しています:
05/23/13 12:14:28 GMT+01:00 ERROR AsyncTask #2 - java.lang.NoSuchMethodException: pdfsleep [class co.uk.MyApp.classes.Report_Holder]
at java.lang.Class.getConstructorOrMethod(Class.java:460)
at java.lang.Class.getDeclaredMethod(Class.java:685)
at co.uk.MyApp.fy.a(Unknown Source)
at co.uk.MyApp.fy.doInBackground(Unknown Source)
at android.os.AsyncTask$2.call(AsyncTask.java:264)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)
私は何が欠けていますか?
アップデート
Proguard の行を次のように変更しました。
-keepattributes Signature
-keepnames class co.uk.MyApp.classes.Report_Holder
-keepclasseswithmembers class co.uk.MyApp.DataActivity
-keepclasseswithmembers class co.uk.MyApp.pdf.Data { void pdfsleep(Report_Holder); }
そして、まだエラーが発生しています。
マッピング ファイルを見ると、何が問題を引き起こしているのかがわかると思います。
co.uk.MyApp.classes.Report_Holder -> co.uk.MyApp.classes.Report_Holder:
co.uk.MyApp.DataActivity -> co.uk.MyApp.DataActivity:
java.util.ArrayList arrDataItems -> a
co.uk.MyApp.classes.Report_Holder SRH -> b
Proguard は co.uk.MyApp.classes.Report_Holder への参照を保持しているように見えますが、co.uk.MyApp.DataActivity の子として参照するときに難読化しています。
co.uk.MyApp.DataActivity を保持するさまざまな方法を試し、co.uk.MyApp.classes.Report_Holder の難読化を停止しようとしましたが、正しい構文を取得できません。助言がありますか?
更新 2
Eric Lafortune の提案に従って、いくつかのコードと ProGuard 構成ファイルを更新しました (ところで、適切なパッケージ/クラス名を表示しています)。
co.uk.FibroApp.SleepDataActivity で
Class<?> c = Class.forName("co.uk.FibroApp.pdf.SleepData");
Method main = c.getDeclaredMethod("pdfsleep", co.uk.FibroApp.classes.SleepReport_Holder.class);
SleepReport_Holder paramsh = SRH;
co.uk.FibroApp.pdf.SleepData は次のとおりです。
public class SleepData {
public static void pdfsleep(co.uk.FibroApp.classes.SleepReport_Holder args) {
...
}
}
完全な ProGuard 構成は次のとおりです。
-keepattributes Signature
-keep class co.uk.FibroApp.classes.SleepReport_Holder
-keep class co.uk.FibroApp.pdf.SleepData
-keepclassmembers class co.uk.FibroApp.pdf.SleepData {
public static void pdfsleep(co.uk.FibroApp.classes.SleepReport_Holder);
}
# do not obfuscate the classes from droidtext but shrink them
-keep,allowshrinking class harmony.java.awt.** { *; }
-keep,allowshrinking class org.apache.harmony.** { *; }
-keep,allowshrinking class org.bouncycastle.** { *; }
-keep class android.support.v4.app.** { *; }
-keep interface android.support.v4.app.** { *; }
-keep class com.actionbarsherlock.** { *; }
-keep interface com.actionbarsherlock.** { *; }
-keepattributes *Annotation*
完全なエラー ログは次のとおりです。
05/24/13 08:25:52 WEST ERROR AsyncTask #2 - java.lang.NoSuchMethodException: sleeppdf [class co.uk.FibroApp.classes.SleepReport_Holder]
at java.lang.Class.getConstructorOrMethod(Class.java:460)
at java.lang.Class.getDeclaredMethod(Class.java:685)
at co.uk.FibroApp.fy.a(Unknown Source)
at co.uk.FibroApp.fy.doInBackground(Unknown Source)
at android.os.AsyncTask$2.call(AsyncTask.java:264)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)