# Kotlin 2に起因するAndroidビルド失敗のトラブルシューティング

> Unity 2022 LTS以前のバージョンでビルドするときにLevelPlay 9.6.0で導入されたKotlin 2の依存関係が原因で発生するAndroidビルド障害を特定して修正します。

LevelPlay SDK 9.6.0でUnity 2022 LTS以前を使用している場合、Androidビルドに失敗する可能性があります。このガイドでは、それらを識別して解決する方法について説明します。

> **Note:**
>
> このビルド失敗の問題は、Unity 2022 LTS以前のバージョンにのみ影響します。Unity 6以降では、新しいビルド ツールチェーンとの互換性がサポートされており、影響を受けません。

## 事象##symptom

LevelPlay Unity(Ads Mediation)パッケージを 9.6.0 にアップグレードすると、Android ビルドは以下のエラーで失敗します。

```xml
ノート:一部の入力ファイルは、非推奨の API を使用またはオーバーライドします。
ノート:詳細は -Xlint:Deprecation で再コンパイルしてください。
ERROR:D8: com.android.tools.r8.kotlin.H

FAILURE (障害):ビルドは 2 回失敗して完了しました。

1:タスクが例外で失敗しました。
-----------
* 何が問題になったか:
  タスク ':launcher:mergeExtDexRelease' の実行に失敗しました。
> Could not resolve all files for configuration ':launcher:releaseRuntimeClasspath'.
> Transform kotlin-stdlib-2.1.21.jar (org.jetbrains.kotlin:kotlin-stdlib:2.1.21) に失敗しました
  属性 {artifactType=android-dex, ...} と一致させます。
> DexingWithClasspathTransform の実行に失敗しました：
  .../transformed/jetified-kotlin-stdlib-2.1.21.jar.
> デクス中のエラー。

2:タスクが例外で失敗しました。
-----------
* 何が問題になったか:
  java.lang.StackOverflowError （エラーメッセージなし）

ビルド失敗
```

このエラーメッセージから、これが Kotlin 2 の互換性の問題であることを示す 2 つのインジケーターが確認できます。

1. 出力に`ERROR:D8: com.android.tools.r8.kotlin.H`行が表示されます。
2. 失敗するアーティファクトは`kotlin-stdlib-2.1.21.jar` （または任意の`Kotlin 2.x stdlib`） です。

## 原因##causes

Android ビルド失敗は、以下の理由で発生する可能性があります。

* LevelPlay SDK 9.6.0 (およびそのネットワークアダプタの一部) は、Kotlin 2.x 標準ライブラリ (`kotlin-stdlib-2.1.21`) と依存関係にあります。
* Unity 2022 LTSには、Kotlin 2サポートより前のバージョンのAGP/R8がバンドルされています。バンドルされているD8/R8では、Kotlin 2のstdlibメタデータをデックスできません。これは、`D8: com.android.tools.r8.kotlin.H`エラーおよびセカンダリ`StackOverflowError`として表示されます。

## 解決方法##resolution

この問題を解決するには、以下の手順に従って`settingsTemplate.gradle`に`buildscript`ブロックを追加し、R8 をオーバーライドします。

1. プロジェクトに`settingsTemplate.gradle`ファイルがまだない場合は、以下の手順で Unity エディターで有効にします。
   a.**File (ファイル**)> **ビルド設定** に移動します。
   b.プラットフォームとして **Android** を選択し、**プレイヤー設定**を選択します。**Project Settings** ウィンドウが開きます。
   c.**Android 設定**タブで、**パブリッシャー設定**に移動し、**カスタム Gradle 設定テンプレート**を有効にします。これにより、Unity は **ARTIFACTORYREPOSITORY** トークンと **DIR\_UNITYPROJECT** トークンを使用して A`ssets/Plugins/Android/settingsTemplate.gradle` にファイルを作成できます。
2. Open `Assets/Plugins/Android/settingsTemplate.gradle`。
3. Google の R8 リリース Maven から R8 8.5.35 をプルする `buildscript` コードブロックを追加します。既存の`pluginManagement`コードブロックの直後に追加します。

> **Note:**
>
> 推奨されるベスト プラクティスは、R8バージョン8.5.35を使用することです。これは、Unity 2022 LTS上のLevelPlay 9.6.0の検証済みバージョンであるためです。ただし、8.5.35 より新しいバージョンの R8 を使用できます。具体的には、Kotlin 2 をサポートする 8.5.x 以降のバージョンの R8 であればすべて動作します。

```kotlin
pluginManagement {
    repositories {
        **アーティファクトリポジトリ**
        gradlePluginPortal()
        google()
        mavenCentral()
    }
}

buildscript {
    repositories {
        maven {
            url "https://storage.googleapis.com/r8-releases/raw"
        }
    }
    dependencies {
        classpath 'com.android.tools:r8:8.5.35'
    }
}
```

> **Note:**
>
> この問題を解決するために Kotlin Gradle プラグインをアップグレードする必要はありません。この障害はKotlinコンパイルではなく、Dexパイプラインで発生しているため、アップグレードする必要があるのはR8のみです。

以下のコード行は、Gradle が R8 8.5.35 (`Kotlin 2 stdlib` をサポート) を強制的に解決してから、Android Gradle プラグインがバンドルされている古いバージョンを選択します。次に、`mergeExtDexRelease`タスクは新しい R8 を使用し、ビルドは正常に完了します。

```kotlin
buildscript { dependencies { classpath 'com.android.tools:r8:...' } }
```

> **Note:**
>
> R8 をオーバーライドしても、Kotlin 以外のコードには影響しません。変更されるのはデクサ/シュリンクのバージョンだけで、アプリケーション コード、AGP バージョン、小型化ルールは変更されません。

## 解像度の確認##verify-the-resolution

1. プロジェクトルートから以下のコマンドを実行して、開いている Gradle デーモンを閉じます。
   `./gradlew --stop.`または、以下を実行して Gradle 変換を削除できます。 `~/.gradle/caches/transforms-3/`
2. Unity エディターで、**「ファイル**」＞「**ビルド設定…**」＞「**ビルド（リリース設定）**」を選択します。
3. `:launcher:mergeExtDexRelease` タスクが完了し、APK または AAB が D8 エラーなしでビルドされることを確認します。

エラーが解消されない場合は、以下のください。

* `buildscript`ブロックが`settingsTemplate.gradle`にあり、`mainTemplate.gradle`または`baseProjectTemplate.gradle`ではないことを確認します。
* 他のテンプレートが古い R8 クラスパスを再導入していないことを確認します。
  0- 以下のコマンドを使用して Gradle Transform キャッシュを消去し、リビルド: `rm -rf ~/.gradle/caches/transforms-3/`
