Android 16 Beta가 출시되었습니다! Android 16 배타에서는 어떤 점이 변경 되었는지 알아보겠습니다! 💡 Android 16을 타겟팅 하는 앱 1️⃣ 제한 없는 화면 레이아웃 지원 방향, 크기 조정, 화면 비율 제한과 같은 고정적인 접근 방식은 오늘날의 멀티 디바이스 환경에 적합하지 않기 때문에 더 유연한 레이아웃 설계가 필요합니다. screenOrientation, minAspectRatio, maxAspectRatio 같은 제한 속성은 sw600dp 이상의 대화면에서 무시됩니다. sw600dp 미만인 디바이스는 영향 받지 않습니다. 게임으로 카테고리된 앱은 영향 받지 않습니다. (AndroidManifest.xml 파일에 android:appCategory = “game” 선언) 사용자가 기기에서 화면 비율 설정을 통해 앱의 기본 동작을 명시적으로 선택하는 경우 영향을 받지 않습니다. 만약에 화면 대응을 당장 하기 어려운 경우는 위와 같이 임시로 비활성화를 할 수 있지만, 다음 버전 타겟팅에서는 적용되지 않기 때문에 대응해야합니다. beta 1인 현재 에뮬레이터에서는 적용되지 않습니다. 따로 적용하려면, adb shell에서 device_config put window_manager ignore_activity_orientation_request true 를 실행해서 전체 앱에 적용하는 방법이 있으며 "app info" -> "aspect ratio" -> "full screen" 으로 앱 별로 적용하는 방법이 있습니다. 자세한건 아래 링크를 참고해주세요. https://issuetracker.google.com/issues/391907169 2️⃣ 예측 가능한 뒤로 가기 동작 android:enableOnBackInvokedCallback 의 default 값이 true로 바뀌며, predictive back이 기본으로 활성화가 됩니다. 시스템 애니메이션(뒤로 가기, 홈 이동 등)이 기본 적용되며, OnBackPressed와 KeyEvent.KEYCODE_BACK 호출은 무시됩니다. 임시적으로 android:enableOnBackInvokedCallback 를 false로 설정해서 비활성화를 할 수 있지만, 언젠가는 막힐 수 있습니다. https://developer.android.com/guide/navigation/custom-back/predictive-back-gesture#update-custom 문서를 참고해서 대응해주시면 될것 같습니다. 실제로 테스트 해본 결과 android:enableOnBackInvokedCallback 를 설정을 하지 않아도, onBackPressed가 호출이 안되는 부분을 확인했습니다. 3️⃣ 정기 작업 스케줄링 최적화 Android 16 타겟 앱은 일정 주기 작업(scheduleAtFixedRate) 실행이 앱 생명주기에 맞춰 더욱 효율적으로 작동합니다. Android 16을 타겟팅하기 전에는, scheduleAtFixedRate가 유효한 프로세스 라이프사이클 외부에 있어 작업 실행이 누락된 경우, 앱이 유효한 라이프사이클로 돌아오면 모든 누락된 실행이 즉시 실행되었습니다. Android 16을 타겟팅할 경우, scheduleAtFixedRate에서 누락된 실행은 앱이 유효한 라이프사이클로 돌아왔을 때 최대 한 번만 즉시 실행됩니다. 💡 Android 16에 추가 된 새로운 기능 1️⃣ 햅틱 API 확장 Android 16에서는 앱이 햅틱 효과의 진폭과 주파수 곡선을 정의할 수 있는 새로운 햅틱 API가 추가되었습니다. 이 기능은 기기별 차이를 추상화하여, 다양한 기기에서 일관된 햅틱 경험을 제공합니다. 2️⃣ 진보된 사진 선택기 개선 Android 16에서는 사진 선택기 기능이 개선되어, 앱이 사진 선택기를 뷰 계층에 직접 포함하거나 클라우드 미디어 제공자에서 검색할 수 있는 새로운 API가 추가되었습니다. 3️⃣ 고급 프로페셔널 비디오 지원 Android 16은 고급 전문 비디오(Advanced Professional Video, APV) 코덱을 지원하여, 고품질 비디오 녹화와 후속 작업에 유용합니다. 4️⃣ Wi-Fi 보안 기능 강화 Android 16에서는 Wi-Fi 6 (802.11az)을 지원하는 기기에서 Wi-Fi 위치 정보를 보다 정밀하게 제공할 수 있으며, AES-256 기반의 암호화 및 MITM 공격 방지 등의 보안 기능이 강화되었습니다. 5️⃣ 예측 가능한 뒤로 가기 동작 Android 16은 제스처 내비게이션에서 뒤로 가기 애니메이션을 예측할 수 있는 새로운 API를 추가했습니다. 이를 통해 사용자는 뒤로 가기 애니메이션을 좀 더 직관적으로 경험할 수 있으며, finishAndRemoveTaskCallback()과 moveTaskToBackCallback()도 새로 추가되었습니다. finishAndRemoveTaskCallback : finishAndRemoveTaskCallback는 주어진 Activity에서 finishAndRemoveTask()를 호출하는 콜백을 반환합니다. 만약 해당 액티비티가 태스크의 루트 액티비티인 경우, 해당 태스크가 최근 태스크 목록에서 제거됩니다. 모든 경우에서 액티비티는 종료되며, 시스템은 관련된 전환 애니메이션을 재생합니다. moveTaskToBackCallback: moveTaskToBackCallback는 주어진 Activity에서 moveTaskToBack(boolean)를 호출하는 콜백을 반환합니다. 이 메서드는 액티비티를 포함하는 태스크를 백그라운드로 이동시킵니다. 이때, 액티비티가 태스크의 루트 액티비티일지라도 시스템은 관련된 전환 애니메이션을 재생합니다. 6️⃣ 진척도 기반 알림 Android 16에서는 사용자 주도형 시작-끝 여정을 원활하게 추적할 수 있도록 돕는 진척도 기반 알림을 도입했습니다. 이러한 알림은 시스템 표면에서 더 높은 가시성을 제공하며, 알림 서랍에서 상위 순위를 차지합니다. 배달 도착 알림이나 지하철 도착 알림 등 유용하게 사용할 수 있어 보입니다. 7️⃣ 시작 구성 요소 정보 ApplicationStartInfo에 getStartComponent()가 추가되어 어떤 구성 요소가 시작을 트리거했는지 구별할 수 있게 되었습니다. 이는 앱의 시작 흐름을 최적화하는 데 유용할 수 있습니다. 8️⃣ 적응형 새로 고침 비율 Android 16에서는 hasArrSupport()와 getSuggestedFrameRate(int)를 도입하여, 앱이 새로 고침 비율을 더 잘 활용할 수 있도록 지원합니다. 또한, getSupportedRefreshRates()가 복원되었습니다. 9️⃣ 더 나은 작업 모니터링 Android 16에서는 JobScheduler#getPendingJobReasons()와 JobScheduler#getPendingJobReasonsHistory()를 도입하여 작업이 대기 중인 이유를 보다 명확하게 파악할 수 있습니다. 🔟 시스템 트리거 프로파일링 Android 16에서는 ProfilingManager에 시스템 트리거 프로파일링을 도입했습니다. 앱은 특정 트리거(예: 콜드 스타트, reportFullyDrawn, ANR 등)에 대해 추적을 등록하고, 시스템이 이를 자동으로 시작하고 종료하도록 할 수 있습니다. 1️⃣1️⃣ 건강 연결 업데이트 Health Connect는 WHO의 활동 강도 기준에 따라 ACTIVITY_INTENSITY라는 새로운 데이터 유형을 추가했습니다. 또한, 건강 기록을 FHIR 형식으로 읽고 쓸 수 있는 API가 업데이트되어, 사용자 동의를 받은 후에 의료 기록에 접근할 수 있습니다. 1️⃣2️⃣ 개인정보 보호 샌드박스 Android 16은 Android의 최신 개인정보 보호 샌드박스를 통합하여 사용자의 개인 정보가 보호될 수 있도록 하는 기술을 지속적으로 개발하고 있습니다. 1️⃣3️⃣ 카메라 야경 모드 장면 탐지 Android 16은 카메라 세션에서 야경 모드로 전환할 시점을 알 수 있도록 EXTENSION_NIGHT_MODE_INDICATOR를 추가했습니다. 이를 통해 CaptureResult와 함께 Camera2 API에서 이를 활용할 수 있습니다. 1️⃣4️⃣ 수직 텍스트 렌더링 지원 Android 16은 텍스트를 수직으로 렌더링하고 측정할 수 있는 저수준 지원을 추가하여, 라이브러리 개발자들이 수직 쓰기 기능을 구현할 수 있도록 기반을 제공합니다. 1️⃣5️⃣ 보완 설명 추가 Android 16은 setSupplementalDescription을 추가하여, ViewGroup에 대한 추가 설명을 제공할 수 있도록 했습니다. 이를 통해 자식 뷰들의 정보를 덮어쓰지 않고도 보충 설명을 제공할 수 있습니다. 1️⃣6️⃣ 폼 필드 필수 여부 표시 setFieldRequired를 AccessibilityNodeInfo에 추가하여 앱이 폼 필드의 필수 여부를 접근성 서비스에 알릴 수 있게 되었습니다. 1️⃣7️⃣ LEA 보청기를 위한 마이크 입력 전환 Android 16은 LE Audio 보청기를 사용하는 사용자들이 보청기의 내장 마이크와 전화기의 마이크를 전환할 수 있도록 지원합니다. 1️⃣8️⃣ LEA 보청기를 위한 주변 소리 볼륨 조절 Android 16은 LE Audio 보청기를 사용하는 사용자들이 보청기 마이크로 감지된 주변 소리의 볼륨을 조절할 수 있는 기능을 추가했습니다. 💡 Android 16 전체 앱에 미치는 영향 1️⃣ ART 내부 변경 Android 16은 Android Runtime (ART)에 최신 업데이트를 적용하여 ART의 성능을 향상시키고 추가적인 Java 기능을 지원합니다. Google Play 시스템 업데이트를 통해 이 개선 사항은 Android 12(API 레벨 31) 이상의 기기에도 제공됩니다. 그러나 이 변경 사항이 출시됨에 따라, ART의 내부 구조에 의존하는 라이브러리 및 앱 코드가 Android 16 또는 그 이전 버전을 실행하는 기기에서 올바르게 작동하지 않을 수 있습니다. 2️⃣ JobScheduler 실행 쿼터 최적화 Android 16은 JobScheduler의 정기 작업 및 우선 작업 실행 쿼터를 몇 가지 요소에 따라 조정합니다. 앱이 어떤 대기 상태에 있는지, 작업이 앱의 최상위 상태에서 시작되는지 여부, 작업이 Foreground Service 내에서 실행되는지 여부 등이 포함됩니다. 3️⃣ 순차 방송 우선순위 범위가 더 이상 전역적이지 않음 Android 16에서는 android:priority 속성이나 IntentFilter#setPriority()를 사용하여 다른 프로세스 간의 방송 순서를 보장하지 않습니다. 순차 방송의 우선순위는 이제 동일한 애플리케이션 프로세스 내에서만 존중되며, 시스템의 모든 프로세스 간에는 우선순위가 적용되지 않습니다. 4️⃣ 불필요한 접근성 알림의 사용 중단 Android 16에서는 announceForAccessibility나 TYPE_ANNOUNCEMENT 접근성 이벤트를 사용하는 불필요한 접근성 알림이 더 이상 사용되지 않도록 처리됩니다. 5️⃣ 3버튼 내비게이션에서 예측적 뒤로 가기 지원 Android 16은 3버튼 내비게이션에서 예측적 뒤로 가기 지원을 추가하여, 앱이 예측적 뒤로 가기 기능을 제대로 구현한 경우 이를 활용할 수 있게 됩니다. 💡 정리 이번 Android 16에서도 많은 변경사항이 예정되어 있습니다. 특히 다양한 디바이스에 대응하기 위한 레이아웃 관련 개선과 제스처 내비게이션 기능이 돋보이는 업데이트였습니다. onBackPressed 이슈와 screenOrientation 관련 사항은 레거시 코드가 많은 앱들에서 특히 신경 써야 할 부분으로 보입니다. 추가적인 업데이트가 있으면 공유드리겠습니다! 🙂 💡 + Android 16 테스트 방법 compileSdkPreview, targetSdkPreview를 "Baklava"로 설정해주시면 compileSdk와 targetSdk 설정이 덮혀져서 테스트할 수 있습니다. Android 16 에뮬레이터를 설치해서 실행해주세요! android { compileSdkPreview = "Baklava" defaultConfig { targetSdkPreview = "Baklava" } } 현재 아래 기기에서 beta 테스트가 가능합니다 (https://www.google.com/android/beta 에서 신청해주세요) Pixel 6 and 6 Pro Pixel 6a Pixel 7 and 7 Pro Pixel 7a Pixel Fold Pixel Tablet Pixel 8 and 8 Pro Pixel 8a Pixel 9, 9 Pro, 9 Pro XL, and 9 Pro Fold 💡 참고 https://developer.android.com/about/versions/16/summary