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 baru tanpa kunci
Beginning with Android 17, apps targeting Android 17 (API level 37)
or higher receive a new lock-free implementation of
android.os.MessageQueue. The new implementation improves performance and
reduces missed frames, but may break clients that reflect on MessageQueue
private fields and methods.
For more information, including mitigation strategies, see MessageQueue behavior change guidance.
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 AccessibilityEvent dan TextAttribute
API baru untuk meningkatkan masukan 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 diubah.
Misalnya, aplikasi dapat menentukan bahwa perubahan teks terjadi selama komposisi teks, atau perubahan teks dihasilkan dari commit.
Dengan demikian, layanan aksesibilitas seperti pembaca layar dapat memberikan masukan yang lebih akurat berdasarkan sifat modifikasi teks.
Adopsi aplikasi
Aplikasi IME: Saat menetapkan teks komposisi di kolom edit, IME dapat menggunakan
TextAttribute.Builder.setTextSuggestionSelected()untuk menunjukkan apakah kandidat konversi tertentu dipilih.Aplikasi dengan Kolom Edit: Aplikasi yang mempertahankan
InputConnectionkustom dapat mengambil data pemilihan kandidat dengan memanggilTextAttribute.isTextSuggestionSelected(). Aplikasi ini kemudian harus memanggilAccessibilityEvent.setTextChangeTypes()saat mengirim peristiwaTYPE_VIEW_TEXT_CHANGED. Aplikasi yang menargetkan Android 17 (API level 37) yang menggunakanTextViewstandar akan mengaktifkan fitur ini secara default. (Artinya,TextViewakan menangani pengambilan data dari IME dan menetapkan jenis perubahan teks saat mengirim peristiwa ke layanan aksesibilitas).Layanan Aksesibilitas: Layanan aksesibilitas yang memproses peristiwa
TYPE_VIEW_TEXT_CHANGEDdapat memanggilAccessibilityEvent.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 secara oportunistik
Android 17 introduces platform support for Encrypted Client Hello (ECH), a TLS extension that enhances user privacy by encrypting the Server Name Indication (SNI) in the TLS handshake. This encryption helps prevent network observers from easily identifying the specific domain your app is connecting to.
For apps targeting Android 17 (API level 37) or higher, ECH is opportunistically used for TLS connections. ECH is active only if the networking library used by the app (for example, HttpEngine, WebView, or OkHttp) has integrated ECH support and the remote server also supports the ECH protocol. If ECH cannot be negotiated, the connection automatically falls back to a standard TLS handshake without SNI encryption.
To allow apps to customize this behavior, Android 17 adds a new
<domainEncryption> element to the Network Security Configuration file.
Developers can use <domainEncryption> within <base-config> or
<domain-config> tags to select an ECH mode (for example,
"opportunistic", "enabled", or "disabled") on a global or per-domain
basis.
For more information, see the Encrypted Client Hello documentation.
Izin jaringan lokal diperlukan untuk aplikasi yang menargetkan Android 17
Android 17 memperkenalkan izin runtime ACCESS_LOCAL_NETWORK untuk melindungi pengguna dari akses jaringan lokal yang tidak sah. Karena izin ini termasuk dalam grup izin NEARBY_DEVICES yang ada, pengguna yang telah memberikan izin NEARBY_DEVICES lainnya tidak akan diminta lagi. Persyaratan
baru ini mencegah aplikasi berbahaya mengeksploitasi akses jaringan lokal yang tidak dibatasi untuk pelacakan dan pelacakan sidik jari pengguna secara diam-diam. Dengan mendeklarasikan dan meminta izin ini, aplikasi Anda dapat menemukan dan terhubung ke perangkat di jaringan area lokal (LAN), seperti perangkat smart home atau penerima transmisi.
Aplikasi yang menargetkan Android 17 (level API 37) atau yang lebih tinggi kini memiliki dua jalur untuk mempertahankan komunikasi dengan perangkat LAN: Menggunakan pemilih perangkat yang dimediasi sistem dan menjaga privasi untuk melewati perintah izin, atau secara eksplisit meminta izin baru ini saat runtime untuk mempertahankan komunikasi jaringan lokal.
Untuk mengetahui informasi selengkapnya, lihat dokumentasi Izin jaringan lokal.
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.
Keamanan
Android 17 melakukan peningkatan berikut pada keamanan perangkat dan aplikasi.
Keamanan Aktivitas
Di Android 17, platform melanjutkan peralihannya ke arsitektur "aman secara default", dengan memperkenalkan serangkaian peningkatan yang dirancang untuk memitigasi eksploitasi dengan tingkat keparahan tinggi seperti phishing, pembajakan interaksi, dan serangan wakil yang bingung. Update ini mengharuskan developer untuk secara eksplisit memilih ikut serta dalam standar keamanan baru untuk mempertahankan kompatibilitas aplikasi dan perlindungan pengguna.
Dampak utama bagi developer meliputi:
- Penguatan BAL & peningkatan keikutsertaan: Kami menyempurnakan batasan Peluncuran Aktivitas Latar Belakang (BAL) dengan memperluas perlindungan ke
IntentSender. Developer harus bermigrasi dari konstantaMODE_BACKGROUND_ACTIVITY_START_ALLOWEDlama. Sebagai gantinya, Anda harus menerapkan kontrol terperinci sepertiMODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE, yang membatasi peluncuran aktivitas pada skenario saat aplikasi pemanggil terlihat, sehingga secara signifikan mengurangi permukaan serangan. - Alat adopsi: Developer harus menggunakan mode ketat dan pemeriksaan lint yang diperbarui untuk mengidentifikasi pola lama dan memastikan kesiapan untuk persyaratan SDK target pada masa mendatang.
Mengaktifkan CT secara default
Jika aplikasi menargetkan Android 17 (level API 37) atau yang lebih tinggi, transparansi sertifikat (CT) diaktifkan secara default. (Di Android 16, CT tersedia, tetapi aplikasi harus mengaktifkannya.)
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, Contacts Provider 2 (CP2) menerapkan validasi kueri SQL yang ketat saat tabel ContactsContract.Data diakses tanpa izin READ_CONTACTS.
Dengan perubahan ini, jika aplikasi tidak memiliki izin READ_CONTACTS, opsi StrictColumns dan StrictGrammar 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.