DIP 스위치 계산기 앱을 Android Studio로 열자 Java 25와 Gradle 8.11.1이 호환되지 않는다는 경고가 나왔다. 처음에는 Gradle 실행 JDK를 21로 고정했지만, 곧 JDK 25·Gradle 9.1.0·AGP 9.0.1로 빌드 환경을 변경했다. 이 과정에서 R8과 Play Console 경고 대응 설정도 정리했다.

Java 25 경고에 Gradle 실행 JDK부터 고정했다
IDE에 표시된 메시지는 Java 25 and Gradle 8.11.1 are incompatible였다. PC의 JDK가 25라는 점은 이 메시지와 문서로 짐작한 것이다.
프로젝트는 Gradle 8.11.1과 AGP 8.10.1을 사용하고 있었다. 공식 호환표에 따르면 Java 25에서 Gradle을 실행하려면 9.1.0 이상이 필요했다.
14시 27분 29초에는 Gradle 데몬의 JDK를 21로 지정하는 파일을 추가했다. AGP는 그대로 두고 실행 환경만 맞추려 했다.
# Gradle Daemon JVM criteria: run Gradle 8.11.1 with a compatible Java runtime.
# Java 25 requires Gradle 9.1+; do not change Gradle/AGP solely for an IDE JVM mismatch.
# On Android Studio, choose JDK 21 for Gradle when prompted.
toolchainVersion=21
11초 뒤에는 GitHub Actions의 JDK를 17에서 21로 변경했다. 14시 28분 01초에는 Gradle Wrapper만 9.x로 올리지 말라는 주의사항을 빌드 문서에 추가했다.
3분도 안 돼 JDK 25와 AGP 9로 방향을 바꿨다
그 문서를 쓴 지 3분도 안 돼 방향을 바꿨다. 14시 30분 43초부터 31분 00초까지 17초 동안 같은 메시지의 커밋 7개가 찍혔다. 메시지는 "JDK 25 / AGP 9로 이전하고 R8 리소스 축소 켜기"였다.

Gradle만 올리지 말라고 적은 이유는 AGP 8.10.1과의 호환 검토가 필요해서였다. 반대로 AGP 9.0의 최소 Gradle 버전은 9.1.0이라, 이번에는 JDK·Gradle·AGP를 한 묶음으로 올렸다.

| 항목 | 이전 | 이후 |
|---|---|---|
| Gradle Wrapper | 8.11.1 | 9.1.0 |
| AGP | 8.10.1 | 9.0.1 |
| Gradle 데몬 JDK · CI JDK | 21 | 25 |
| core-ktx / activity-compose | 1.16.0 / 1.10.1 | 1.17.0 / 1.12.4 |
| Google 모바일 광고 SDK | 25.4.0 | 25.5.0 |
데몬 설정의 toolchainVersion도 21에서 25로 변경했다. 이 값은 Gradle 실행 JDK를 정하는 것이며, 앱의 Java 11 바이트코드 타깃과는 별개다.
AGP 9 내장 Kotlin으로 플러그인 선언을 정리했다
AGP 9.0은 Kotlin 지원을 기본으로 내장한다. 기존 org.jetbrains.kotlin.android 플러그인은 새 DSL과 호환되지 않아 별도 적용을 제거했다.
버전 카탈로그와 루트·앱 모듈 빌드 파일에서 해당 플러그인 선언을 삭제했다. 앱 모듈의 Kotlin 컴파일 옵션 블록도 제거했지만 Java의 VERSION_11 설정은 유지했다.
// app/build.gradle.kts (변경 후)
plugins {
alias(libs.plugins.android.application)
// alias(libs.plugins.jetbrains.kotlin.android) ← AGP 9 내장 Kotlin으로 대체
alias(libs.plugins.compose.compiler)
}
이전 AGP 환경의 경고를 숨기던 android.suppressUnsupportedCompileSdk=35도 삭제했다.
R8 리소스 축소를 켜고 ProGuard 규칙을 줄였다
릴리스의 isMinifyEnabled = true는 유지하고 isShrinkResources = true를 추가했다.
ProGuard 파일에서는 앱 구성 요소와 라이브러리를 광범위하게 보존하던 규칙을 제거했다. 기존 내용 33줄을 삭제하고 주석과 진단용 속성 지시문을 남겼다.
# Avoid blanket -keep rules: AGP and AndroidX / Google SDK dependencies supply
# the consumer rules necessary for Android components and SDK reflection.
# Preserve line mapping for Play Console retrace / crash diagnostics.
-keepattributes SourceFile,LineNumberTable
-renamesourcefileattribute SourceFile
판단 근거는 주석에 적은 그대로다. 필요한 keep 규칙은 AGP와 각 라이브러리가 소비자 규칙으로 함께 제공한다. 크래시 스택을 복원할 줄 번호 정보만 남겼다.

GitHub Actions에 assembleRelease와 bundleRelease를 추가했지만 성공 실행 기록은 확인되지 않았다.
Android 15 컷아웃과 Play Console 경고도 정리했다
Play Console에는 setStatusBarColor, setNavigationBarColor, SHORT_EDGES, NEVER 관련 경고가 있었다. Android 15 이상에서 targetSdk 35 이상 앱에 edge-to-edge가 기본 적용되는 정책과 관련된 내용이었다.
앱 테마의 windowLayoutInDisplayCutoutMode를 always로 지정했다. 기존 enableEdgeToEdge()와 Scaffold의 안쪽 여백 처리는 그대로 두었다.
일부 경고는 광고 SDK나 Play Core 같은 의존성에서 왔을 수 있다. 그래서 이 설정만으로 경고가 다 사라진다고 보지 않았다.
기존 출시 버전 15(1.5.1)의 경고는 소스 변경만으로 달라지지 않는다. 새로 서명한 AAB를 Play Console에 업로드한 뒤 진단 결과를 다시 확인해야 한다.
빌드 성공과 실제 동작은 다음 검증으로 남겼다
- JDK 25 환경에서 디버그 빌드와 단위 테스트 실행
- R8 적용 릴리스 빌드와 AAB 생성 확인
- Android 15·16 에뮬레이터의 컷아웃과 화면 여백 점검
- 광고·앱 업데이트와 블루투스 2기기 대국 검증
- 서명·versionCode 확인 후 Play Console 진단 재점검
JDK 경고 하나가 Gradle과 AGP까지 이어졌다. 이번 커밋은 설정 변경까지이고, 위 체크리스트는 아직 비어 있다. 남은 항목은 실제 빌드와 기기 검증으로 확인해야 한다.
관련 글: Android 16에서 깨진 로그인, 범인은 OS가 아니라 오래된 주소였다. 참고: Gradle 공식 호환성 표 · Android Gradle Plugin 9.0 출시 노트.
'프로젝트 > DIP 스위치 계산기' 카테고리의 다른 글
| Play 결제 광고 제거를 다 만들고, 메뉴에서는 입구만 숨겼다 (0) | 2026.10.22 |
|---|---|
| 오목 대각선 테스트가 NPE로 깨졌다, 범인은 규칙이 아니라 테스트였다 (0) | 2026.10.21 |
| R8 릴리스 시작 크래시에 WorkManager keep 규칙 두 개를 더했다 (0) | 2026.10.21 |
| 블루투스 대국 Android 12 권한 방어와 메시지 순서 수정까지 10분 (0) | 2026.10.20 |