プロガード地獄-参照されたクラスが見つかりません


125

だから、私はいくつかのソフトウェアをリリースしようとしていますが、プロガードは私に頭痛を与えています。

proguardを使用してエクスポートしようとすると、「参照されているクラスが見つからない」など、多くの警告が表示されます

例えば:

[2011-08-07 17:44:37 - GAME] Warning: org.simpleframework.xml.stream.StreamReader: can't find referenced class javax.xml.stream.events.XMLEvent
[2011-08-07 17:44:37 - GAME] Warning: there were 52 unresolved references to classes or interfaces.
[2011-08-07 17:44:37 - GAME]          You may need to specify additional library jars (using '-libraryjars'),
[2011-08-07 17:44:37 - GAME]          or perhaps the '-dontskipnonpubliclibraryclasses' option.
[2011-08-07 17:44:37 - GAME] java.io.IOException: Please correct the above warnings first.
[ 

警告はsimpleframeworkに関連しているようですので、私のproguard構成ファイルに以下を追加しました:

-libraryjars pathtoprojecttolibs\simple-xml-2.4.jar

pathtoprojecttolibs私のプロジェクトによって参照されるjarへのパスはどこにありますか。

これは違いはありません。

simpleframeworkがjavaxを参照する場合、これも無視するようにプロガードに指示できますか?

何か案は?


1
ツリーシェイクを行うためだけにプロガードを使用していますか?もしそうなら、それを使用せずにファイルサイズを確認しましたか?たとえば、プロテクションがリフレクションを使用してアクセスされる何かをスローすると、超奇妙なバグが発生する可能性があります。これは、ランタイムが壊れるまで見つからないので、本当に本当に必要かどうかを確認してください。
alun 2011

私は本当にそれを使って、ニックネームが付けられているコードを簡単に保護しようとしましたか?価値があると思いますか?
iasksillyquestions 2011

3
@ListenToRick Proguardは、適切な構成で実行され、結果のアプリが適切にテストされていれば、まったく問題ありません。Googleがその使用をすら推奨していると確信しています。Googleは、AndroidアプリでProguardを使用するための多くのガイド/例を提供しています。
CrackerJack9

Proguardは優れたツールですが、Googleが推奨するのは、dex-formatのサイズ制限が他の何よりもかなり奇妙であるためです。(code.google.com/p/android/issues/detail?id=7147を参照)
alun

5
@alun、それは理由ではありません。アプリのリバースエンジニアリングを望まない場合、またはライセンスを使用して著作権侵害を防止しようとする場合は、このような難読化ツールを使用して、ハッカーによる攻撃を困難にする必要があります。アプリケーションに必要なスペースを少なくすることは、エンドユーザーにとってもメリットです。また、これらのツールによって最適化も行われます...さらに別のメリットもあります。
クリストファーペリー

回答:


128

org.simpleframework.xml.stream.StreamReaderあなたのコードではを参照しjavax.xml.stream.events.XMLEventます。後者のクラスはJavaランタイム(rt.jar)の一部ですが、Androidランタイム(android.jar)の一部ではないため、ProGuardは何かが壊れている可能性があることを警告します。とにかくアプリケーションが動作することが確実な場合は、次のように指定できます。

-dontwarn javax.xml.stream.events.**

プロガード地獄?


15
それは私のためにそれを修正しませんでした、しかしこれは修正しました-dontwarn javax.xml.**
Jeshurun '27年

8
追加すると-libraryjars <java.home>/lib/rt.jar、問題が修正されました。
ゴータム

3
私が使用したので、私は、例えばjavax.xml.stream.XMLInputFactoryに関する追加の警告を得た-dontwarn javax.xml.stream.**
spatialist

1
-dontwarnGUIを歌うように設定するにはどうすればよいですか?
トマーシュザト-モニカを復活させる

2
プロガード地獄は続きます、ただ私を骨抜きにして、この痛みで終わらせてください。
Josh


5

このエラーは、使用するライブラリが実際には使用されていない他のライブラリに依存しているために発生しますが、Proguardはそれらを探しています。この警告を無効にするには、Androidプロジェクトのproguard-rules.proファイルに-dontwarn行を
追加します。

ここに画像の説明を入力してください

エラーのスタックトレースで、proguard-rules.proに追加する必要のある依存関係を見つけることができます。


2

これをProguard構成に含める必要があります。

-dontskipnonpubliclibraryclasses

ええと、それは私のために当時しました...〜4年前...それ以来それは変わったかもしれません:)とにかく少なくとも2人の他の人のために働いていたようです。
CrackerJack9 2015年

デフォルトのproguard-android.txtにはすでにこの行があります。
Cristina De

1
@Ultimeciaそのコミットは2013年のもので、この投稿は2011年に作成されました
CrackerJack9


0

うーん。この警告を読むと、使用しようとしているライブラリはjavax.xml.stream.eventsに依存しているように見えます。名前空間は実際にはアンドロイドに含まれているとはまったく思いません。(「パッケージインデックス」を参照)。

proguardを使用せずにエミュレータにデプロイしてみて、機能するかどうかを確認します。その警告が正確であれば、私の推測はノーです。


こんにちは、それがプロガードなしでエミュレータで動作している場合、それは警告が不正確であることを意味しますか?私はなぜこの種の同様の警告があったのかを理解しようとしています。警告を抑制したくありません。
Michelle Shieh

0

これはエッジケースだと思いますが、私の場合、Jenkinsプロガードのビルドフォルダーを完全にワイプする必要がありましたが、存在しない古いコードを操作しようとしました-誰かが同じ問題を抱えている場合に備えて。


0

私の場合、何も変更しておらず、警告が表示され始めました。問題は、壊れたGradleキャッシュにありました。私の他の答えを確認してください。問題を見つけるのに2時間かかったので、これを共有します:]


0

次の行をproguard-rules.pro、gradleスクリプトディレクトリのファイルに追加します。

-dontwarn package.class.name.**

どこpackage.class.nameのjarファイルのクラス名とパッケージ名が付加されます。

例えば:

-dontwarn com.myexternalclass.utils.**
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.