동작 변경사항: 모든 앱

Android 16 플랫폼에는 앱에 영향을 줄 수 있는 동작 변경사항이 있습니다. targetSdkVersion과 관계없이 Android 16에서 실행되는 모든 앱에 적용되는 동작 변경사항은 다음과 같습니다. 이러한 변경사항을 적절히 지원해야 하는 경우 앱을 테스트한 후 필요에 따라 수정해야 합니다.

또한 Android 16을 타겟팅하는 앱에만 영향을 주는 동작 변경사항 목록을 검토해야 합니다.

핵심 기능

Android 16 (API 수준 36)에는 Android 시스템의 다양한 핵심 기능을 수정하거나 확장하는 다음과 같은 변경사항이 포함되어 있습니다.

JobScheduler 할당량 최적화

Starting in Android 16, we're adjusting regular and expedited job execution runtime quota based on the following factors:

  • Which app standby bucket the application is in: in Android 16, active standby buckets will start being enforced by a generous runtime quota.
  • If the job starts execution while the app is in a top state: in Android 16, Jobs started while the app is visible to the user and continues after the app becomes invisible, will adhere to the job runtime quota.
  • If the job is executing while running a Foreground Service: in Android 16, jobs that are executing while concurrently with a foreground service will adhere to the job runtime quota. If you're leveraging jobs for user initiated data transfer, consider using user initiated data transfer jobs instead.

This change impacts tasks scheduled using WorkManager, JobScheduler, and DownloadManager. To debug why a job was stopped, we recommend logging why your job was stopped by calling WorkInfo.getStopReason() (for JobScheduler jobs, call JobParameters.getStopReason()).

For information about how your app's state affects the resources it can use, see Power management resource limits. For more information on battery-optimal best practices, refer to guidance on optimize battery use for task scheduling APIs.

We also recommend leveraging the new JobScheduler#getPendingJobReasonsHistory API introduced in Android 16 to understand why a job has not executed.

Testing

To test your app's behavior, you can enable override of certain job quota optimizations as long as the app is running on an Android 16 device.

To disable enforcement of "top state will adhere to job runtime quota", run the following adb command:

adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_TOP_STARTED_JOBS APP_PACKAGE_NAME

To disable enforcement of "jobs that are executing while concurrently with a foreground service will adhere to the job runtime quota", run the following adb command:

adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_FGS_JOBS APP_PACKAGE_NAME

To test certain app standby bucket behavior, you can set the app standby bucket of your app using the following adb command:

adb shell am set-standby-bucket APP_PACKAGE_NAME active|working_set|frequent|rare|restricted

To understand the app standby bucket your app is in, you can get the app standby bucket of your app using the following adb command:

adb shell am get-standby-bucket APP_PACKAGE_NAME

중단된 빈 작업 중지 사유

如果与作业关联的 JobParameters 对象已被垃圾回收,但尚未调用 JobService#jobFinished(JobParameters, boolean) 来指示作业已完成,则会发生作业被废弃的情况。这表示作业可能会在应用不知情的情况下运行和重新调度。

依赖于 JobScheduler 的应用不会维护对 JobParameters 对象的强引用,并且超时现在将获得新的作业停止原因 STOP_REASON_TIMEOUT_ABANDONED,而不是 STOP_REASON_TIMEOUT

如果新的作业被废弃停止原因频繁出现,系统会采取缓解措施来降低作业频率。

应用应使用新的停止原因来检测和减少被废弃的作业。

如果您使用的是 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를 브로드캐스트 우선순위로 설정할 수 있습니다.

앱이 다음 중 하나를 실행하는 경우 영향을 받을 수 있습니다.

  1. 애플리케이션이 동일한 브로드캐스트 인텐트로 여러 프로세스를 선언했으며 우선순위에 따라 이러한 인텐트를 특정 순서로 수신할 것으로 예상합니다.
  2. 애플리케이션 프로세스는 다른 프로세스와 상호작용하며 특정 순서로 브로드캐스트 인텐트를 수신하는 것에 관한 기대치를 갖습니다.

프로세스가 서로 조정해야 하는 경우 다른 조정 채널을 사용하여 통신해야 합니다.

ART 내부 변경사항

Android 16 includes the latest updates to the Android Runtime (ART) that improve the Android Runtime's (ART's) performance and provide support for additional Java features. Through Google Play System updates, these improvements are also available to over a billion devices running Android 12 (API level 31) and higher.

As these changes are released, libraries and app code that rely on internal structures of ART might not work correctly on devices running Android 16, along with earlier Android versions that update the ART module through Google Play system updates.

Relying on internal structures (such as non-SDK interfaces) can always lead to compatibility problems, but it's particularly important to avoid relying on code (or libraries containing code) that leverages internal ART structures, since ART changes aren't tied to the platform version the device is running on and they go out to over a billion devices through Google Play system updates.

All developers should check whether their app is impacted by testing their apps thoroughly on Android 16. In addition, check the known issues to see if your app depends on any libraries that we've identified that rely on internal ART structures. If you do have app code or library dependencies that are affected, seek public API alternatives whenever possible and request public APIs for new use cases by creating a feature request in our issue tracker.

16KB 페이지 크기 호환성 모드

Android 15 introduced support for 16 KB memory pages to optimize performance of the platform. Android 16 adds a compatibility mode, allowing some apps built for 4 KB memory pages to run on a device configured for 16 KB memory pages.

When your app is running on a device with Android 16 or higher, if Android detects that your app has 4 KB aligned memory pages, it automatically uses compatibility mode and display a notification dialog to the user. Setting the android:pageSizeCompat property in the AndroidManifest.xml to enable the backwards compatibility mode will prevent the display of the dialog when your app launches. To use the android:pageSizeCompat property, compile your app using the Android 16 SDK.

For best performance, reliability, and stability, your app should still be 16 KB aligned. Check out our recent blog post on updating your apps to support 16 KB memory pages for more details.

The compatibility mode dialog that displays when the system detects that a 4 KB-aligned app could run more optimally if 16 KB aligned.

사용자 환경 및 시스템 UI

Android 16 (API 수준 36)에는 더 일관되고 직관적인 사용자 환경을 제공하기 위한 다음과 같은 변경사항이 포함되어 있습니다.

방해가 되는 접근성 안내 지원 중단

Android 16에서는 announceForAccessibility 사용 또는 TYPE_ANNOUNCEMENT 접근성 이벤트 전송으로 특징되는 접근성 공지사항을 지원 중단합니다. 이로 인해 TalkBack 및 Android의 스크린 리더 사용자에게 일관되지 않은 사용자 환경이 발생할 수 있으며, 대안은 다양한 Android의 보조 기술에서 더 광범위한 사용자 요구사항을 충족합니다.

대안의 예:

지원 중단된 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).

The predictive back animations in 3-button navigation mode.

기기 폼 팩터

Android 16 (API 수준 36)에는 가상 기기 소유자가 디스플레이에 프로젝션할 때 앱에 적용되는 다음과 같은 변경사항이 포함됩니다.

가상 기기 소유자 재정의

가상 기기 소유자는 가상 기기를 만들고 관리하는 신뢰할 수 있는 앱 또는 권한이 있는 앱입니다. 가상 기기 소유자는 가상 기기에서 앱을 실행한 후 앱을 개인 컴퓨터, 가상 현실 기기, 자동차 인포테인먼트 시스템과 같은 원격 기기의 디스플레이에 투사합니다. 가상 기기 소유자가 휴대전화와 같은 로컬 기기를 사용하고 있습니다.

휴대전화의 가상 기기 소유자가 앱을 원격 디스플레이에 투사하는 가상 기기를 만듭니다.

앱별 재정의

Android 16 (API 수준 36)을 실행하는 기기에서 가상 기기 소유자는 가상 기기 소유자가 관리하는 일부 가상 기기에서 앱 설정을 재정의할 수 있습니다. 예를 들어 앱 레이아웃을 개선하기 위해 가상 기기 소유자는 앱을 외부 디스플레이에 투사할 때 방향, 가로세로 비율, 크기 조절 가능 여부 제한을 무시할 수 있습니다.

일반적인 브레이킹 체인지

Android 16 동작은 자동차 디스플레이나 Chromebook과 같은 대형 화면 폼 팩터에서 앱의 UI에 영향을 미칠 수 있습니다. 특히 세로 모드 방향의 소형 디스플레이용으로 설계된 레이아웃에 영향을 미칠 수 있습니다. 모든 기기 폼 팩터에 맞게 앱을 조정하는 방법을 알아보려면 적응형 레이아웃 정보를 참고하세요.

참조

호환 앱 스트리밍

보안

Android 16 (API 수준 36)에는 악성 앱으로부터 앱과 사용자를 보호하는 데 도움이 되도록 시스템 보안을 개선하는 변경사항이 포함되어 있습니다.

인텐트 리디렉션 공격에 대한 보안이 강화되었습니다.

Android 16 provides default security against general Intent redirection attacks, with minimum compatibility and developer changes required.

We are introducing by-default security hardening solutions to Intent redirection exploits. In most cases, apps that use intents normally won't experience any compatibility issues; we've gathered metrics throughout our development process to monitor which apps might experience breakages.

Intent redirection in Android occurs when an attacker can partly or fully control the contents of an intent used to launch a new component in the context of a vulnerable app, while the victim app launches an untrusted sub-level intent in an extras field of an ("top-level") Intent. This can lead to the attacker app launching private components in the context of the victim app, triggering privileged actions, or gaining URI access to sensitive data, potentially leading to data theft and arbitrary code execution.

Opt out of Intent redirection handling

Android 16 introduces a new API that allows apps to opt out of launch security protections. This might be necessary in specific cases where the default security behavior interferes with legitimate app use cases.

For applications compiling against Android 16 (API level 36) SDK or higher

You can directly use the removeLaunchSecurityProtection() method on the Intent object.

val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent")
iSublevel?.removeLaunchSecurityProtection() // Opt out from hardening
iSublevel?.let { startActivity(it) }
For applications compiling against Android 15 (API level 35) or lower

While not recommended, you can use reflection to access the removeLaunchSecurityProtection() method.

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 秒延长到了 30 秒,并且用户可以在搜索期间的任何时间停止设备发现。如果在开始搜索的前 20 秒内发现了至少 1 部设备,CDM 会停止搜索其他设备。

연결

Android 16 (API 수준 36)에는 주변기기와의 연결성을 개선하기 위해 블루투스 스택에 다음과 같은 변경사항이 포함되어 있습니다.

채권 손실 처리 개선

Android 16부터 원격 결합 손실이 감지될 때 보안 및 사용자 환경을 개선하기 위해 블루투스 스택이 업데이트되었습니다. 이전에는 시스템이 자동으로 결합을 삭제하고 새 페어링 프로세스를 시작하여 의도치 않은 재페어링이 발생할 수 있었습니다. 앱이 결합 해제 이벤트를 일관된 방식으로 처리하지 않는 경우가 많았습니다.

환경을 통합하기 위해 Android 16에서는 시스템에 대한 결합 손실 처리를 개선했습니다. 이전에 페어링된 블루투스 기기를 다시 연결할 때 인증할 수 없는 경우 시스템은 링크를 연결 해제하고 로컬 페어링 정보를 유지하며 사용자에게 페어링 손실에 관해 알리고 다시 페어링하도록 안내하는 시스템 대화상자를 표시합니다.