13

Proguard で apk をエクスポートしようとすると、次のような多くのエラー (400 以上) が表示されます。

Warning: org.codehaus.jackson.jaxrs.JsonMappingExceptionMapper: can't find superclass or interface javax.ws.rs.ext.ExceptionMapper

org.codehaus.jackson.xc.DataHandlerJsonDeserializer$1: can't find superclass or interface javax.activation.DataSource

Jackson Json ライブラリを使用していますが、エラーはそれに関連しているようです。

このエラーを調査したところ、Proguards FAQから次のことがわかりました。

クラスまたはインターフェイスへの未解決の参照がある場合は、必須ライブラリを指定するのを忘れている可能性があります。適切に処理するには、Java ランタイム ライブラリを含め、コードで参照されるすべてのライブラリを指定する必要があります。ライブラリを指定するには、-libraryjars オプションを使用します。

SO を検索すると、これに関連する多くの未回答の質問が見つかりましたが、一般的な意味では、使用している jar ファイル (この場合は Jackon JSON) はより多くのライブラリに依存しており、それらを Proguard の構成ファイルに追加する必要があります。どうやって。

ただし、必要なjarファイルとその場所を特定する方法がわかりません。警告には、javax.ws.rs.ext、org.joda.time、org.codehaus.stax2、javax.xml.stream などのさまざまなパッケージが含まれています。

  1. これらのパッケージが含まれている jar ファイルを特定するにはどうすればよいですか? たとえば、javax.ws.rs.ext.** クラスにはどの jar が必要ですか?
  2. それらの jar がどこにあり、どのパスが Proguard の -libraryjars で使用されるかを知るにはどうすればよいですか?

どうもありがとう


編集: Android ライブラリ プロジェクトのセットアップ を使用していることにも言及する必要があります。jar はメインの Library プロジェクトにあり、実際の作業プロジェクトには、Library プロジェクトの jar を含むビルド パスがあります。それが違いを生むかどうかはわかりませんが、言及する必要があると思いました。


更新 テストのために、ビルドパスとコードからジャクソンを完全に削除したところ、Proguard が正常に完了しました。問題はまだ残っています...これらのエラーを処理するための正しいアプローチは何ですか?

Eclipse の Android エクスポート ウィザードは自動的に /lib/ jar を proguard に追加しますか、それとも次のように proguard 構成ファイルにすべて手動で追加する必要がありますか?

-libraryjars C:/Project/lib/somjar.jar

私はジャクソンのもののためにそれを試しましたが、違いはありませんでした. これは、警告に記載されているクラスに必要なすべての jar ファイルを見つけて追加する必要があるということですか? それらはsdkにありますか、それともJavaインストールにありますか?

これらがばかげた質問である場合は申し訳ありませんが、私はこの数時間これを理解しようとしてきましたが、どうすればよいかわかりません.

再度、感謝します


再更新

ベンジャミンの提案と組み合わせてさらに検索すると、欠落しているクラスのいくつかが、jdk の lib フォルダーにある rt.jar にあることがわかりました。だから私は最終的に追加しました

-libraryjars  <java.home>/lib/rt.jar

proguard.cfg ファイルに移動し、警告を 485 から 204 に下げました。それは何かだと思います...残りの警告は、まったく見つからないクラスについて説明しています。アプリはプロガードを実行しなくても問題なく動作するため、これらのクラスは正しい場所にあるはずです。それとも、これらの警告と一緒に使用-dontwarnする必要がありますか?

残りのクラスは次のパッケージに含まれています。

org.joda.time.
org.codehaus.stax2.
javax.ws.rs.

だから今、私は理解する方法が必要です:

  1. これらのクラスを持つ jar ファイル
  2. これらのjarはどこにあるので、proguard構成ファイルに含めることができます
4

3 に答える 3

5

Proguard で同様の問題が発生し、難読化されていない状態で OK をビルドした osmdroid.jar を使用していた同様のエラーが発生しました。この jar には、アプリケーションが必要としない外部依存関係があったに違いありません。幸いなことに、作成者は必要な jar をリストしました。それらをダウンロードして、-libraryjars オプションを介して Proguard に通知すると、Proguard ビルドは問題ありませんでした。

不足している jar (おそらく実際には必要ないかもしれませんが、Proguard は必要があると考えています!) については、次の場所で見つける必要があります。

org.joda.time (jar は zip 内にあります)

org.codehaus.stax2.

javax.ws.rs.

于 2011-02-09T23:07:39.587 に答える
3

私は最初の部分についてのみ答えを提供できます。

http://www.findjar.com

試してみると、必要なjarファイルの名前が次のように見つかる場合があり ます

于 2011-02-09T20:07:58.657 に答える
0

Proguard のライブラリを含める必要はありません。代わりに、クラス名やその他のものを保持するように Proguard に指示する必要があります。私はそれを自分で少しいじりましたが、最終的にはこの議論に似たものになりました:

-keepnames class org.codehaus.** { *; }
-keepattributes *Annotation*,EnclosingMethod
-dontwarn org.codehaus.jackson.**

まだクラッシュが発生している場合は (積極的にテストすることをお勧めします!)、次の方法で Jackson を完全にそのままにしておくことをお勧めします。

-keep class org.codehaus.** { *; }
-keepattributes *Annotation*,EnclosingMethod
-dontwarn org.codehaus.jackson.**

(後者はより大きなファイルを生成することに注意してください。)

于 2012-11-08T15:34:53.690 に答える