Play 콘솔에 "최적화된 리소스 축소를 쓰려면 AGP 9로 올리라"는 권장 조치가 뜨길래 AGP를 9로 올렸어요. 그랬더니 멀쩡하던 빌드가 줄줄이 깨지더라고요.
AGP 9는 메이저 버전이라 그동안 "곧 없어집니다" 하던 옵션들이 이번에 실제로 사라졌어요. 그래서 오래된 프로젝트일수록 걸리는 게 많아요.
Kotlin·Compose 프로젝트와 순수 자바·XML 프로젝트를 각각 올려봤는데, 터지는 에러가 서로 달랐어요. 둘 다 정리해둡니다.
먼저 버전 조합부터
AGP만 올리면 Gradle 에러부터 나요. 제가 빌드를 통과시킨 조합은 이거예요.
// gradle/wrapper/gradle-wrapper.properties
distributionUrl=https\://services.gradle.org/distributions/gradle-9.7.1-bin.zip
// AGP
com.android.tools.build:gradle:9.4.0
Gradle 8.x를 그대로 두면 바로 실패해요. 그리고 스튜디오가 AGP 9.4를 열 수 있는 버전인지도 먼저 확인하세요. 이건 지난번 Gradle Sync 실패 글에 호환표를 정리해뒀어요.
자바·XML 프로젝트에서 터진 것

자바·XML 프로젝트에서 터지는 에러 3가지
1. constant expression required
제일 당황스러운 에러였어요. 코드는 한 줄도 안 바꿨는데 이런 데서 컴파일 에러가 나요.
switch (v.getId()) {
case R.id.btn_save: // ← error: constant expression required
...
}
원인은 R.id가 더 이상 상수(final)가 아니게 된 거예요. 예전엔 gradle.properties에 android.nonFinalResIds=false를 넣어서 버틸 수 있었는데, AGP 9에서 이 옵션 자체가 없어졌어요. 자바의 switch-case는 상수만 받으니 깨질 수밖에 없죠.
해결은 if-else로 바꾸는 것뿐이에요.
int id = v.getId();
if (id == R.id.btn_save) {
...
} else if (id == R.id.btn_cancel) {
...
}
스튜디오에서 switch 위에 커서를 두고 Alt+Enter를 누르면 "Replace 'switch' with 'if'"가 나와요. 손으로 바꾸는 것보다 훨씬 빨라요.
2. buildconfig 프로퍼티가 없다는 에러
gradle.properties에 android.defaults.buildfeatures.buildconfig=true가 있으면 에러가 나요. 이 프로퍼티가 없어졌거든요. 지우고, BuildConfig가 필요한 모듈에만 따로 켜주면 돼요.
android {
buildFeatures {
buildConfig true
}
}
3. resValue를 쓰는데 resValues가 꺼져 있다는 에러
buildType 안에 resValue가 하나라도 있으면 이제 이 기능을 명시적으로 켜야 해요. 광고 ID 같은 걸 resValue로 빌드 타입마다 다르게 넣는 프로젝트가 많아서 은근히 잘 걸려요.
android {
buildFeatures {
resValues true
}
}
Kotlin·Compose 프로젝트에서 터진 것

Kotlin·Compose 프로젝트에서 바뀌는 설정
Kotlin 쪽은 Kotlin 지원이 AGP 안으로 들어오면서 생긴 에러였어요.
1. kotlin-android 플러그인 제거
AGP 9에는 Kotlin 지원이 내장돼 있어서 org.jetbrains.kotlin.android 플러그인을 따로 적용하면 충돌해요. 모듈의 plugins { }와 버전 카탈로그에서 지워주세요.
2. kotlinOptions → compilerOptions
// 예전
kotlinOptions {
jvmTarget = "17"
}
// AGP 9
kotlin {
compilerOptions {
jvmTarget.set(JvmTarget.JVM_17)
}
}
compileSdk 37을 요구할 때
하나 더 헷갈렸던 게 있어요. AGP 9로 올린 Kotlin 프로젝트는 compileSdk 37을 요구했는데, 자바 프로젝트는 36으로도 잘 돌았어요.
알고 보니 이건 AGP가 아니라 라이브러리 버전 때문이었어요. Kotlin 쪽은 core-ktx, lifecycle, Compose BOM을 같이 최신으로 올렸고, 그 라이브러리들이 37을 요구한 거예요. 자바 쪽은 appcompat·material 버전을 그대로 둬서 36으로 충분했고요.
그리고 37을 설치하실 때 하나 주의하세요. SDK 폴더 이름이 android-37이 아니라 android-37.0이에요. Android 17부터 마이너 버전이 붙었거든요.
sdkmanager "platforms;android-37.0"
compileSdk를 37로 올려도 targetSdk는 36으로 둘 수 있어요. compileSdk는 컴파일에만 쓰이고, 실제 앱 동작이 바뀌는 건 targetSdk 쪽이에요.
마이그레이션 요령

compileSdk 37을 요구하는 건 라이브러리
프로젝트가 여러 개라면 하나로 먼저 해보세요. AGP 9 에러는 친절한 편이라 대부분 메시지 끝에 Solution:으로 고칠 방법까지 적어줘요. 하나를 통과시키면서 나온 수정을 나머지에 똑같이 적용하면 금방 끝나요.
그리고 리소스 축소 최적화(optimizeReleaseResources)는 AGP 9로 올리기만 하면 자동으로 켜져요. 따로 넣을 플래그는 없어요. 다만 minifyEnabled와 shrinkResources가 켜져 있어야 해요.
메이저 업데이트는 늘 한 번에 몰아서 아프네요 ^^ 같은 에러로 막혀 계신 분께 도움이 됐으면 좋겠어요.
'안드로이드 개발' 카테고리의 다른 글
| [해결] 안드로이드 구글맵이 빈 화면으로 나올 때 — 마커는 보이는데 지도만 안 뜨는 이유 (0) | 2026.10.28 |
|---|---|
| [해결] Gradle Sync 실패, 알고 보니 안드로이드 스튜디오 버전이 낮았습니다 (AGP 호환표 정리) (0) | 2026.09.26 |
| [해결] No matching client found for package name - applicationIdSuffix와 Firebase의 함정 (0) | 2026.09.03 |
| 오늘의 음주 코딩 23년 5월 25일 (7) | 2023.05.25 |
| Android에서 화면 크기를 픽셀로 얻는 방법 (4) | 2023.05.12 |