ProGuard:ライブラリクラスの定義が重複していますか?


83

AndroidプロジェクトでProGuardを実行すると、次の警告が表示されます。

Note: duplicate definition of library class [org.apache.http.conn.scheme.HostNameResolver]
Note: duplicate definition of library class [org.apache.http.conn.scheme.SocketFactory]
Note: duplicate definition of library class [org.apache.http.conn.ConnectTimeoutException]
Note: duplicate definition of library class [org.apache.http.params.HttpParams]
Note: duplicate definition of library class [android.net.http.SslCertificate$DName]
Note: duplicate definition of library class [android.net.http.SslError]
Note: duplicate definition of library class [android.net.http.SslCertificate]

Note: there were 7 duplicate class definitions.

私はここでそれを無視してこれを修正することを見つけまし

-keep class org.apache.http.** { *; }
-dontwarn org.apache.http.**
-keep class android.net.http.** { *; }
-dontwarn android.net.http.**

使用済みライブラリから重複を削除する方法がわかりません。dontwarn警告を使用した後でも消えることはありません。

これは、警告を無視するだけでこの警告を処理する正しい方法ですか、それとも問題につながる可能性がありますか?


複数のライブラリからいくつかのクラスをインポートしたようです。あなたはproguardconfigの中にandroidライブラリjarを追加するかもしれません
Adem

1
その例を投稿していただけませんか。Android plrguard defは、libraryjarsを使用すべきではないと言っています。参照:proguard.sourceforge.net/manual/...
confile

progaurdルールファイルを投稿する
NJ

@confile問題を解決しましたか?
NickUnuchek 2016

プロジェクトからapacheライブラリを削除し、独自のコードに置き換えることで、これを解決しました。
ban-geoengineering 2016年

回答:


96

あなたはProGuardのオプションを追加した場合-printconfiguration config.txt、あなたはProGuardの追加を参照してくださいよ

-libraryjars'D:\ tools \ android \ platform \ android-23 \ android.jar '

-libraryjars'D:\ tools \ android \ platform \ android-23 \ optional \ org.apache.http.legacy.jar '

複製されたクラス(SslErrorなど)は、android.jarとorg.apache.http.legacy.jarの両方に表示されます。

ProguarduseLibrary 'org.apache.http.legacy' は、そうでない場合でも2番目のjarを追加します。これは、問題を説明する未解決のバグです。

そのため、この問題については何もできなくなりました。無視してください:

-dontnote android.net.http.*
-dontnote org.apache.commons.codec.**
-dontnote org.apache.http.**

クラスがライブラリjar(実際には電話のライブラリ)にある限り、クラスを保持する必要はありません。dontwarnは警告ではないので機能しません、それはメモです。


6
すごい!ありがとう。この回答は正しいものとしてマークする必要があります!
Radim Vaculik 2016年

ただ、場所にしようとしたuseLibrary 'org.apache.http.legacy'build.gradleとあなたを置く-dontnoteProGuardのファイルに。しかし、それでも問題が発生します。私はAPI22を使用していましたが、正常に機能していました。23にアップグレードすると、署名付きをビルドしようとするとこれらのエラーが発生します。時々、成績は無期限に機能します。他に何をすべきかわからない。
wviana 2016年

このオプションをどこに追加しますproguard option -printconfiguration config.txtか?
MML

コマンドラインでproguardを実行しましたか。config.txtは、現在のフォルダに作成されます
フラビオ

6

おそらく、proguard-project.txtで「-injars」と-libraryjarsについて言及していると思いますが、最新のビルドシステムがそれらの言及を処理することを考慮して、再度言及する必要はありません。

ソース:http//proguard.sourceforge.net/manual/troubleshooting.html#duplicateclass

これが役立つと思います。:)


1
ええと、私はかなり新しいAndroid Studio(2015年12月1日ビルド)を使用していて、誰も私のためにそれらについて言及することを気にしません。簡単なものが足りませんか?
aasu 2016年

1

build.gradleに以下を追加することで、重複するクラスを許可しないようにgradleに指示できます(最初のクラスのみを取得します)。

jar {
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}

1
どのbuild.gradle?プロジェクトまたはアプリ?アプリの場合、どのブロックの下に配置しますか?アプリのbuild.gradleandroidブロックに入れようとしましたandroid{jar { duplicatesStrategy = DuplicatesStrategy.EXCLUDE } }が、エラーエラー
Edijae Crusar 2017年

jar {はgradlejavaプラグイン内のタスクであるため、その場合apply plugin: 'java'はそのjarブロックを使用できるはずです。別のブロックには入りません。これはbuild.gradleのルートレベルにあります。(このgradleドキュメントを参照してください)アプリで使用しましたが、それが重要かどうかはわかりません。
voxoid 2017年

-7

ログで重複として示されているすべてのものについて、build.gradleでこれを試すことができます。これが機能するかどうかはわかりませんので、試してみて、機能するかどうかをお知らせください。

packagingOptions {
        exclude 'android.net.http.SslCertificate'
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.