Perubahan perilaku: Aplikasi yang menargetkan Android 17 atau yang lebih tinggi

Seperti rilis sebelumnya, Android 17 menyertakan perubahan perilaku yang mungkin memengaruhi aplikasi Anda. Perubahan perilaku berikut ini berlaku khusus bagi aplikasi yang menargetkan Android 17 atau yang lebih tinggi. Jika aplikasi Anda menargetkan Android 17 atau yang lebih tinggi, Anda harus memodifikasi aplikasi untuk mendukung perilaku ini, jika berlaku.

Pastikan Anda juga meninjau daftar perubahan perilaku yang memengaruhi semua aplikasi yang berjalan di Android 17, terlepas dari targetSdkVersion aplikasi Anda.

Fungsi inti

Android 17 mencakup perubahan berikut yang mengubah atau memperluas berbagai kemampuan inti sistem Android.

Implementasi MessageQueue bebas kunci baru

Mulai Android 17, aplikasi yang menargetkan Android 17 (level API 37) atau yang lebih tinggi menerima penerapan bebas kunci baru dari android.os.MessageQueue. Implementasi baru ini meningkatkan performa dan mengurangi frame yang terlewat, tetapi dapat merusak klien yang mencerminkan kolom dan metode pribadi MessageQueue.

Untuk mengetahui informasi selengkapnya, termasuk strategi mitigasi, lihat Panduan perubahan perilaku MessageQueue.

Kolom akhir statis kini tidak dapat diubah

Apps running on Android 17 or higher that target Android 17 (API level 37) or higher cannot change static final fields. If an app attempts to change a static final field by using reflection, it will cause an IllegalAccessException. Attempting to modify one of these fields through JNI APIs (such as SetStaticLongField()) will cause the app to crash.

Aksesibilitas

Android 17 melakukan perubahan berikut untuk meningkatkan aksesibilitas.

Dukungan aksesibilitas untuk pengetikan keyboard fisik IME yang kompleks

Fitur ini memperkenalkan API AccessibilityEvent dan TextAttribute baru untuk meningkatkan kualitas respons lisan pembaca layar untuk input bahasa CJKV. Aplikasi IME CJKV kini dapat memberi sinyal apakah kandidat konversi teks telah dipilih selama komposisi teks. Aplikasi dengan kolom edit dapat menentukan jenis perubahan teks saat mengirim peristiwa aksesibilitas teks yang berubah. Misalnya, aplikasi dapat menentukan bahwa perubahan teks terjadi selama komposisi teks, atau bahwa perubahan teks dihasilkan dari commit. Dengan melakukannya, layanan aksesibilitas seperti pembaca layar dapat memberikan masukan yang lebih akurat berdasarkan sifat modifikasi teks.

Adopsi aplikasi

  • Aplikasi IME: Saat menyetel penulisan teks di kolom edit, IME dapat menggunakan TextAttribute.Builder.setTextSuggestionSelected() untuk menunjukkan apakah kandidat konversi tertentu dipilih.

  • Aplikasi dengan Edit Kolom: Aplikasi yang mempertahankan InputConnection kustom dapat mengambil data pemilihan kandidat dengan memanggil TextAttribute.isTextSuggestionSelected(). Aplikasi ini kemudian harus memanggil AccessibilityEvent.setTextChangeTypes() saat mengirim peristiwa TYPE_VIEW_TEXT_CHANGED. Aplikasi yang menargetkan Android 17 (level API 37) yang menggunakan TextView standar akan mengaktifkan fitur ini secara default. (Artinya, TextView akan menangani pengambilan data dari IME dan menyetel jenis perubahan teks saat mengirim peristiwa ke layanan aksesibilitas).

  • Layanan Aksesibilitas: Layanan aksesibilitas yang memproses peristiwa TYPE_VIEW_TEXT_CHANGED dapat memanggil AccessibilityEvent.getTextChangeTypes() untuk mengidentifikasi sifat modifikasi dan menyesuaikan strategi masukan mereka.

Privasi

Android 17 menyertakan perubahan berikut untuk meningkatkan privasi pengguna.

ECH (Encrypted Client Hello) diaktifkan

Android 17 memperkenalkan dukungan platform untuk Encrypted Client Hello (ECH), ekstensi TLS yang meningkatkan privasi pengguna dengan mengenkripsi Indikasi Nama Server (SNI) dalam handshake TLS. Enkripsi ini membantu mencegah pengamat jaringan mengidentifikasi domain tertentu yang terhubung dengan aplikasi Anda.

Untuk aplikasi yang menargetkan Android 17 (API level 37) atau yang lebih tinggi, ECH digunakan untuk koneksi TLS. ECH hanya aktif jika library jaringan yang digunakan oleh aplikasi (misalnya, HttpEngine, WebView, atau OkHttp) telah mengintegrasikan dukungan ECH dan server jarak jauh juga mendukung protokol ECH. Jika ECH tidak dapat dinegosiasikan, klien akan mengirim ekstensi ECH dengan konten acak (mekanisme yang disebut ECH GREASE). Lihat RFC 9849 untuk mengetahui detail selengkapnya tentang cara kerja ECH GREASE.

Untuk memungkinkan aplikasi menyesuaikan perilaku ini, Android 17 menambahkan elemen baru <domainEncryption> ke file Konfigurasi Keamanan Jaringan. Developer dapat menggunakan <domainEncryption> dalam <base-config> atau <domain-config> tag untuk memilih mode ECH (misalnya, "enabled" atau "disabled") secara global atau per domain.

Untuk mengetahui informasi selengkapnya, lihat dokumentasi Encrypted Client Hello.

Izin jaringan lokal diperlukan untuk aplikasi yang menargetkan Android 17

Android 17 introduces the ACCESS_LOCAL_NETWORK runtime permission to protect users from unauthorized local network access. Because this falls under the existing NEARBY_DEVICES permission group, users who have already granted other NEARBY_DEVICES permissions aren't prompted again. This new requirement prevents malicious apps from exploiting unrestricted local network access for covert user tracking and fingerprinting. By declaring and requesting this permission, your app can discover and connect to devices on the local area network (LAN), such as smart home devices or casting receivers.

Apps targeting Android 17 (API level 37) or higher now have two paths to maintain communication with LAN devices: Adopt system-mediated, privacy-preserving device pickers to skip the permission prompt, or explicitly request this new permission at runtime to maintain local network communication.

For more information, see the Local network permission documentation.

Menyembunyikan sandi dari perangkat fisik

Jika aplikasi menargetkan Android 17 (level API 37) atau yang lebih tinggi dan pengguna menggunakan perangkat input fisik (misalnya, keyboard eksternal), sistem operasi Android menerapkan setelan show_passwords_physical baru ke semua karakter di kolom sandi. Secara default, setelan tersebut menyembunyikan semua karakter sandi.

Sistem Android menampilkan karakter sandi yang terakhir diketik untuk membantu pengguna melihat apakah mereka salah mengetik sandi. Namun, hal ini tidak terlalu diperlukan dengan keyboard eksternal yang lebih besar. Selain itu, perangkat dengan keyboard eksternal sering kali memiliki layar yang lebih besar, sehingga meningkatkan bahaya seseorang melihat sandi yang diketik.

Jika pengguna menggunakan layar sentuh perangkat, sistem akan menerapkan setelan show_passwords_touch baru.

Perlindungan OTP untuk pesan SMS standar

Mulai Android 17, Android memperluas perlindungan OTP SMS-nya untuk diterapkan pada pesan SMS standar (pesan SMS yang berisi OTP yang tidak menggunakan format WebOTP atau SMS Retriever). Untuk sebagian besar aplikasi yang menargetkan Android 17 (level API 37) atau yang lebih tinggi, pesan SMS ini tidak akan tersedia hingga tiga jam setelah diterima. Penundaan ini dimaksudkan untuk membantu mencegah pembajakan OTP. Selama penundaan tiga jam ini, siaran SMS_RECEIVED_ACTION akan ditahan dan kueri database penyedia SMS akan difilter. Pesan SMS tersedia untuk aplikasi ini setelah penundaan.

Aplikasi tertentu seperti aplikasi asisten SMS default, aplikasi pendamping perangkat terhubung, dll., dikecualikan dari penundaan ini. Semua aplikasi yang mengandalkan pembacaan pesan SMS untuk ekstraksi OTP harus beralih menggunakan SMS Retriever atau SMS User Consent API untuk memastikan fungsi yang berkelanjutan.

Keamanan

Android 17 melakukan peningkatan berikut pada keamanan perangkat dan aplikasi.

Keamanan Aktivitas

In Android 17, the platform continues its shift toward a "secure-by-default" architecture, introducing a suite of enhancements designed to mitigate high-severity exploits such as phishing, interaction hijacking, and confused deputy attacks. This update requires developers to explicitly opt in to new security standards to maintain app compatibility and user protection.

Key impacts for developers include:

  • BAL hardening & improved opt-in: We are refining Background Activity Launch (BAL) restrictions by extending protections to IntentSender. Developers must migrate away from the legacy MODE_BACKGROUND_ACTIVITY_START_ALLOWED constant. Instead, you should adopt granular controls like MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE, which restricts activity starts to scenarios where the calling app is visible, significantly reducing the attack surface.
  • Adoption tools: Developers should utilize strict mode and updated lint checks to identify legacy patterns and ensure readiness for future target SDK requirements.

Mengaktifkan CT secara default

Jika aplikasi menargetkan Android 17 (API level 37) atau yang lebih tinggi, transparansi sertifikat (CT) akan diaktifkan secara default. (Di Android 16, CT tersedia, tetapi aplikasi harus ikut serta.)

DCL Native yang Lebih Aman—C

If your app targets Android 17 (API level 37) or higher, the Safer Dynamic Code Loading (DCL) protection introduced in Android 14 for DEX and JAR files now extends to native libraries.

All native files loaded using System.load() must be marked as read-only. Otherwise, the system throws UnsatisfiedLinkError.

We recommend that apps avoid dynamically loading code whenever possible, as doing so greatly increases the risk that an app can be compromised by code injection or code tampering.

Membatasi kolom PII dalam tampilan data CP2

Untuk aplikasi yang menargetkan Android 17 (API level Android 17 (API level 37)) dan yang lebih tinggi, Contacts Provider 2 (CP2) membatasi kolom tertentu yang berisi Informasi Identitas Pribadi (PII) dari tampilan data. Jika perubahan ini diaktifkan, kolom tersebut akan dihapus dari tampilan data untuk meningkatkan privasi pengguna. Kolom yang dibatasi meliputi:

Aplikasi yang menggunakan kolom ini dari ContactsContract.Data dapat mengekstraknya dari ContactsContract.RawContacts sebagai gantinya, dengan menggabungkan RAW_CONTACT_ID.

Menerapkan pemeriksaan SQL yang ketat di CP2

Untuk aplikasi yang menargetkan Android 17 (level API Android 17 (level API 37)) dan yang lebih tinggi, Penyedia Kontak 2 (CP2) menerapkan validasi kueri SQL yang ketat saat tabel ContactsContract.Data diakses tanpa READ_CONTACTS izin.

Dengan perubahan ini, jika aplikasi tidak memiliki READ_CONTACTS izin, StrictColumns dan StrictGrammar opsi akan ditetapkan saat membuat kueri tabel ContactsContract.Data. Jika kueri menggunakan pola yang tidak kompatibel dengan pola ini, kueri akan ditolak dan menyebabkan pengecualian ditampilkan.

Media

Android 17 menyertakan perubahan berikut pada perilaku media.

Penguatan audio latar belakang

Mulai Android 17, framework audio menerapkan batasan pada interaksi audio di latar belakang, termasuk pemutaran audio, permintaan fokus audio, dan API perubahan volume untuk memastikan bahwa perubahan ini dimulai secara sengaja oleh pengguna.

Beberapa batasan audio berlaku untuk semua aplikasi. Namun, pembatasan lebih ketat jika aplikasi menargetkan Android 17 (level API 37). Jika salah satu aplikasi ini berinteraksi dengan audio saat berada di latar belakang, aplikasi tersebut harus menjalankan layanan latar depan. Selain itu, aplikasi harus memenuhi satu atau kedua persyaratan berikut:

  • Layanan latar depan harus memiliki kemampuan saat-sedang-digunakan (WIU).
  • Aplikasi harus memiliki izin alarm tepat dan berinteraksi dengan aliran audio USAGE_ALARM.

Untuk mengetahui informasi selengkapnya, termasuk strategi mitigasi, lihat Penguatan audio latar belakang.

Faktor bentuk perangkat

Android 17 menyertakan perubahan berikut untuk meningkatkan pengalaman pengguna di berbagai ukuran dan faktor bentuk perangkat.

Perubahan API platform untuk mengabaikan batasan orientasi, perubahan ukuran, dan rasio aspek di layar besar (sw>=600dp)

We introduced Platform API changes in Android 16 to ignore orientation, aspect ratio, and resizability restrictions on large screens (sw >= 600dp) for apps targeting API level 36 or higher. Developers have the option to opt out of these changes with SDK 36, but this opt-out will no longer be available for apps that target Android 17 (API level 37) or higher.

For more information, see Restrictions on orientation and resizability are ignored.

Konektivitas

Android 17 memperkenalkan perubahan berikut untuk meningkatkan konsistensi dan menyelaraskan dengan perilaku InputStream Java standar untuk soket RFCOMM Bluetooth.

Perilaku read() BluetoothSocket yang konsisten untuk RFCOMM

Untuk aplikasi yang menargetkan Android 17 (API level 37), metode read() dari InputStream yang diperoleh dari BluetoothSocket berbasis RFCOMM kini menampilkan -1 saat soket ditutup atau koneksi terputus.

Perubahan ini membuat perilaku soket RFCOMM konsisten dengan soket LE CoC dan selaras dengan dokumentasi standar InputStream.read(), yang menyatakan bahwa -1 ditampilkan saat akhir streaming tercapai.

Aplikasi yang hanya mengandalkan penangkapan IOException untuk keluar dari loop baca mungkin terpengaruh oleh perubahan ini dan harus memperbarui loop baca BluetoothSocket untuk memeriksa nilai yang ditampilkan secara eksplisit sebesar -1. Hal ini memastikan loop berakhir dengan benar saat perangkat jarak jauh terputus atau soket ditutup. Untuk contoh penerapan yang direkomendasikan, lihat cuplikan kode dalam panduan Mentransfer data Bluetooth.