web-dev-qa-db-ja.com

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

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.

here を見つけて、無視してこれを修正します:

-keep class org.Apache.http.** { *; }
-dontwarn org.Apache.http.**
-keep class Android.net.http.** { *; }
-dontwarn Android.net.http.**

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

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

77
confile

プロガードオプション-printconfiguration config.txtを追加すると、プロガードオプションが追加されます

-libraryjars 'D:\ tools\Android\platforms\Android-23\Android.jar'

-libraryjars 'D:\ tools\Android\platforms\Android-23\optional\org.Apache.http.legacy.jar'

重複したクラス(SslErrorなど)がAndroid.jarとorg.Apache.http.legacy.jarの両方に表示されます

Proguardは、useLibrary 'org.Apache.http.legacy'を実行しなくても2番目のjarを追加します。ここに 未解決バグ が問題を説明しています。

したがって、この問題については何もできません。無視してください:

-dontnote Android.net.http.*
-dontnote org.Apache.commons.codec.**
-dontnote org.Apache.http.**

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

88
Flavio

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

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

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

6
Sankalp Pandya

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

jar {
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}
0
voxoid