📝

【Android】JavaからKotlinへ移行する際の"Duplicate class..."エラーの解決

2023/11/25に公開

概要

  • Androidアプリのビルド時における、Duplicate class系のエラーは、依存関係の問題で発生する。エラー文通り、同じクラスが複数のライブラリに存在しているため。
  • 依存を読み込んでいる場所をbuild.gradleの中から探し出し、不要な依存であれば削除する。

前提

  • AndroidStudioで、JavaのみのプロジェクトでKotlinを使えるようにする作業をしている。
  • 本質とは関係ないが、Unity製のアプリをUaaL(Unity as a Library)として出力し、ネイティブとUnity部分が統合されたアプリケーションを開発している。

詳細

JavaからKotlinへの移行

  • Javaファイルを右クリックして、Kotlinにコンバートするボタンを選択する
build.gradle(Project ProjectName)
plugins {
    id 'com.android.application' version '7.2.2' apply false
    id 'com.android.library' version '7.2.2' apply false
+   id 'org.jetbrains.kotlin.android' version '1.9.0' apply false
}
build.gradle(Module app)
apply plugin: 'com.android.application'
+apply plugin: 'org.jetbrains.kotlin.android'

dependencies {

発生するエラー

  • ビルドをしようとしたタイミングで、Duplicate classエラーが発生する。
Duplicate class kotlin.time.TimedValue found in modules jetified-kotlin-stdlib (kotlin-stdlib.jar) and jetified-kotlin-stdlib-1.9.0 (org.jetbrains.kotlin:kotlin-stdlib:1.9.0)
Duplicate class org.jetbrains.annotations.TestOnly found in modules jetified-annotations-13.0 (org.jetbrains:annotations:13.0) and jetified-kotlin-annotations (kotlin-annotations.jar)
...同様のエラーが大量に発生

解決

  • UnityLibraryモジュールの中で依存関係を記述している箇所から読み込まれるファイル群が、重複の原因だった
build.gradle(Module unityLibrary)
apply plugin: 'com.android.library'

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar']) ←これ
  • ワイルドカードで全ての.jarを読み込む設定になっている。
  • 読み込み先(Unityのビルド/unityLibrary/libs)を見に行くと、以下画像で選択した3つのファイルが存在していた。これが原因。
  • この3ファイルを削除したところ、エラーが発生せずにビルドすることができた🎉

(補足)kotlin-xxx.jarファイルたちの生成原因について

  • Unity側で利用しているBugsnagというプラグインが原因で出力されていることが分かった。(Bugsnagはエラー検知ツール)
    • Unity側のPackageManagerでBugsnagを削除してビルドすると、これらのファイルは出力されたものに含まれなかった。
  • BugsnagがUnity側で利用されている状態で、上記の解決策通りunityLibrary/Libsの中から3ファイルを削除した上でビルドし、意図的にエラーを発生させた。結果、バグの通知は届いた。=> よって同じ機能(クラス)が他のライブラリに存在していれば問題なく動作しそう

参考

https://developer.android.com/kotlin/add-kotlin?hl=ja
https://zenn.dev/tbsten/articles/ce5f1601a2a5a7

Discussion