web-dev-qa-db-ja.com

Android Studio:重複するクラスの解決

run my Android Androidデバイス上のアプリケーション)を実行しようとすると、gradleコンソールは次のエラーを報告します:

Error:Execution failed for task ':app:transformClassesWithJarMergingForDebug'.
> com.Android.build.api.transform.TransformException: Java.util.Zip.ZipException: duplicate entry: com/loopj/Android/http/AsyncHttpClient$1.class

「AsyncHttpClient」クラスを検索すると、実際には次の2つの場所にあることがわかります。

/Users/Afflatus/.gradle/caches/modules-2/files-2.1/com.loopj.Android/android-async-http/1.4.9/5d171c3cd5343e5997f974561abed21442273fd1/Android-async-http-1.4.9-sources.jar!/com/loopj/Android/http/AsyncHttpClient.Java

/Users/Afflatus/.ideaLibSources/Android-async-http-1.4.9-sources.jar!/com/loopj/Android/http/AsyncHttpClient.Java

最初のパスはそれが「キャッシュ」ファイルであることを示唆しているようです...なので、私はinvalidating & restarting my cacheですが、gradleが再構築され、アプリケーションをrunしようとした後も、両方のファイルが残っています。私は別の posts で読みましたが、ファイルの1つを削除することで解決できます...それで、キャッシュの場所に行き、「1.4.9」フォルダーにあるすべてのファイルを削除しました。 ..残念ながら、再度開いた後Android Studioの場合、新しいキャッシュファイルが作成され、同じエラーが発生します。

他の投稿( ここここここ 、および ここ )は、「./ gradlew clean」を追加した場合に提案します(私が理解している限り)ルートディレクトリに再度実行するためだけ、gradleを再構築します。だから私もそれをやってみました:

enter image description here

これにより、アプリのフォルダーは次のようになります。

enter image description here

しかし、残念ながら、それでも私が同じエラーを受け取ることにはなりませんでした。何が悪いのですか?私は何をすべきですか?

9
Afflatus

libsフォルダーに2回ライブラリーを追加したため、これはlibsフォルダーに同じライブラリーの複数のバージョンがある場合に発生することがあります。それを確認し、重複するjarファイルを削除してください。

2番目のオプションは、gradle.buildに依存関係を追加し、libsフォルダーにjarを含めることもできます。

そのため、両方の場所を確認して重複するエントリを削除し、クリーンしてAPKを再度ビルドします。

それが役に立てば幸い

5
Max

私の場合、gradleでsensorocloud.jarcompile 'com.loopj.Android:android-async-http:1.4.9'を使用しているため、同じエラーが発生しました。 sensoroクラウドSDKはloopjのasync-httpを使用したためです。

Jarファイル内の重複する.classファイルを手動で削除することで解決できました。 (すなわち.

  1. 拡張子をjarからZipに変更する
  2. それを抽出する
  3. com.loopj.Android.classファイルを削除する)

(PS私は、gradleでjarの特定のクラスを除外できるかどうかを確認するためにWebを検索しようとしましたが、成功しませんでした。たとえば、参照しました this SO post

0
David Cheung

libsフォルダー内の重複するjar拡張子を持つファイルを削除します。ただし、重複ファイルがなく、"Duplicate classes"エラーがある場合は、エラーセクションの残りの「Duplicate classes ....」句で名前を探してください。たとえば、"duplicated classes 'dagger' bla bla"です。 libsフォルダから'dagger'という名前のファイルを削除します。 (シフトで削除しないように注意してください。)

0
Geylani ARCA

重複するクラス例外は、依存関係の1つが、プロジェクトで使用しているライブラリの古いバージョンまたは新しいバージョン(+付き)を暗黙的に使用することを意味します。

この問題を解決するには、そのようなコードブロックを'force'ファイル(モジュール:アプリ)に追加します(ライブラリバージョンをbuild.gradleの後に配置します)。

configurations {
   all {
      resolutionStrategy {
          // do not upgrade above 3.12.0 to support API < 21 while server uses
          // COMPATIBLE_TLS, or okhttp3 is used in project
          force 'com.squareup.okhttp3:okhttp:3.12.0'
          force 'com.squareup.okhttp3:logging-interceptor:3.12.0'
      }
   }
}

依存関係から一部のグループを除外することもできます。単一の依存関係については、次のように記述します。

dependencies {

    // example
    implementation('log4j:log4j:1.2.15') {
        exclude group: 'javax.jms', module: 'jms'
    }
}

Android Studio with Gradle Plugin version 3.4.2 and Gradle version 5.4.1

0