이번 편의 목표: 기존 앱을 targetSdk 변경 없이 안드로이드 17에서 실행해 보고, 문제가 없을 때 37로 올립니다.
공식 이전 절차는 두 단계입니다. 첫 단계는 호환입니다. 이미 배포한 앱을 안드로이드 17 기기나 에뮬레이터에 설치하고, 모든 앱에 적용되는 동작 변경만 통과하면 됩니다. 이 단계에서는 targetSdk와 compileSdk를 올리지 않아도 됩니다. 통과한 업데이트를 먼저 배포합니다.
둘째 단계는 타깃입니다. compileSdk와 targetSdk를 37로 올리고, API 37을 타깃하는 앱에만 적용되는 변경을 수정한 뒤 다시 배포합니다. Play가 API 37 제출을 요구하는 2027년 8월 전이라도, 픽셀에는 이미 안드로이드 17이 있으므로 호환 단계는 지금 합니다.
모든 앱에 영향이 있는 항목과 타깃 37에만 영향이 있는 항목을 테스트에서 섞지 않습니다. 개발자 옵션의 앱 호환성 변경 메뉴는 디버그 빌드에서 타깃 전용 규칙을 하나씩 켜게 해 줍니다. targetSdk를 37로 올리기 전에 규칙 하나의 영향만 볼 수 있습니다.
메시지 큐는 그 예입니다. targetSdk 37부터 android.os.MessageQueue가 잠금 없는 구현으로 바뀌고, 리플렉션으로 내부 필드를 보던 코드와 테스트 라이브러리가 깨질 수 있습니다. 예전 private 필드 mMessages는 바이너리 호환을 위해 남아 있지만 항상 null입니다. 디버그 빌드에서 미리 켜 보려면 다음 명령을 사용합니다.
adb shell am compat enable USE_NEW_MESSAGEQUEUE com.thinktree.library
같은 명령을 disable로 바꾸면 기존 잠금 구현으로 돌아가 원인이 메시지 큐인지 가릅니다. 패키지 이름은 앱의 applicationId입니다.
제한된 비공개 API 호출은 logcat 경고로 남습니다. 디버그 빌드에서는 StrictMode의 detectNonSdkApiUsage()로 그 접근을 테스트에서 실패하게 만들 수 있습니다. 공개 SDK나 NDK에 같은 기능이 있으면 그쪽으로 바꿉니다.
라이브러리도 앱과 같이 테스트합니다. 안드로이드 17 기기에서 CameraX가 죽는 경우는 1.5.2 또는 1.6.0 이상으로 올려 피합니다. 이 버전 미만은 추가된 다이내믹 레인지 모드 때문에 깨질 수 있다고 발표되었습니다.
호환 빌드가 주요 흐름을 통과하면 모듈의 targetSdk를 37로 바꿉니다.
defaultConfig {
targetSdk = 37
}이 한 줄 이후에 05편부터의 규칙이 앱에 적용됩니다.
직접 해 보기
디버그 빌드를 안드로이드 17 에뮬레이터에 설치하고, 로그인부터 주요 화면까지 한 번씩 실행하세요. 죽기 전에 targetSdk를 바꾸지 않습니다.
해설
호환 단계에서 죽는 버그는 안드로이드 17 기기 자체에서 모든 앱에 생기는 변경입니다. targetSdk를 37로 올린 뒤에만 생기는 버그는 타깃 전용 변경입니다. 로그의 시점을 이 둘로 나누면 수정 위치가 줄어듭니다.
COMMENTS
댓글 0
이 글에 대한 의견이나 질문을 남겨 주세요.
댓글은 구글이나 카카오로 시작한 뒤에 남길 수 있습니다.
등록된 댓글이 없습니다.