# Kotlin 2로 인한 Android 빌드 오류 문제 해결

> Unity 2022 LTS 이하로 빌드 경우 레벨플레이 9.6.0에 도입된 Kotlin 2 종속성으로 인해 발생하는 Android 빌드 오류를 식별 수정합니다.

레벨플레이 SDK 9.6.0과 함께 Unity 2022 LTS 이하를 사용하는 경우 Android 빌드 오류가 발생할 수 있습니다. 이 가이드에서는 이를 식별 결정 방법을 설명합니다.

> **Note:**
>
> 이 빌드 오류 문제는 Unity 2022 LTS 이하에만 영향을 줍니다. Unity 6 이상은 최신 빌드 툴체인과의 호환성 지원하며 영향을 받지 않습니다.

## 증상##symptom

레벨플레이 Unity(Ads Mediation) 패키지를 9.6.0으로 업그레이드하면 Android 빌드 실패하고 다음 오류가 표시됩니다.

```xml
참고: 일부 입력 파일은 지원이 사용 중단 예정 API 사용하거나 오버라이드.
참고: 자세한 내용은 -Xlint:deprecation으로 다시 컴파일합니다.
ERROR:D8: com.android.tools.r8.kotlin.H

실패: 빌드 완료되었지만 2건의 오류가 발생했습니다.

1: 작업에 실패하고 예외가 발생했습니다.
-----------
* 잘못된 사항:
  작업 ':런처:mergeExtDexRelease'에 대한 실행이 실패했습니다.
> 설정에 대한 모든 파일을 결정할 수 없습니다. ':런처:releaseRuntimeClasspath'
> 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 호환성 문제를 확인합니다.

1. 출력에 `ERROR:D8: com.android.tools.r8.kotlin.H` 줄이 표시됩니다.
2. 결함이 발생한 아티팩트는 `kotlin-stdlib-2.1.21.jar`(또는 다른 `Kotlin 2.x stdlib`)입니다.

## 원인##causes

Android 빌드 오류는 다음과 같은 이유로 발생할 수 있습니다.

* 레벨플레이 SDK 9.6.0(및 일부 네트워크 어댑터)은 Kotlin 2.x 표준 라이브러리(`kotlin-stdlib-2.1.21`)에 종속되어 있습니다.
* Unity 2022 LTS에는 Kotlin 2 지원 이전의 AGP/R8 버전이 번들로 제공됩니다. 번들 D8/R8은 `D8: com.android.tools.r8.kotlin.H` 오류와 보조 `StackOverflowError`로 나타나는 Kotlin 2 stdlib 메타데이터를 처리할 수 없습니다.

## 해결 방법##resolution

이 문제를 결정하려면 다음 지침에 따라 `settingsTemplate.gradle`에 `buildscript` 차단을 추가하여 R8을 오버라이드합니다.

1. 프로젝트에 아직 `settingsTemplate.gradle` 파일이 없는 경우 다음과 같이 Unity 에디터에서 활성화합니다.
   a. **파일** > **빌드 설정**으로 이동합니다.
   b. 플랫폼으로 **Android를** 선택한 다음 **플레이어 설정**을 선택합니다. **프로젝트 설정** 창이 열립니다.
   c. **Android 설정** 탭에서 **퍼블리셔 설정**으로 이동한 다음 **커스텀 Gradle 설정 템플릿**을 활성화합니다. 이렇게 하면 Unity가 **ARTIFACTORYREPOSITORY** 및 **DIR\_UNITYPROJECT** 토큰이 있는 A`ssets/Plugins/Android/settingsTemplate.gradle` 파일을 생성할 수 있습니다.
2. 를 엽니다`Assets/Plugins/Android/settingsTemplate.gradle`.
3. Google의 R8 릴리스 Maven에서 R8 8.5.35을 당기는 `buildscript` 코드 차단을 추가합니다. 기존의 `pluginManagement` 코드 차단 바로 뒤에 추가합니다.

> **Note:**
>
> 권장되는 베스트 프랙티스는 Unity 2022 LTS에서 레벨플레이 9.6.0에 대해 검증된 버전인 R8 버전 8.5.35입니다. 하지만 8.5.35보다 최신 R8 버전을 사용할 수 있습니다. 구체적으로 Kotlin 2를 지원하는 8.5.x 이상의 R8 버전은 모두 지원됩니다.

```kotlin
pluginManagement {
    repositories {
        **ARTIFACTORYREPOSITORY**
        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 컴파일 아니라 덱스 파이프라인 발생하므로 R8만 업그레이드해야 합니다.

다음 코드 라인은 Android Gradle 플러그인이 번들로 된 오래된 버전을 선택하기 전에 Gradle이 R8 8.5.35(`Kotlin 2 stdlib` 지원)를 결정합니다. 그런 다음 `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` 차단이 `mainTemplate.gradle` 또는 `baseProjectTemplate.gradle`가 아닌 `settingsTemplate.gradle` 상태인지 확인합니다.
* 이전 R8 클래스 경로를 다시 도입하는 다른 템플릿이 없음을 확인합니다.
  0- 다음 커맨드를 사용하여 Gradle 변환하다(동사), 트랜스폼(명사) 캐시를 지우고 다시 빌드합니다. `rm -rf ~/.gradle/caches/transforms-3/`
