2

この質問の@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)
4

3 に答える 3

2

解決しました!

これらの行を ProGuard 構成ファイルに追加しました。

-keep class co.uk.FibroApp.pdf.SleepDataActivity
-keep class co.uk.FibroApp.pdf.SleepMainActivity

SleepDataActivity を追加したのは、これが pdfsleep に接続する Async タスクを保持するクラスだからです。

SleepMainActivity を追加したのは、技術的には、SleepDataActivity が TabSwipe アクティビティ内のフラグメントであり、SleepMainActivity がそれらのタブの親であるためです。

「pdfsleep」が mapping.txt に記載されるようになり、すべて意図したとおりに機能します。

Eric Lafortune の回答をこの質問に対する回答として受け入れます。「-keepclassmembers」に対する彼の構文は、私が自分で取得したものではないためです。また、以前の質問で AlexWien からの回答を受け入れたため、これにたどり着きました。ステージ。

お二人ともありがとうございました。

于 2013-05-24T20:12:15.660 に答える
0

あなたの問題の 1 つはおそらく、指定した難読化ルールでReport_HolderSleepReport_Holder.

私はこのルールを使用します。これは ant proguard 拡張機能にありますが、それを他のルール記述システムに簡単に変換できます。

<keepclasseswithmembers name="co.uk.MyApp.pdf.MyData" access="public">
<method access="public static" type="void" name="pdfsleep" parameters="co.uk.MyApp.classes.SleepReport_Holder" />
</keepclasseswithmembers>

さらに、java > 1.5 の使用ルール

-keepattributes Signature 

そうしないと、コレクションとジェネリックが機能しません

于 2013-05-23T14:09:51.403 に答える