동작 변경사항: 모든 앱

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 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 대신 새 작업 중지 이유 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 apps are allowed to define priorities on broadcast receivers to control the order in which the receivers receive and process the broadcast. For manifest-declared receivers, apps can use the android:priority attribute to define the priority and for context-registered receivers, apps can use the IntentFilter#setPriority() API to define the priority. When a broadcast is sent, the system delivers it to receivers in order of their priority, from highest to lowest.

In Android 16, broadcast delivery order using the android:priority attribute or IntentFilter#setPriority() across different processes will not be guaranteed. Broadcast priorities will only be respected within the same application process rather than across all processes.

Also, broadcast priorities will be automatically confined to the range (SYSTEM_LOW_PRIORITY + 1, SYSTEM_HIGH_PRIORITY - 1). Only system components will be allowed to set SYSTEM_LOW_PRIORITY, SYSTEM_HIGH_PRIORITY as broadcast priority.

Your app might be impacted if it does either of the following:

  1. Your application has declared multiple processes with the same broadcast intent, and has expectations around receiving those intents in a certain order based on the priority.
  2. Your application process interacts with other processes and has expectations around receiving a broadcast intent in a certain order.

If the processes need to coordinate with each other, they should communicate using other coordination channels.

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 deprecates accessibility announcements, characterized by the use of announceForAccessibility or the dispatch of TYPE_ANNOUNCEMENT accessibility events. These can create inconsistent user experiences for users of TalkBack and Android's screen reader, and alternatives better serve a broader range of user needs across a variety of Android's assistive technologies.

Examples of alternatives:

The reference documentation for the deprecated announceForAccessibility API includes more details about suggested alternatives.

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 QPR 2부터 Android는 앱 아이콘에 테마를 자동으로 적용하여 일관된 홈 화면 환경을 만듭니다. 이는 앱에서 자체 테마 앱 아이콘을 제공하지 않는 경우 발생합니다. 앱은 적응형 아이콘 내에 단색 레이어를 포함하고 Android 스튜디오에서 앱 아이콘이 어떻게 표시되는지 미리 봄으로써 테마가 적용된 앱 아이콘의 디자인을 제어할 수 있습니다.

기기 폼 팩터

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

가상 기기 소유자 재정의

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

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

앱별 재정의

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

일반적인 주요 변경사항

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

참조

호환 앱 스트리밍

보안

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

인텐트 리디렉션 공격에 대한 보안 개선

Android 16은 일반적인 Intent 리디렉션 공격에 대한 기본 보안을 제공하며, 최소한의 호환성과 개발자 변경사항이 필요합니다.

Intent 리디렉션 악용에 기본적으로 보안 강화 솔루션을 도입합니다. 대부분의 경우 인텐트를 사용하는 앱에는 호환성 문제가 발생하지 않습니다. Google에서는 개발 프로세스 전반에 걸쳐 측정항목을 수집하여 중단이 발생할 수 있는 앱을 모니터링했습니다.

Android의 인텐트 리디렉션은 공격자가 취약한 앱의 컨텍스트에서 새 구성요소를 실행하는 데 사용되는 인텐트의 콘텐츠를 부분적으로 또는 완전히 제어할 수 있는 반면 피해자 앱은 ("최상위") 인텐트의 추가 필드에서 신뢰할 수 없는 하위 수준 인텐트를 실행할 때 발생합니다. 이로 인해 공격자 앱이 피해자 앱의 컨텍스트에서 비공개 구성요소를 실행하거나, 권한이 있는 작업을 트리거하거나, 민감한 데이터에 대한 URI 액세스 권한을 획득하여 데이터 도용 및 임의의 코드 실행으로 이어질 수 있습니다.

인텐트 리디렉션 처리 선택 해제

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