2015-10-09 28 views
60

私は私のAndroidのプロジェクトのための私のProGuardのを実行すると、次の警告を得る: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を使用しても、警告は消えません。

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

+0

を。あなたはproguardの設定の中にアンドロイドライブラリjarを追加するかもしれない – Adem

+1

あなたはそれの例を投稿してください。 Android plrguard defでは、libraryjarsを使用しないでください。参照:http://proguard.sourceforge.net/manual/troubleshooting.html#duplicateclass – confile

+0

あなたの 'progaurd'ルールファイルを投稿してください –

答えて

5

おそらく、あなたはProGuardの-project.txtに「-injars」と-libraryjars」を言及している、最新のビルドシステムを考慮すると、あなたは再びそれを言及する必要がいけない..soあなたのためにそれらを言及するの面倒を見る。

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

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

+1

まあ、私はかなり新しいAndroidスタジオ(2015年12月1日ビルド)に誰も私のためにそれらを言及する世話をしています。私は何か簡単なものを逃しています – aasu

59

あなたはProGuardのオプション-printconfiguration config.txtを追加する場合は、ProGuardのは

が追加表示されます。

あなたの重複したクラス(例: SslError)の両方android.jarに提示し、org.apache.http.legacy.jar

ProGuardのは、あなたがここにuseLibrary 'org.apache.http.legacy' は、問題を説明するopen bugでない場合でも、第二jarファイルを追加します。されています

これで問題は解決できません。

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

+4

素晴らしい!ありがとう。この回答は正しいものとしてマークする必要があります! –

+0

* buildで 'useLibrary 'org.apache.http.legacy''を配置しようとしました。あなたの '-dontnote'をproguardファイルに置きます。しかし、まだ問題が発生しています。私はapi 22を使用していましたが、正常に動作していました。今私は23にアップグレードしました。署名したものをビルドしようとすると、これらのエラーが発生します。いくつかの学年は無期限に機能します。他に何をするか分からない。 – wviana

-5

ログに重複として示されているすべてについて、build.gradleでこれを試すことができます。私はこれがうまくいくかどうか分からないので、それを試してみて、それがうまくいくかどうかを知らせてください。

packagingOptions { 
     exclude 'android.net.http.SslCertificate' 
    } 
+1

LOL、それはバディを動かすつもりはない。 –

1

あなたのbuild.gradleに以下を追加することにより、重複するクラス(初回のみを取る)を許可していないのGradleを伝えることができます:あなたが複数のライブラリからいくつかのクラスをインポートしたようだ

jar { 
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE 
} 
+0

build.gradleはどちらですか?プロジェクトやアプリですか?アプリの場合、ブロックの下に配置しますか?私はアプリのbuild.gradleアンドロイドブロックに入れようとしました。android {jar { duplicatesStrategy = DuplicatesStrategy.EXCLUDE } } 'エラーが発生しました:エラー:Gradle DSLメソッドが見つかりませんでした: 'jar() '** –

+0

'jar {'はgradle javaプラグイン内のタスクなので、 'apply plugin:' java''を実行すると、そのjarブロックを使用できるはずです。それは別のブロックの中には入りません。 build.gradleのルートレベルにあります。 ([このgradle docを参照](https://docs.gradle.org/current/userguide/java_plugin.html#sec:jar))私はアプリで使っていましたが、それが重要かどうかはわかりません。 – voxoid

+0

ok、私は今理解しています –

関連する問題