물에 살고싶은 개발자

[Android] SDK 내재화 중 발생한 다양한 빌드 문제와 해결 과정 본문

Android

[Android] SDK 내재화 중 발생한 다양한 빌드 문제와 해결 과정

돼지사랑 2024. 8. 14. 14:13

안드로이드 프로젝트를 진행하면서 Gradle과 Kotlin을 설정하는 과정에서 여러 가지 문제에 직면했습니다. 특히, Java 버전 호환성 문제, Kotlin 플러그인 설정, Gradle 빌드 시스템의 오류, 그리고 Java 모듈 시스템과의 충돌로 인해 빌드 오류가 발생했습니다. 이 글에서는 이러한 문제들을 하나하나 해결해 나가면서 얻은 경험을 공유하고자 합니다.

 

우선 선결론으로 해결책먼저 제공하고 글 시작하겠습니다.

Gradle을 7.2버전으로 조정 및 Java를 11버전을 사용하도록 설정.

build.gradle에 kotlin 사용을 추가했으며, SDK 내재화로 로컬에서 import했던 aar형태의 sdk를 통합해주는것으로 보이는 fat-aar 라이브러리 관련코드를 싹 제거했더니 문제가 해결됐습니다.

아래는 그 결과를 향한 과정이라고 봐주시면 되겠습니다.

Java 17과 Gradle 6.5의 호환성 문제

프로젝트를 진행하던 중, Gradle 설정을 마치고 프로젝트를 빌드하려고 했을 때 다음과 같은 오류가 발생했습니다:

Unsupported Java.
Your build is currently configured to use Java 17.0.9 and Gradle 6.5.

이 오류는 Gradle 6.5 버전이 Java 17과 호환되지 않기 때문에 발생했습니다. Java 17은 최신 기능을 지원하지만, Gradle의 6.x 버전대는 이를 공식적으로 지원하지 않습니다. 이로 인해 Gradle과 Java 간의 호환성 문제가 발생했고, 프로젝트 빌드가 중단되었습니다. 최신 Java 버전의 이점을 활용하려면, Gradle을 업그레이드할 필요가 있었습니다.

Gradle 버전 업그레이드

Gradle 6.5는 Java 17을 지원하지 않기 때문에, Gradle을 최소 7.2 버전으로 업그레이드하기로 결정했습니다. 이를 통해 최신 Java 기능을 활용하면서도 안정적인 빌드 환경을 유지할 수 있었습니다. Gradle을 업그레이드하는 과정은 다음과 같습니다:

  1. Gradle Wrapper 설정 변경: 프로젝트 루트 디렉토리의 gradle-wrapper.properties 파일을 열고, 다음과 같이 수정했습니다:이 설정을 통해 Gradle 버전을 7.2로 업그레이드할 수 있었습니다. Gradle 버전이 업그레이드되면, Gradle의 여러 가지 성능 향상과 최신 기능을 사용할 수 있게 됩니다.
  2. distributionUrl=https\\://services.gradle.org/distributions/gradle-7.2-bin.zip
  3. 프로젝트 동기화: 안드로이드 스튜디오에서 File > Sync Project with Gradle Files를 클릭하여 프로젝트를 다시 동기화했습니다. Gradle 버전이 업그레이드되면서 의존성들이 다시 설정되고, 빌드 프로세스가 새롭게 시작되었습니다.

Kotlin 플러그인 관련 문제

Gradle 업그레이드 후, 프로젝트에 Kotlin을 추가하려고 할 때 새로운 문제가 발생했습니다. build.gradle 파일에 Kotlin 관련 플러그인을 추가한 후, 다음과 같은 오류가 발생했습니다:

Plugin with id 'kotlin-android-extensions' not found.

이 문제는 kotlin-android-extensions 플러그인이 더 이상 지원되지 않기 때문에 발생했습니다. Kotlin 1.4.20 이후로 이 플러그인은 사용되지 않으며, 대신 View Binding이나 Kotlin Synthetics가 권장됩니다. 또한, kotlin-android 플러그인을 적용할 때도 Plugin with id 'kotlin-android' not found라는 오류가 발생했습니다.

Kotlin 플러그인 교체 및 설정 수정

이 문제를 해결하기 위해 kotlin-android-extensions 플러그인을 제거하고, 다음과 같은 작업을 수행했습니다:

  1. 플러그인 제거: build.gradle 파일에서 kotlin-android-extensions 플러그인을 제거하고, 필요에 따라 View Binding을 활성화했습니다:
  2. apply plugin: 'com.android.application' apply plugin: 'kotlin-android'
  3. Gradle 동기화: 변경된 설정을 적용하기 위해 다시 한 번 Gradle 동기화를 진행했습니다.

이와 함께 kotlin-android 플러그인이 인식되지 않는 문제도 해결해야 했습니다. 이를 위해 프로젝트 수준의 build.gradle 파일을 수정하여 kotlin-gradle-plugin을 추가했습니다:

buildscript {
    ext.kotlin_version = '1.8.10'
    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

allprojects {
    repositories {
        google()
        mavenCentral()
    }
}

이 설정을 통해 Gradle이 Kotlin 플러그인을 인식할 수 있도록 했습니다.

Gradle 캐시 및 Daemon 관련 문제

프로젝트를 다시 빌드하는 과정에서 다음과 같은 오류가 발생했습니다:

Unable to load class 'org.gradle.api.internal.artifacts.DefaultResolvedArtifact'

이 오류는 Gradle의 의존성 캐시가 손상되었거나, 빌드 프로세스(Gradle Daemon)가 제대로 작동하지 않을 때 발생합니다. 이를 해결하기 위해 Gradle 캐시를 정리하고, Daemon을 중지한 후 다시 빌드했습니다:

./gradlew cleanBuildCache
./gradlew --stop
./gradlew build

Gradle 캐시와 Daemon을 정리한 후 프로젝트를 다시 빌드함으로써, 이전에 발생했던 문제들을 해결할 수 있었습니다.

Java 모듈 시스템 충돌 문제

fat-aar 관련 코드를 build.gradle 파일에서 주석 처리한 후, 또 다른 문제가 발생했습니다:

Unable to make field private final java.lang.String java.io.File.path accessible: module java.base does not "opens java.io" to unnamed module @53c7fb81

이 오류는 Java 모듈 시스템에서 특정 클래스나 필드에 대한 접근을 제한하기 때문에 발생했습니다. 특히, Java 17과 같은 최신 Java 버전을 사용할 때 Gradle 또는 플러그인이 Java 모듈 시스템과 호환되지 않는 경우 이런 문제가 발생할 수 있습니다.

Java 모듈 시스템 문제 해결

이 문제를 해결하기 위해 JVM 옵션을 통해 Java 모듈 시스템에서 특정 패키지의 접근을 허용했습니다:

  1. Gradle JVM 옵션 추가: 프로젝트 루트 디렉토리의 gradle.properties 파일에 다음 JVM 옵션을 추가했습니다:이 설정을 통해 java.io 패키지가 모든 모듈에서 접근 가능하도록 설정했습니다.
  2. org.gradle.jvmargs=--add-opens java.base/java.io=ALL-UNNAMED
  3. Gradle 캐시 및 Daemon 정리: 이후 Gradle 캐시를 정리하고, Daemon을 중지한 후 프로젝트를 다시 빌드했습니다:
  4. ./gradlew cleanBuildCache ./gradlew --stop ./gradlew build

이 과정에서 발생한 문제는 JVM 옵션을 통해 접근을 허용함으로써 해결되었습니다.

Java 및 Gradle 버전 조정

이후, 더 이상의 문제를 예방하고, 전체 프로젝트의 호환성을 높이기 위해 Java 버전을 11로 변경하기로 했습니다. Java 17은 최신 기능을 제공하지만, 일부 Gradle 플러그인이나 라이브러리와의 호환성 문제가 발생할 수 있기 때문입니다.

  1. Java 11로 변경: 시스템의 JAVA_HOME 환경 변수를 Java 11의 설치 경로로 설정하고, 안드로이드 스튜디오에서 JDK를 Java 11로 설정했습니다.
  2. Gradle JDK 설정 변경: File > Project Structure > SDK Location에서 JDK location을 Java 11로 설정했습니다. 이를 통해 Gradle과 Java 간의 호환성 문제를 최소화했습니다.
  3. Gradle 버전 업그레이드: Gradle을 7.2 버전으로 업그레이드하여, Java 11과의 호환성을 보장했습니다.

프로젝트 안정화

Gradle과 Java 버전을 각각 7.2, 11로 설정한 후, 모든 문제는 해결되었습니다. 더 이상 빌드 오류가 발생하지 않았으며, 프로젝트는 안정적으로 동작하기 시작했습니다.

결론

Gradle과 Kotlin 설정 과정에서 발생한 다양한 문제들은 Gradle 버전, Java 버전, Kotlin 플러그인 간의 호환성 문제와 관련이 있었습니다. Gradle을 7.2 버전으로 업그레이드하고, Java를 11 버전으로 변경하며, Kotlin 플러그인을 올바르게 설정함으로써 프로젝트 빌드 문제를 해결할 수 있었습니다. 또한, Java 모듈 시스템의 접근 제한 문제를 해결하기 위해 JVM 옵션을 추가하는 등의 작업을 통해 프로젝트의 안정성을 확보할 수 있었습니다.

이 과정을 통해 얻은 교훈은 최신 기술 스택을 사용할 때는 호환성 문제에 대한 사전 검토가 필수적이라는 것입니다. 앞으로도 지속적으로 최신 기술 변화에 맞춰 프로젝트 설정을 유지하고, 문제가 발생했을 때 신속하게 대응할 수 있도록 노력해야겠습니다. 이 글이 유사한 문제를 겪는 개발자들에게 도움이 되기를 바랍니다.

Comments