Android 16 플랫폼에는 앱에 영향을 줄 수 있는 동작 변경사항이 있습니다. targetSdkVersion
과 관계없이 Android 16에서 실행되는 모든 앱에 적용되는 동작 변경사항은 다음과 같습니다. 이러한 변경사항을 적절히 지원해야 하는 경우 앱을 테스트한 후 필요에 따라 수정해야 합니다.
또한 Android 16을 타겟팅하는 앱에만 영향을 주는 동작 변경사항 목록을 검토해야 합니다.
핵심 기능
Android 16 (API 수준 36)에는 Android 시스템의 다양한 핵심 기능을 수정하거나 확장하는 다음과 같은 변경사항이 포함되어 있습니다.
JobScheduler 할당량 최적화
从 Android 16 开始,我们将根据以下因素调整常规作业和加急作业执行运行时配额:
- 应用位于哪个应用待机分桶:在 Android 16 中,系统将开始使用充足的运行时配额来强制执行处于活动状态的待机分桶。
- 如果作业在应用处于顶部状态时开始执行:在 Android 16 中,如果作业在应用对用户可见时启动,并在应用变为不可见后继续,则将遵循作业运行时配额。
- 如果作业在运行前台服务时执行:在 Android 16 中,与前台服务同时执行的作业将遵循作业运行时配额。如果您要使用作业进行用户发起的数据传输,请考虑改用用户发起的数据传输作业。
此更改会影响使用 WorkManager、JobScheduler 和 DownloadManager 调度的任务。如需调试作业停止的原因,我们建议您通过调用 WorkInfo.getStopReason()
(对于 JobScheduler 作业,请调用 JobParameters.getStopReason()
)记录作业停止的原因。
如需了解应用的状态如何影响其可使用的资源,请参阅功耗管理资源限制。如需详细了解有关延长电池续航时间的最佳实践,请参阅有关优化任务调度 API 的电池用量的指南。
我们还建议您利用 Android 16 中引入的新 JobScheduler#getPendingJobReasonsHistory
API 来了解作业未执行的原因。
测试
如需测试应用的行为,您可以启用替换某些作业配额优化,前提是应用在 Android 16 设备上运行。
如需停用强制执行“顶部状态将遵守作业运行时配额”政策,请运行以下 adb
命令:
adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_TOP_STARTED_JOBS APP_PACKAGE_NAME
如需停用强制执行“与前台服务同时执行的作业将遵守作业运行时配额”政策,请运行以下 adb
命令:
adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_FGS_JOBS APP_PACKAGE_NAME
如需测试特定的应用待机分桶行为,您可以使用以下 adb
命令设置应用的应用待机分桶:
adb shell am set-standby-bucket APP_PACKAGE_NAME active|working_set|frequent|rare|restricted
如需了解应用所在的应用待机分桶,您可以使用以下 adb
命令获取应用的应用待机分桶:
adb shell am get-standby-bucket APP_PACKAGE_NAME
중단된 빈 작업 중지 사유
포기된 작업은 작업과 연결된 JobParameters
객체가 가비지 컬렉션되었지만 JobService#jobFinished(JobParameters,
boolean)
가 호출되어 작업 완료를 알리지 않은 경우에 발생합니다. 이는 앱의 인식 없이 작업이 실행되고 재예약되고 있음을 나타냅니다.
JobScheduler를 사용하는 앱은 JobParameters
객체에 대한 강력한 참조를 유지하지 않으며 이제 제한 시간에 STOP_REASON_TIMEOUT
대신 새 작업 중지 이유 STOP_REASON_TIMEOUT_ABANDONED
가 부여됩니다.
새 중단된 중지 이유가 자주 발생하면 시스템은 작업 빈도를 줄이기 위한 완화 조치를 취합니다.
앱은 새 중지 이유를 사용하여 중단된 작업을 감지하고 줄여야 합니다.
WorkManager, AsyncTask 또는 DownloadManager를 사용하는 경우 이러한 API가 앱을 대신하여 작업 수명 주기를 관리하므로 영향을 받지 않습니다.
JobInfo#setImportantWhileForeground를 완전히 지원 중단함
JobInfo.Builder#setImportantWhileForeground(boolean)
메서드는 예약 앱이 포그라운드에 있거나 일시적으로 백그라운드 제한사항에서 제외된 경우 작업의 중요도를 나타냅니다.
이 메서드는 Android 12 (API 수준 31)부터 지원 중단되었습니다. Android 16부터는 더 이상 효과적으로 작동하지 않으며 이 메서드를 호출해도 무시됩니다.
이 기능 삭제는 JobInfo#isImportantWhileForeground()
에도 적용됩니다. Android 16부터 메서드가 호출되면 메서드는 false
를 반환합니다.
순서가 지정된 브로드캐스트 우선순위 범위가 더 이상 전역이 아님
Android 앱은 broadcast receiver의 우선순위를 정의하여 수신기가 브로드캐스트를 수신하고 처리하는 순서를 제어할 수 있습니다. 매니페스트 선언 수신기의 경우 앱은 android:priority
속성을 사용하여 우선순위를 정의할 수 있고 컨텍스트 등록 수신기의 경우 앱은 IntentFilter#setPriority()
API를 사용하여 우선순위를 정의할 수 있습니다. 브로드캐스트가 전송되면 시스템은 우선순위 순으로(최상위부터 최하위 순으로) 수신기에 브로드캐스트를 전달합니다.
Android 16에서는 여러 프로세스에서 android:priority
속성 또는 IntentFilter#setPriority()
를 사용하는 브로드캐스트 전송 순서가 보장되지 않습니다. 브로드캐스트 우선순위는 모든 프로세스 전반이 아닌 동일한 애플리케이션 프로세스 내에서만 적용됩니다.
또한 브로드캐스트 우선순위는 (SYSTEM_LOW_PRIORITY
+ 1,
SYSTEM_HIGH_PRIORITY
- 1) 범위로 자동으로 제한됩니다. 시스템 구성요소만 SYSTEM_LOW_PRIORITY
, SYSTEM_HIGH_PRIORITY
를 브로드캐스트 우선순위로 설정할 수 있습니다.
앱이 다음 중 하나를 실행하는 경우 영향을 받을 수 있습니다.
- 애플리케이션이 동일한 브로드캐스트 인텐트로 여러 프로세스를 선언했으며 우선순위에 따라 이러한 인텐트를 특정 순서로 수신할 것으로 예상합니다.
- 애플리케이션 프로세스는 다른 프로세스와 상호작용하며 특정 순서로 브로드캐스트 인텐트를 수신하는 것에 관한 기대치를 갖습니다.
프로세스가 서로 조정해야 하는 경우 다른 조정 채널을 사용하여 통신해야 합니다.
ART 내부 변경사항
Android 16에는 Android 런타임 (ART)의 성능을 개선하고 추가 Java 기능을 지원하는 Android 런타임 (ART)의 최신 업데이트가 포함되어 있습니다. Google Play 시스템 업데이트를 통해 Android 12 (API 수준 31) 및 이후 버전을 실행하는 10억 대 이상의 기기에서도 이러한 개선사항을 사용할 수 있습니다.
이러한 변경사항이 출시되면 ART의 내부 구조를 사용하는 라이브러리와 앱 코드가 Android 16을 실행하는 기기와 Google Play 시스템 업데이트를 통해 ART 모듈을 업데이트하는 이전 Android 버전에서 제대로 작동하지 않을 수 있습니다.
내부 구조 (예: SDK 이외의 인터페이스)를 사용하면 항상 호환성 문제가 발생할 수 있지만, 내부 ART 구조를 활용하는 코드 (또는 코드가 포함된 라이브러리)를 사용하지 않는 것이 특히 중요합니다. ART 변경사항은 기기가 실행 중인 플랫폼 버전과 연결되지 않으며 Google Play 시스템 업데이트를 통해 10억 대 이상의 기기에 전송되기 때문입니다.
모든 개발자는 Android 16에서 앱을 철저히 테스트하여 앱이 영향을 받는지 확인해야 합니다. 또한 알려진 문제에서 앱이 내부 ART 구조를 사용하는 것으로 확인된 라이브러리에 종속되어 있는지 확인하세요. 영향을 받는 앱 코드 또는 라이브러리 종속 항목이 있는 경우 가능하면 공개 API 대안을 찾고 Issue Tracker에서 기능 요청을 생성하여 새로운 사용 사례에 사용할 공개 API를 요청하세요.
16KB 페이지 크기 호환성 모드
Android 15에서는 플랫폼의 성능을 최적화하기 위해 16KB 메모리 페이지 지원을 도입했습니다. Android 16에서는 4KB 메모리 페이지용으로 빌드된 일부 앱이 16KB 메모리 페이지용으로 구성된 기기에서 실행될 수 있도록 하는 호환성 모드를 추가합니다.
앱이 Android 16 이상을 실행하는 기기에서 실행 중일 때 Android에서 앱에 4KB 정렬 메모리 페이지가 있음을 감지하면 자동으로 호환성 모드를 사용하고 사용자에게 알림 대화상자를 표시합니다. AndroidManifest.xml
에서 android:pageSizeCompat
속성을 설정하여 이전 버전과의 호환성 모드를 사용 설정하면 앱이 실행될 때 대화상자가 표시되지 않습니다. android:pageSizeCompat
속성을 사용하려면 Android 16 SDK를 사용하여 앱을 컴파일하세요.
최상의 성능, 안정성, 안정성을 위해 앱은 계속 16KB 정렬되어야 합니다. 16KB 메모리 페이지를 지원하도록 앱을 업데이트하는 방법에 관한 최근 블로그 게시물을 참고하세요.

사용자 환경 및 시스템 UI
Android 16 (API 수준 36)에는 더 일관되고 직관적인 사용자 환경을 제공하기 위한 다음과 같은 변경사항이 포함되어 있습니다.
방해가 되는 접근성 안내 지원 중단
Android 16에서는 announceForAccessibility
사용 또는 TYPE_ANNOUNCEMENT
접근성 이벤트 전송으로 특징되는 접근성 공지사항을 지원 중단합니다. 이로 인해 TalkBack 및 Android의 스크린 리더 사용자에게 일관되지 않은 사용자 환경이 발생할 수 있으며, 대안은 다양한 Android의 보조 기술에서 더 광범위한 사용자 요구사항을 충족합니다.
대안의 예:
- 창 변경과 같은 중요한 UI 변경의 경우
Activity.setTitle(CharSequence)
및setAccessibilityPaneTitle(java.lang.CharSequence)
를 사용하세요. Compose에서Modifier.semantics { paneTitle = "paneTitle" }
를 사용합니다. - 중요한 UI 변경사항을 사용자에게 알리려면
setAccessibilityLiveRegion(int)
를 사용하세요. Compose에서는Modifier.semantics { liveRegion = LiveRegionMode.[Polite|Assertive]}
를 사용합니다 . 뷰가 업데이트될 때마다 공지사항이 생성될 수 있으므로 이러한 공지사항은 가급적 사용하지 않는 것이 좋습니다. - 사용자에게 오류를 알리려면
AccessibilityEvent#CONTENT_CHANGE_TYPE_ERROR
유형의AccessibilityEvent
를 전송하고AccessibilityNodeInfo#setError(CharSequence)
를 설정하거나TextView#setError(CharSequence)
를 사용하세요.
지원 중단된 announceForAccessibility
API의 참조 문서에는 추천 대안에 관한 자세한 내용이 포함되어 있습니다.
3버튼 탐색 지원
Android 16 brings predictive back support to the 3-button navigation for apps that have properly migrated to predictive back. Long-pressing the back button initiates a predictive back animation, giving you a preview of where the back swipe takes you.
This behavior applies across all areas of the system that support predictive back animations, including the system animations (back-to-home, cross-task, and cross-activity).
기기 폼 팩터
Android 16 (API 수준 36)에는 가상 기기 소유자가 디스플레이에 프로젝션할 때 앱에 적용되는 다음과 같은 변경사항이 포함됩니다.
가상 기기 소유자 재정의
가상 기기 소유자는 가상 기기를 만들고 관리하는 신뢰할 수 있는 앱 또는 권한이 있는 앱입니다. 가상 기기 소유자는 가상 기기에서 앱을 실행한 후 앱을 개인 컴퓨터, 가상 현실 기기, 자동차 인포테인먼트 시스템과 같은 원격 기기의 디스플레이에 투사합니다. 가상 기기 소유자가 휴대전화와 같은 로컬 기기를 사용하고 있습니다.

앱별 재정의
Android 16 (API 수준 36)을 실행하는 기기에서 가상 기기 소유자는 가상 기기 소유자가 관리하는 일부 가상 기기에서 앱 설정을 재정의할 수 있습니다. 예를 들어 앱 레이아웃을 개선하기 위해 가상 기기 소유자는 앱을 외부 디스플레이에 투사할 때 방향, 가로세로 비율, 크기 조절 가능 여부 제한을 무시할 수 있습니다.
일반적인 브레이킹 체인지
Android 16 동작은 자동차 디스플레이나 Chromebook과 같은 대형 화면 폼 팩터에서 앱의 UI에 영향을 미칠 수 있습니다. 특히 세로 모드 방향의 소형 디스플레이용으로 설계된 레이아웃에 영향을 미칠 수 있습니다. 모든 기기 폼 팩터에 맞게 앱을 조정하는 방법을 알아보려면 적응형 레이아웃 정보를 참고하세요.
참조
보안
Android 16 (API 수준 36)에는 악성 앱으로부터 앱과 사용자를 보호하는 데 도움이 되도록 시스템 보안을 개선하는 변경사항이 포함되어 있습니다.
인텐트 리디렉션 공격에 대한 보안이 강화되었습니다.
Android 16 提供了针对常规 Intent
重定向攻击的默认安全防护,并且所需的兼容性和开发者更改最少。
我们将默认针对 Intent
重定向漏洞引入安全增强解决方案。在大多数情况下,使用 intent 的应用通常不会遇到任何兼容性问题;我们在整个开发过程中收集了指标,以监控哪些应用可能会出现故障。
当攻击者部分或完全控制用于在存在漏洞的应用上下文中启动新组件的 intent 内容时,就会出现 Android 中的 intent 重定向,而受害应用会在 intent(“顶级”intent)的 extras 字段中启动不可信的子级 intent。这可能会导致攻击者应用在受害应用上下文中启动私有组件、触发特权操作或获得对敏感数据的 URI 访问权限,从而可能导致数据被盗和任意代码执行。
停用 intent 重定向处理
Android 16 引入了一个新 API,允许应用选择停用启动安全保护。在默认安全行为干扰合法应用用例的特定情况下,这可能很有必要。
对于针对 Android 16(API 级别 36)SDK 或更高版本进行编译的应用
您可以直接对 intent 对象使用 removeLaunchSecurityProtection()
方法。
val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent")
iSublevel?.removeLaunchSecurityProtection() // Opt out from hardening
iSublevel?.let { startActivity(it) }
对于针对 Android 15(API 级别 35)或更低版本进行编译的应用
虽然不建议这样做,但您可以使用反射来访问 removeLaunchSecurityProtection()
方法。
val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent", Intent::class.java)
try {
val removeLaunchSecurityProtection = Intent::class.java.getDeclaredMethod("removeLaunchSecurityProtection")
removeLaunchSecurityProtection.invoke(iSublevel)
} catch (e: Exception) {
// Handle the exception, e.g., log it
} // Opt-out from the security hardening using reflection
iSublevel?.let { startActivity(it) }
호환 앱에 더 이상 검색 시간 초과 알림이 전송되지 않음
Android 16에서는 악성 앱으로부터 사용자의 위치 개인 정보를 보호하기 위해 컴패니언 기기 페어링 흐름 중에 새로운 동작을 도입합니다. Android 16에서 실행되는 모든 호환 앱은 더 이상 RESULT_DISCOVERY_TIMEOUT
를 사용하여 검색 시간 초과에 관해 직접 알림을 받지 않습니다. 대신 사용자에게 시각적 대화상자를 통해 시간 초과 이벤트가 알림으로 전송됩니다. 사용자가 대화상자를 닫으면 앱에 RESULT_USER_REJECTED
와의 연결 실패에 관한 알림이 전송됩니다.
검색 시간도 원래 20초에서 연장되었으며, 검색 중 언제든지 사용자가 기기 검색을 중지할 수 있습니다. 검색을 시작한 후 처음 20초 이내에 기기가 하나 이상 감지되면 CDM은 추가 기기 검색을 중지합니다.
연결
Android 16 (API 수준 36)에는 주변기기와의 연결성을 개선하기 위해 블루투스 스택에 다음과 같은 변경사항이 포함되어 있습니다.
채권 손실 처리 개선
Android 16부터 원격 결합 손실이 감지될 때 보안 및 사용자 환경을 개선하기 위해 블루투스 스택이 업데이트되었습니다. 이전에는 시스템이 자동으로 결합을 삭제하고 새 페어링 프로세스를 시작하여 의도치 않은 재페어링이 발생할 수 있었습니다. 앱이 결합 해제 이벤트를 일관된 방식으로 처리하지 않는 경우가 많았습니다.
환경을 통합하기 위해 Android 16에서는 시스템에 대한 결합 손실 처리를 개선했습니다. 이전에 페어링된 블루투스 기기를 다시 연결할 때 인증할 수 없는 경우 시스템은 링크를 연결 해제하고 로컬 페어링 정보를 유지하며 사용자에게 페어링 손실에 관해 알리고 다시 페어링하도록 안내하는 시스템 대화상자를 표시합니다.