Platform Android 16 menyertakan perubahan perilaku yang mungkin memengaruhi aplikasi Anda.
Perubahan perilaku berikut ini berlaku untuk semua aplikasi saat dijalankan di Android 16,
terlepas dari targetSdkVersion. Sebaiknya uji aplikasi Anda, lalu modifikasi sesuai kebutuhan untuk mendukung perubahan ini, jika memungkinkan.
Selain itu, pastikan Anda meninjau daftar perubahan perilaku yang hanya memengaruhi aplikasi yang menargetkan Android 16.
Fungsi inti
Android 16 (level API 36) mencakup perubahan berikut yang mengubah atau memperluas berbagai kemampuan inti sistem Android.
Pengoptimalan kuota 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
Alasan penghentian tugas kosong yang ditinggalkan
如果与作业关联的 JobParameters 对象已被垃圾回收,但尚未调用 JobService#jobFinished(JobParameters,
boolean) 来指示作业已完成,则会发生作业被废弃的情况。这表示作业可能会在应用不知情的情况下运行和重新调度。
依赖于 JobScheduler 的应用不会维护对 JobParameters 对象的强引用,并且超时现在将获得新的作业停止原因 STOP_REASON_TIMEOUT_ABANDONED,而不是 STOP_REASON_TIMEOUT。
如果新的作业被废弃停止原因频繁出现,系统会采取缓解措施来降低作业频率。
应用应使用新的停止原因来检测和减少被废弃的作业。
如果您使用的是 WorkManager、AsyncTask 或 DownloadManager,则不会受到影响,因为这些 API 会代表您的应用管理作业生命周期。
Menghentikan penggunaan JobInfo#setImportantWhileForeground sepenuhnya
JobInfo.Builder#setImportantWhileForeground(boolean) 方法用于在调度应用位于前台或暂时豁免于后台限制时指示作业的优先级。
自 Android 12(API 级别 31)起,此方法已废弃。从 Android 16 开始,它不再有效,系统会忽略调用此方法。
此功能移除也适用于 JobInfo#isImportantWhileForeground()。从 Android 16 开始,如果调用该方法,该方法会返回 false。
Cakupan prioritas siaran berurutan tidak lagi global
Android 应用可以为广播接收器定义优先级,以控制接收器接收和处理广播的顺序。对于清单声明的接收器,应用可以使用 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 设置为广播优先级。
如果您的应用执行以下任一操作,可能会受到影响:
- 您的应用声明了具有相同广播 intent 的多个进程,并且希望根据优先级以特定顺序接收这些 intent。
- 您的应用进程与其他进程交互,并期望以特定顺序接收广播 intent。
如果进程需要相互协调,则应使用其他协调渠道进行通信。
Perubahan internal ART
Android 16 包含 Android 运行时 (ART) 的最新更新,这些更新可提升 Android 运行时 (ART) 的性能,并支持更多 Java 功能。通过 Google Play 系统更新,搭载 Android 12(API 级别 31)及更高版本的 10 亿多部设备也将受益于这些改进。
发布这些变更后,依赖于 ART 内部结构的库和应用代码在搭载 Android 16 的设备以及通过 Google Play 系统更新来更新 ART 模块的较低 Android 版本上可能无法正常运行。
依赖于内部结构(例如非 SDK 接口)始终会导致兼容性问题,但避免依赖于利用内部 ART 结构的代码(或包含代码的库)尤为重要,因为 ART 更改与设备所运行的平台版本无关,并且会通过 Google Play 系统更新推送到超过 10 亿部设备。
所有开发者都应在 Android 16 上对其应用进行全面测试,以检查其应用是否受到影响。此外,请查看已知问题,了解您的应用是否依赖于我们发现的任何依赖于内部 ART 结构的库。如果您的应用代码或库依赖项受到影响,请尽可能寻找公共 API 替代方案,并在问题跟踪器中创建功能请求,为新用例请求公共 API。
Mode kompatibilitas ukuran halaman 16 KB
Android 15 memperkenalkan dukungan untuk halaman memori 16 KB guna mengoptimalkan performa platform. Android 16 menambahkan mode kompatibilitas, yang memungkinkan beberapa aplikasi yang di-build untuk halaman memori 4 KB berjalan di perangkat yang dikonfigurasi untuk halaman memori 16 KB.
Saat aplikasi Anda berjalan di perangkat dengan Android 16 atau yang lebih tinggi, jika Android
mendeteksi bahwa aplikasi Anda memiliki halaman memori yang diselaraskan 4 KB, aplikasi akan otomatis menggunakan
mode kompatibilitas dan menampilkan dialog notifikasi kepada pengguna. Menetapkan
properti android:pageSizeCompat di AndroidManifest.xml untuk mengaktifkan
mode kompatibilitas mundur akan mencegah tampilan dialog saat
aplikasi diluncurkan. Untuk menggunakan properti android:pageSizeCompat, kompilasi aplikasi Anda
menggunakan Android 16 SDK.
Untuk performa, keandalan, dan stabilitas terbaik, aplikasi Anda harus tetap selaras dengan 16 KB. Lihat postingan blog terbaru kami tentang mengupdate aplikasi Anda untuk mendukung halaman memori 16 KB guna mengetahui detail selengkapnya.
Pengalaman pengguna dan UI sistem
Android 16 (level API 36) menyertakan perubahan berikut yang dimaksudkan untuk menciptakan pengalaman pengguna yang lebih konsisten dan intuitif.
Menghentikan penggunaan pengumuman aksesibilitas yang mengganggu
Android 16 废弃了无障碍功能通告,其特征是使用 announceForAccessibility 或调度 TYPE_ANNOUNCEMENT 无障碍功能事件。这可能会给 TalkBack 和 Android 屏幕阅读器用户带来不一致的用户体验,而替代方案可以更好地满足各种 Android 辅助技术的用户需求。
替代方案示例:
- 对于窗口更改等重大界面更改,请使用
Activity.setTitle(CharSequence)和setAccessibilityPaneTitle(java.lang.CharSequence)。在 Compose 中,使用Modifier.semantics { paneTitle = "paneTitle" } - 如需向用户告知关键界面的更改,请使用
setAccessibilityLiveRegion(int)。在 Compose 中,请使用Modifier.semantics { liveRegion = LiveRegionMode.[Polite|Assertive]}。应谨慎使用这些事件,因为它们可能会在每次更新视图时生成通知。 - 如需向用户发送错误通知,请发送类型为
AccessibilityEvent#CONTENT_CHANGE_TYPE_ERROR的AccessibilityEvent并设置AccessibilityNodeInfo#setError(CharSequence),或使用TextView#setError(CharSequence)。
已废弃的 announceForAccessibility API 的参考文档中包含有关建议替代方案的更多详细信息。
Dukungan untuk navigasi 3 tombol
Android 16 为已正确迁移到预测性返回的应用的三按钮导航栏引入了预测性返回支持。长按返回按钮会启动预测性返回动画,让您预览返回滑动手势会打开的界面。
此行为适用于系统中支持预测性返回动画的所有区域,包括系统动画(返回主屏幕、跨任务和跨 activity)。
Ikon aplikasi bertema otomatis
从 Android 16 QPR 2 开始,Android 会自动将主题应用于应用图标,以打造一致的主屏幕体验。如果应用未提供自己的带主题的应用图标,就会发生这种情况。应用可以通过在自适应图标中添加单色图层来控制主题化应用图标的设计,并在 Android Studio 中预览应用图标的外观。
Faktor bentuk perangkat
Android 16 (level API 36) menyertakan perubahan berikut untuk aplikasi saat diproyeksikan ke layar oleh pemilik perangkat virtual.
Penggantian pemilik perangkat virtual
虚拟设备所有者是创建和管理虚拟设备的受信任应用或特权应用。虚拟设备所有者在虚拟设备上运行应用,然后将应用投影到远程设备的显示屏上,例如个人电脑、虚拟现实设备或车载信息娱乐系统。虚拟设备所有者位于本地设备上,例如手机。
按应用替换项
在搭载 Android 16(API 级别 36)的设备上,虚拟设备所有者可以替换其管理的特定虚拟设备上的应用设置。例如,为了改进应用布局,虚拟设备所有者在将应用投影到外部显示屏上时,可以忽略屏幕方向、宽高比和可调整大小性限制。
常见的重大更改
Android 16 的行为可能会影响应用在汽车显示屏或 Chromebook 等大屏幕设备上的界面,尤其是那些专为竖屏小显示屏设计的布局。如需了解如何让应用适应所有设备类型,请参阅自适应布局简介。
参考文档
Keamanan
Android 16 (level API 36) menyertakan perubahan yang meningkatkan keamanan sistem untuk membantu melindungi aplikasi dan pengguna dari aplikasi berbahaya.
Peningkatan keamanan terhadap serangan pengalihan Intent
Android 16 memberikan keamanan default terhadap serangan pengalihan Intent umum, dengan kompatibilitas minimum dan perubahan developer yang diperlukan.
Kami memperkenalkan solusi penguatan keamanan secara default untuk Intenteksploitasi pengalihan. Pada umumnya, aplikasi yang menggunakan intent biasanya tidak akan mengalami masalah kompatibilitas; kami telah mengumpulkan metrik selama proses pengembangan untuk memantau aplikasi mana yang mungkin mengalami kerusakan.
Pengalihan intent di Android terjadi saat penyerang dapat mengontrol sebagian atau seluruh konten intent yang digunakan untuk meluncurkan komponen baru dalam konteks aplikasi yang rentan, sementara aplikasi korban meluncurkan intent sub-level yang tidak tepercaya di kolom tambahan Intent ("level teratas"). Hal ini dapat menyebabkan aplikasi penyerang meluncurkan komponen pribadi dalam konteks aplikasi korban, memicu tindakan istimewa, atau mendapatkan akses URI ke data sensitif, yang berpotensi menyebabkan pencurian data dan eksekusi kode arbitrer.
Memilih tidak ikut penanganan pengalihan Intent
Android 16 memperkenalkan API baru yang memungkinkan aplikasi memilih untuk tidak menggunakan perlindungan keamanan peluncuran. Hal ini mungkin diperlukan dalam kasus tertentu saat perilaku keamanan default mengganggu kasus penggunaan aplikasi yang sah.
Untuk aplikasi yang dikompilasi terhadap SDK Android 16 (level API 36) atau yang lebih tinggi
Anda dapat langsung menggunakan metode removeLaunchSecurityProtection() pada objek Intent.
val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent")
iSublevel?.removeLaunchSecurityProtection() // Opt out from hardening
iSublevel?.let { startActivity(it) }
Untuk aplikasi yang dikompilasi terhadap Android 15 (level API 35) atau yang lebih rendah
Meskipun tidak direkomendasikan, Anda dapat menggunakan refleksi untuk mengakses metode
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) }
Aplikasi pendamping tidak lagi diberi tahu tentang waktu tunggu penemuan
Android 16 在配套设备配对流程期间引入了一种新行为,以防恶意应用侵犯用户的位置信息隐私。在 Android 16 上运行的所有配套应用都不再直接通过 RESULT_DISCOVERY_TIMEOUT 收到发现超时通知。而是通过可视对话框通知用户超时事件。当用户关闭对话框时,系统会通过 RESULT_USER_REJECTED 提醒应用关联失败。
搜索时长也从原来的 20 秒延长到了 30 秒,并且用户可以在搜索期间的任何时间停止设备发现。如果在开始搜索的前 20 秒内发现了至少 1 部设备,CDM 会停止搜索其他设备。
Konektivitas
Android 16 (level API 36) menyertakan perubahan berikut dalam stack Bluetooth untuk meningkatkan konektivitas dengan perangkat periferal.
Peningkatan penanganan kehilangan ikatan
从 Android 16 开始,蓝牙堆栈已更新,以便在检测到远程配对丢失时提高安全性和用户体验。以前,系统会自动解除配对并启动新的配对流程,这可能会导致意外重新配对。在许多情况下,我们发现应用未以一致的方式处理债券损失事件。
为了统一体验,Android 16 改进了系统的绑定丢失处理。如果之前配对的蓝牙设备在重新连接时无法进行身份验证,系统会断开关联,保留本地配对信息,并显示系统对话框,告知用户配对已断开并指示他们重新配对。