Android App Build with Java 21

Posted on 11/02/2023 in tech

시작하면서

2023년 9월 19일에 Java 21이 출시되었습니다. Java 17이 2021년 9월에 나왔었는데, IntelliJ 2022.2.1 부터 Java 17이 기본 탑재되기 시작했고, Android Studio 2022.2.1도 따라서 Java 17을 탑재해서 출시되었습니다.

Java 21은 Java 17에 이은 LTS(Long Term Support)버젼으로 관리가 될텐데요. 따라서 IntelliJ 및 Android Studio에서도 Java 21이 탑재될 것으로 보입니다.

Java 21을 이용해 안드로이드 앱을 빌드하려면 어떠한 준비를 해야하는지 살펴보겠습니다.

빌드도구 조합

먼저 아래 도구의 조합이 필요합니다.

이외에 몇가지 조정이 필요합니다.

Java Byte Code Version

Android Gradle Plugin에서 별다른 설정을 하지 않으면, 앱에서 사용될 Java 소스코드에 대해서는 Java 1.8의 Byte Code를 생성합니다. 하지만 Java 20 이후부터 Java 1.8의 Byte Code를 생성하는 기능이 Deprecated 되었습니다. 해당 기능을 당장 사용하지 못한다는 것은 아니지만, Java 22 또는 그 이후부터는 해당 기능이 제거될 예정이기 때문에, Java 11의 Byte Code 생성을 하는 것을 심각하게 고려해야 합니다. (Java 17의 Byte Code 생성은 아직 Android 빌드 생태계에는 이른 결정이 될 수 있습니다.)

그리고 빌드도중에 사용되는 (즉 PC의 Java VM에서 로딩되는) Java Byte Code는 Android Gradle Plugin과 동일한 Java 17로 설정해서 사용하는게, 당분간 좋을 것입니다.

Kotlin의 JVM Byte Code Version

Kotlin Compiler에서 생성하는 JVM Byte Code Version은 위에 설명한 Java Compiler의 Byte Code Version과 일치시켜야 합니다.

즉, 앱에서 수행될 코드는 Java 11, PC에서 수행될 코드는 Java 17의 Byte Code를 생성하면 됩니다.

AIDL Compiler

AIDL은 다른 어플리케이션이나 프로세스에서 수행되는 로직을 제어하기 위한, 인터페이스 정의 언어입니다. AIDL은 AIDL Compiler를 통해 Java코드로 변환된 후, 앱에 포함이 되는데요. AIDL Compiler에서 생성하는 코드에 대해 Java 21컴파일러는 경고를 표시합니다.
해당 경고는 -Xlint:-this-escape 옵션을 이용해서 끌 수 있습니다. 자세한 사항은 https://issuetracker.google.com/issues/294422895 를 참고하시기 바랍니다.

Android Gradle Plugin

Android Gradle 8.3 은 현재 Canary 11까지 출시되었으며, 정식버젼이 나오려면 3-4달은 기다려야 합니다.
Java 21에서 안드로이드 플랫폼 API를 참조하는 과정에서 jlink라는 도구를 이용하는데, 해당 도구의 동작 사양이 변경되는 바람에 Java 21을 사용하기 어려워 졌는데요.
해당 변경사항에 대한 대응이 Android Gradle Plugin 8.3-alpha03 에 적용되었습니다. 그 이전의 Android Gradle Plugin버젼을 사용하면 오류가 발생되는데, 그렇다고 아직 호환성 문제가 발생할 수 있는 Android Gradle Plugin의 alpha버젼을 도입하는 것도 어려울 가능성이 높습니다.
그래서 이전 Android Gradle Plugin버젼에서 사용할 수 있도록 jlink를 수정JDK를 만들어 보았습니다.

샘플 프로젝트

https://github.com/ganadist/VersionCodeDemo 는 Google 의 이슈트래커에 Android 앱 빌드와 관련된 오류를 공유 할 때 사용하는 repo입니다. 해당 repo의 main branch에 Java 21을 대응할 수 있도록 조정해놓았습니다.

혹시라도 Java 21을 Android 앱 빌드시스템에 적용하는 것을 고려하고 있다면, 참고하시기 바랍니다.