Perubahan perilaku: semua aplikasi

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

Mulai Android 16, kami menyesuaikan kuota runtime eksekusi tugas reguler dan dipercepat berdasarkan faktor berikut:

  • Bucket standby aplikasi yang digunakan aplikasi: di Android 16, bucket standby aktif akan mulai diterapkan oleh kuota runtime yang besar.
  • Jika tugas memulai eksekusi saat aplikasi dalam status teratas: di Android 16, Tugas yang dimulai saat aplikasi terlihat oleh pengguna dan berlanjut setelah aplikasi menjadi tidak terlihat, akan mematuhi kuota runtime tugas.
  • Jika tugas dieksekusi saat menjalankan Layanan Latar Depan: di Android 16, tugas yang dieksekusi secara serentak dengan layanan latar depan akan mematuhi kuota runtime tugas. Jika Anda memanfaatkan tugas untuk transfer data yang dimulai pengguna, sebaiknya gunakan tugas transfer data yang dimulai pengguna.

Perubahan ini memengaruhi tugas yang dijadwalkan menggunakan WorkManager, JobScheduler, dan DownloadManager. Untuk men-debug alasan tugas dihentikan, sebaiknya catat alasan tugas Anda dihentikan dengan memanggil WorkInfo.getStopReason() (untuk tugas JobScheduler, panggil JobParameters.getStopReason()).

Untuk mengetahui informasi tentang pengaruh status aplikasi terhadap resource yang dapat digunakan, lihat Batas resource pengelolaan daya. Untuk informasi selengkapnya tentang praktik terbaik yang optimal untuk baterai, lihat panduan tentang mengoptimalkan penggunaan baterai untuk API penjadwalan tugas.

Sebaiknya manfaatkan juga JobScheduler#getPendingJobReasonsHistory API baru yang diperkenalkan di Android 16 untuk memahami alasan tugas belum dieksekusi.

Pengujian

Untuk menguji perilaku aplikasi, Anda dapat mengaktifkan penggantian pengoptimalan kuota tugas tertentu selama aplikasi berjalan di perangkat Android 16.

Untuk menonaktifkan penerapan "status teratas akan mematuhi kuota runtime tugas", jalankan perintah adb berikut:

adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_TOP_STARTED_JOBS APP_PACKAGE_NAME

Untuk menonaktifkan penerapan "tugas yang dieksekusi secara serentak dengan layanan latar depan akan mematuhi kuota runtime tugas", jalankan perintah adb berikut:

adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_FGS_JOBS APP_PACKAGE_NAME

Untuk menguji perilaku bucket standby aplikasi tertentu, Anda dapat menetapkan bucket standby aplikasi aplikasi menggunakan perintah adb berikut:

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

Untuk memahami bucket standby aplikasi yang berisi aplikasi Anda, Anda bisa mendapatkan bucket standby aplikasi menggunakan perintah adb berikut:

adb shell am get-standby-bucket APP_PACKAGE_NAME

Alasan penghentian tugas kosong yang ditinggalkan

Tugas yang ditinggalkan terjadi saat objek JobParameters yang terkait dengan tugas telah dibersihkan sampah memorinya, tetapi JobService#jobFinished(JobParameters, boolean) belum dipanggil untuk menandakan penyelesaian tugas. Hal ini menunjukkan bahwa tugas mungkin sedang berjalan dan dijadwalkan ulang tanpa sepengetahuan aplikasi.

Aplikasi yang mengandalkan JobScheduler, tidak mempertahankan referensi yang kuat ke objek JobParameters, dan waktu tunggu kini akan diberi alasan penghentian tugas baru STOP_REASON_TIMEOUT_ABANDONED, bukan STOP_REASON_TIMEOUT.

Jika alasan perhentian yang ditinggalkan baru sering terjadi, sistem akan mengambil langkah mitigasi untuk mengurangi frekuensi tugas.

Aplikasi harus menggunakan alasan penghentian baru untuk mendeteksi dan mengurangi tugas yang ditinggalkan.

Jika menggunakan WorkManager, AsyncTask, atau DownloadManager, Anda tidak akan terpengaruh karena API ini mengelola siklus proses tugas atas nama aplikasi Anda.

Menghentikan penggunaan JobInfo#setImportantWhileForeground sepenuhnya

Metode JobInfo.Builder#setImportantWhileForeground(boolean) menunjukkan tingkat kepentingan tugas saat aplikasi penjadwalan berada di latar depan atau saat dikecualikan sementara dari pembatasan latar belakang.

Metode ini tidak digunakan lagi sejak Android 12 (API level 31). Mulai Android 16, metode ini tidak lagi berfungsi secara efektif dan memanggil metode ini akan diabaikan.

Penghapusan fungsi ini juga berlaku untuk JobInfo#isImportantWhileForeground(). Mulai Android 16, jika metode dipanggil, metode akan menampilkan false.

Cakupan prioritas siaran berurutan tidak lagi global

Aplikasi Android diizinkan untuk menentukan prioritas pada penerima siaran untuk mengontrol urutan penerima menerima dan memproses siaran. Untuk penerima yang dideklarasikan dalam manifes, aplikasi dapat menggunakan atribut android:priority untuk menentukan prioritas dan untuk penerima yang terdaftar dalam konteks, aplikasi dapat menggunakan IntentFilter#setPriority() API untuk menentukan prioritas. Saat siaran dikirim, sistem akan mengirimkannya ke penerima sesuai urutan prioritasnya, dari yang tertinggi ke yang terendah.

Di Android 16, urutan pengiriman siaran menggunakan atribut android:priority atau IntentFilter#setPriority() di berbagai proses tidak akan dijamin. Prioritas siaran hanya akan dihormati dalam proses aplikasi yang sama, bukan di semua proses.

Selain itu, prioritas siaran akan otomatis dibatasi pada rentang (SYSTEM_LOW_PRIORITY + 1, SYSTEM_HIGH_PRIORITY - 1). Hanya komponen sistem yang akan diizinkan untuk menetapkan SYSTEM_LOW_PRIORITY, SYSTEM_HIGH_PRIORITY sebagai prioritas siaran.

Aplikasi Anda mungkin terpengaruh jika melakukan salah satu hal berikut:

  1. Aplikasi Anda telah mendeklarasikan beberapa proses dengan intent siaran yang sama, dan memiliki ekspektasi seputar penerimaan intent tersebut dalam urutan tertentu berdasarkan prioritas.
  2. Proses aplikasi Anda berinteraksi dengan proses lain dan memiliki ekspektasi tentang menerima intent siaran dalam urutan tertentu.

Jika proses perlu berkoordinasi satu sama lain, proses tersebut harus berkomunikasi menggunakan saluran koordinasi lain.

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 引入了对 16 KB 内存页面的支持,以优化平台性能。Android 16 添加了兼容模式,让一些针对 4 KB 内存页面构建的应用可以在配置为 16 KB 内存页面的设备上运行。

当您的应用在搭载 Android 16 或更高版本的设备上运行时,如果 Android 检测到您的应用具有 4 KB 对齐的内存页面,则会自动使用兼容模式并向用户显示通知对话框。在 AndroidManifest.xml 中设置 android:pageSizeCompat 属性以启用向后兼容模式,将会阻止应用启动时显示对话框。如需使用 android:pageSizeCompat 属性,请使用 Android 16 SDK 编译您的应用。

为了实现最佳性能、可靠性和稳定性,应用仍应以 16 KB 对齐。如需了解详情,请参阅我们近期发布的博文,了解如何更新应用以支持 16 KB 的内存页面。

兼容模式对话框:当系统检测到 4 KB 对齐的应用在 16 KB 对齐的情况下可以更高效地运行时,系统会显示此对话框。

Pengalaman pengguna dan UI sistem

Android 16 (level API 36) menyertakan perubahan berikut yang dimaksudkan untuk menciptakan pengalaman pengguna yang lebih konsisten dan intuitif.

Penghentian pengumuman aksesibilitas yang mengganggu

Android 16 tidak lagi menggunakan pengumuman aksesibilitas, yang ditandai dengan penggunaan announceForAccessibility atau pengiriman peristiwa aksesibilitas TYPE_ANNOUNCEMENT. Hal ini dapat membuat pengalaman pengguna yang tidak konsisten bagi pengguna TalkBack dan pembaca layar Android, dan alternatifnya lebih baik memenuhi berbagai kebutuhan pengguna di berbagai teknologi asistif Android.

Contoh alternatif:

Dokumentasi referensi untuk announceForAccessibility API yang tidak digunakan lagi menyertakan detail selengkapnya tentang alternatif yang disarankan.

Dukungan untuk navigasi 3 tombol

Android 16 为已正确迁移到预测性返回的应用的三按钮导航栏引入了预测性返回支持。长按返回按钮会启动预测性返回动画,让您预览返回滑动手势会打开的界面。

此行为适用于系统中支持预测性返回动画的所有区域,包括系统动画(返回主屏幕、跨任务和跨 activity)。

“三按钮”导航模式下的预测性返回动画。

Dukungan untuk navigasi 3 tombol

从 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

Pemilik perangkat virtual adalah aplikasi tepercaya atau istimewa yang membuat dan mengelola perangkat virtual. Pemilik perangkat virtual menjalankan aplikasi di perangkat virtual, lalu memproyeksikan aplikasi ke layar perangkat jarak jauh, seperti komputer pribadi, perangkat virtual reality, atau sistem infotainment mobil. Pemilik perangkat virtual berada di perangkat lokal, seperti ponsel.

Pemilik perangkat virtual di ponsel membuat perangkat virtual yang memproyeksikan aplikasi ke layar jarak jauh.

Penggantian per aplikasi

Di perangkat yang menjalankan Android 16 (level API 36), pemilik perangkat virtual dapat mengganti setelan aplikasi di perangkat virtual tertentu yang dikelola pemilik perangkat virtual. Misalnya, untuk meningkatkan tata letak aplikasi, pemilik perangkat virtual dapat mengabaikan batasan orientasi, rasio aspek, dan kemampuan pengubahan ukuran saat memproyeksikan aplikasi ke layar eksternal.

Perubahan umum yang dapat menyebabkan gangguan

Perilaku Android 16 dapat memengaruhi UI aplikasi Anda pada faktor bentuk layar besar seperti layar mobil atau Chromebook, terutama tata letak yang dirancang untuk layar kecil dalam orientasi potret. Untuk mempelajari cara membuat aplikasi Anda adaptif untuk semua faktor bentuk perangkat, lihat Tentang tata letak adaptif.

Referensi

Streaming aplikasi pendamping

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 提供了针对一般 Intent 重定向攻击的默认安全性,并且只需进行最低限度的兼容性更改和开发者更改。

我们正在推出默认安全强化解决方案,以应对重定向漏洞。Intent在大多数情况下,使用 intent 的应用通常不会遇到任何兼容性问题;我们在整个开发过程中收集了指标,以监控哪些应用可能会出现中断。

当攻击者可以部分或完全控制用于在存在漏洞的应用上下文中启动新组件的 intent 内容时,Android 中就会出现 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) }

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

Mulai Android 16, stack Bluetooth telah diupdate untuk meningkatkan keamanan dan pengalaman pengguna saat kehilangan ikatan jarak jauh terdeteksi. Sebelumnya, sistem akan otomatis menghapus ikatan dan memulai proses penyambungan baru, yang dapat menyebabkan penyambungan ulang yang tidak disengaja. Kami telah melihat dalam banyak kasus aplikasi tidak menangani peristiwa kehilangan ikatan secara konsisten.

Untuk menyatukan pengalaman, Android 16 meningkatkan penanganan kehilangan ikatan ke sistem. Jika perangkat Bluetooth yang sebelumnya tersambung tidak dapat diautentikasi setelah terhubung kembali, sistem akan memutuskan hubungan link, mempertahankan informasi ikatan lokal, dan menampilkan dialog sistem yang memberi tahu pengguna tentang hilangnya ikatan dan mengarahkan mereka untuk menyambungkan kembali.