라떼군 이야기


Android Studio 'source value 8 is obsolete' 경고 원인과 해결 방법

Problem

안드로이드 스튜디오(Android Studio)에서 네이티브 안드로이드 앱이나 Flutter 프로젝트를 빌드할 때, 빌드 로그에 warning: [options] source value 8 is obsolete and will be removed in a future releasetarget value 8 is obsolete...와 같은 경고 메시지가 나타나는 경우가 많습니다. 이 문제는 주로 안드로이드 스튜디오나 Gradle 버전을 업데이트한 후 기존 프로젝트를 열었을 때 발생합니다. 빌드 자체가 실패하는 것은 아니지만, 향후 릴리스에서 해당 옵션이 제거될 것이라는 경고이므로 프로젝트의 Java 호환성 설정을 최신 환경에 맞게 업데이트해야 합니다.

Background

이 경고는 프로젝트를 빌드하는 데 사용되는 최신 Java 컴파일러(JDK)가 구버전인 Java 8(1.8)에 대한 지원을 점진적으로 중단하고 있기 때문에 발생합니다. 최신 Android 개발 환경과 Flutter는 안정적인 빌드와 최신 기능 지원을 위해 JDK 17을 표준으로 채택하고 있습니다. 하지만 프로젝트의 build.gradle 파일에는 여전히 소스 및 타겟 호환성이 Java 8로 하드코딩되어 있어, 최신 컴파일러와 프로젝트 설정 간의 불일치가 발생하게 됩니다. 이를 해결하려면 Java, Gradle, Android Gradle Plugin(AGP), 그리고 Kotlin 버전 간의 호환성을 맞추어 버전을 상향 조정해야 합니다.

Solution

이 문제를 해결하는 방법은 크게 두 가지가 있습니다. 최신 Gradle에서 권장하는 Java Toolchain을 사용하는 방법명시적으로 호환성 버전을 지정하는 방법입니다.

1. Java Toolchain 사용하기 (권장)

가장 깔끔하고 현대적인 해결책은 Gradle의 Java Toolchain 기능을 사용하는 것입니다. 이 방식을 사용하면 sourceCompatibilitytargetCompatibility를 개별적으로 설정할 필요 없이, Gradle이 지정된 버전의 JDK를 자동으로 감지하거나 다운로드하여 사용합니다.

Kotlin DSL (build.gradle.kts)을 사용하는 경우:

java {
    toolchain {
        // Java 17 버전을 사용하도록 툴체인 설정
        languageVersion = JavaLanguageVersion.of(17)
    }
}

Groovy (build.gradle)를 사용하는 경우:

java {
    toolchain {
        // Java 17 버전을 사용하도록 툴체인 설정
        languageVersion = JavaLanguageVersion.of(17)
    }
}

2. build.gradle에 명시적으로 버전 지정하기 (기존 방식)

Flutter 프로젝트나 기존 레거시 설정이 많은 경우, app/build.gradle 파일에서 컴파일 옵션과 Kotlin JVM 타겟을 직접 Java 17로 수정할 수 있습니다.

android {
    // ... 기존 설정들 ...

    compileOptions {
        // 소스 코드와 생성되는 바이트코드의 버전을 Java 17로 지정
        sourceCompatibility JavaVersion.VERSION_17
        targetCompatibility JavaVersion.VERSION_17
    }
    
    kotlinOptions {
        // Kotlin 코드가 컴파일될 때 타겟팅하는 JVM 버전을 17로 지정
        jvmTarget = "17"
    }
}

3. Gradle 및 플러그인 버전 동기화

Java 버전을 17로 올렸다면, 이에 맞는 Gradle 및 플러그인 버전을 사용해야 정상적으로 빌드됩니다.

  1. gradle/wrapper/gradle-wrapper.properties 업데이트:
# Gradle 8.x 버전(예: 8.10.2)으로 업데이트
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip
  1. settings.gradle (또는 프로젝트 수준 build.gradle) 플러그인 업데이트:
plugins {
    // JDK 17 및 Gradle 8.x와 호환되는 플러그인 버전 사용
    id "com.android.application" version "8.3.2" apply false
    id "org.jetbrains.kotlin.android" version "2.0.20" apply false
}

Deep Dive

단순히 경고를 숨기기 위해 컴파일러 옵션에 -Xlint:-options를 추가하는 것은 기술 부채를 쌓는 안 좋은 안티 패턴입니다. 향후 JDK 업데이트 시 Java 8 지원이 완전히 제거되면 예고 없이 빌드가 실패하게 됩니다. 또한, compileOptions를 수동으로 맞추는 것보다 Java Toolchain을 사용하는 것이 프로덕션 환경에서 훨씬 유리합니다. Toolchain을 사용하면 팀원들이 각자 다른 버전의 로컬 JDK를 설치해 두었더라도, Gradle이 프로젝트에 명시된 버전(예: JDK 17)의 JVM을 일관되게 사용하여 ‘내 PC에서는 되는데 네 PC에서는 안 되는’ 환경 불일치 문제를 원천적으로 차단할 수 있습니다. 안드로이드 스튜디오의 Settings > Build, Execution, Deployment > Build Tools > Gradle 메뉴에서 ‘Gradle JDK’ 설정이 프로젝트 요구사항과 일치하는지도 항상 확인하는 것이 좋습니다.

Conclusion

source value 8 is obsolete 경고는 프로젝트의 Java 호환성 설정이 최신 빌드 도구의 기준에 미치지 못할 때 발생하는 자연스러운 현상입니다. 임시방편으로 경고를 숨기기보다는, 프로젝트의 Java 버전을 최신 표준인 JDK 17로 마이그레이션하고 Gradle Java Toolchain을 적용하여 근본적으로 해결하는 것이 좋습니다. 이를 통해 빌드 경고를 제거하고 향후 안드로이드 및 Flutter 업데이트에 유연하게 대응할 수 있습니다.

References

협업 및 후원 연락하기 →