이번 편의 목표: 안드로이드 17 기기나 에뮬레이터에 디버그 빌드를 설치하고, SDK 37에서 달라지는 항목을 순서대로 확인합니다.

스튜디오의 Run으로 02편의 시스템 이미지에 설치합니다. 터미널에서 앱 모듈을 직접 설치하려면 프로젝트 루트에서 다음을 실행합니다.

./gradlew :app:installDebug

설치 뒤에 패키지 버전이 기대와 같은지 확인합니다.

adb shell dumpsys package com.thinktree.library | grep versionName

확인 순서는 targetSdk를 바꾸기 전과 후로 나눕니다.

targetSdk를 36으로 둔 채 안드로이드 17에서 봅니다. 인증서가 투명성 검사의 대상이 됩니다. 안드로이드 16에서는 앱이 켜야 했던 인증서 투명성이 17에서는 기본으로 켜집니다. 프로필을 넘는 루프백이 필요한 기능은 실패해야 합니다. 백그라운드 오디오는 재생, 오디오 포커스, 음량 변경이 제한되고 알람 오디오는 예외입니다. 정확한 조건은 동작 변경 문서를 따릅니다.

그 다음 targetSdk를 37로 올리고 다시 설치합니다. 큰 화면에서 세로 고정이 풀리는지, LAN 권한이 없을 때 소켓이 실패하는지, 알림의 큰 비트맵이 IllegalArgumentException을 일으키는지 봅니다. System.load로 읽는 네이티브 라이브러리는 읽기 전용이어야 합니다. 쓰기가 가능하면 UnsatisfiedLinkError가 납니다. 안드로이드 14에서 DEX와 JAR에 적용되던 동적 코드 로딩 제한이 네이티브 라이브러리까지 넓어진 결과입니다.

NPU에 직접 접근하는 앱은 매니페스트에 FEATURE_NEURAL_PROCESSING_UNIT을 선언해야 막히지 않습니다. LiteRT의 NPU 델리게이트와 공급사 SDK, 더 이상 권장되지 않는 NNAPI가 이 경우에 해당합니다. NPU를 쓰지 않으면 이 기능 선언은 넣지 않습니다.

물리 키보드로 비밀번호를 입력할 때 마지막 글자가 기본으로 보이지 않는지도 비밀번호 화면에서 확인합니다. 이 동작은 targetSdk 37의 비밀번호 필드에 적용됩니다.

목록을 모두 통과한 빌드만 버전 코드를 올려 서명하고 배포합니다. compileSdk 37로 컴파일했다는 사실과 targetSdk 37로 규칙을 받아들이는 일은 릴리스 노트에 둘 다 적습니다. 라이브러리와 게임 엔진을 만드는 경우에는 이 확인이 끝나기 전에 하위 앱이 37로 올리지 못하게 알립니다.

동작 변경의 전체 목록은 다음 페이지에서 갱신됩니다.

직접 해 보기

targetSdk 36 빌드와 37 빌드를 같은 에뮬레이터에 차례로 설치하세요. 큰 화면에서 방향 고정이 풀리는 시점이 37 빌드인지 확인합니다.

해설

36 빌드는 안드로이드 17 위에서도 큰 화면 옵트아웃이 남아 있을 수 있습니다. 37 빌드에서는 그 옵트아웃이 무시되므로 창을 가로로 늘리면 레이아웃이 따라가야 합니다. 두 빌드의 차이로 타깃 전용 변경을 구분합니다.