Perubahan perilaku: aplikasi yang menargetkan API level 28+

Android 9 (API level 28) memperkenalkan banyak perubahan pada sistem Android. Perubahan perilaku berikut berlaku secara eksklusif pada aplikasi yang menargetkan API level 28 atau yang lebih tinggi. Aplikasi yang menetapkan targetSdkVersion ke API level 28 atau yang lebih tinggi harus memodifikasi aplikasi mereka agar dapat mendukung perilaku ini dengan benar, jika memungkinkan bagi aplikasi tersebut.

Untuk perubahan yang memengaruhi semua aplikasi yang berjalan di Android 9, terlepas dari API level yang ditargetkannya, lihat Perubahan perilaku: semua aplikasi.

Layanan latar depan

Aplikasi yang menargetkan Android 9 atau yang lebih tinggi dan menggunakan layanan latar depan harus meminta izin FOREGROUND_SERVICE. Ini adalah izin normal sehingga sistem memberikannya secara otomatis ke aplikasi yang meminta.

Jika aplikasi yang menargetkan Android 9 atau yang lebih tinggi berupaya membuat layanan latar depan tanpa meminta FOREGROUND_SERVICE, sistem akan menampilkan SecurityException.

Perubahan privasi

Jika aplikasi Anda menargetkan Android 9, Anda harus selalu mengingat perubahan perilaku berikut. Update pada seri perangkat dan informasi DNS ini menyempurnakan privasi pengguna.

Penghentian penggunaan nomor seri build

Di Android 9, Build.SERIALselalu ditetapkan ke "UNKNOWN" untuk melindungi privasi pengguna.

Jika aplikasi Anda perlu mengakses nomor seri hardware perangkat, sebagai gantinya Anda harus meminta izin READ_PHONE_STATE, lalu panggil getSerial().

Privasi DNS

Aplikasi yang menargetkan Android 9 harus menganggap penting API DNS pribadi. Secara khusus, aplikasi harus memastikan bahwa, jika system resolver melakukan DNS-over-TLS, klien DNS bawaan apa pun akan menggunakan DNS terenkripsi dengan nama host yang sama dengan sistem, atau dinonaktifkan demi system resolver.

Perubahan keamanan framework

Android 9 menyertakan beberapa perubahan perilaku yang meningkatkan keamanan aplikasi Anda, tetapi perubahan ini hanya berlaku jika aplikasi menargetkan API level 28 atau yang lebih tinggi.

TLS jaringan diaktifkan secara default

Jika aplikasi Anda menargetkan Android 9 atau yang lebih tinggi, metode isCleartextTrafficPermitted() akan menampilkan false secara default. Jika aplikasi perlu mengaktifkan cleartext untuk domain tertentu, Anda harus secara eksplisit menetapkan cleartextTrafficPermitted ke true untuk domain tersebut di Konfigurasi Keamanan Jaringan aplikasi Anda.

Direktori data berbasis web dipisahkan menurut proses

Untuk meningkatkan stabilitas aplikasi dan integritas data di Android 9, aplikasi tidak dapat berbagi satu direktori data WebView di antara beberapa proses. Biasanya, direktori data tersebut menyimpan cookie, cache HTTP, serta penyimpanan tetap dan sementara yang berkaitan dengan browsing web.

Di kebanyakan kasus, aplikasi Anda harus menggunakan class dari paket android.webkit, seperti WebView dan CookieManager, hanya dalam satu proses. Misalnya, Anda harus memindahkan semua objek Activity yang menggunakan WebView ke dalam proses yang sama. Anda dapat lebih ketat memberlakukan aturan "satu-satunya proses" dengan memanggil disableWebView() di proses lain aplikasi Anda. Panggilan ini mencegah WebView dimulai dalam proses-proses lain secara tidak sengaja, bahkan ketika dipanggil dari library dependen.

Jika aplikasi harus menggunakan instance WebView di lebih dari satu proses, Anda harus menetapkan akhiran direktori data yang unik untuk setiap proses, menggunakan metode WebView.setDataDirectorySuffix(), sebelum menggunakan instance tertentu dari WebView dalam proses tersebut. Metode ini memasukkan data web dari setiap proses ke direktorinya sendiri yang berada dalam direktori data aplikasi Anda.

Domain SELinux per aplikasi

Aplikasi yang menargetkan Android 9 atau yang lebih tinggi tidak dapat berbagi data dengan aplikasi lain menggunakan izin Unix yang dapat diakses bebas. Perubahan ini meningkatkan integritas Android Application Sandbox, khususnya persyaratan bahwa data pribadi hanya dapat diakses oleh aplikasi tersebut.

Untuk berbagi file dengan aplikasi lain, gunakan penyedia konten.

Perubahan konektivitas

Penghitungan data konektivitas dan multipath

Dalam aplikasi yang menargetkan Android 9 atau yang lebih tinggi, sistem menghitung traffic jaringan pada jaringan yang bukan merupakan setelan default saat ini, seperti traffic seluler saat perangkat berada dalam jaringan Wi-Fi, dan menyediakan metode dalam class NetworkStatsManager untuk melakukan kueri traffic tersebut.

Secara khusus, getMultipathPreference() kini menampilkan nilai berdasarkan traffic jaringan yang disebutkan di atas. Mulai Android 9, metode akan menampilkan true untuk data seluler, tetapi ketika jumlah traffic yang terakumulasi dalam satu hari melebihi batas tertentu, traffic akan mulai menampilkan false. Aplikasi yang berjalan di Android 9 harus memanggil metode dan menerima petunjuk ini.

Class ConnectivityManager.NetworkCallback kini mengirimkan informasi tentang VPN ke aplikasi. Perubahan ini mempermudah aplikasi untuk memproses peristiwa konektivitas tanpa perlu mencampurkan panggilan sinkron dan asinkron serta menggunakan API terbatas. Selain itu, hal itu juga berarti transfer informasi berfungsi seperti yang diharapkan ketika perangkat terhubung ke beberapa jaringan Wi-Fi atau beberapa jaringan seluler secara bersamaan.

Penghentian penggunaan klien HTTP Apache

Dengan Android 6.0, kami menghapus dukungan untuk klien HTTP Apache. Mulai Android 9, library tersebut dihapus dari bootclasspath dan secara default tidak tersedia bagi aplikasi.

Untuk terus menggunakan klien HTTP Apache, aplikasi yang menargetkan Android 9 dan di atasnya dapat menambahkan kode berikut ke AndroidManifest.xml mereka:

<uses-library android:name="org.apache.http.legacy" android:required="false"/>
    

Selain itu, untuk menggunakan library Apache waktu proses, aplikasi dapat mem-bundling versi library org.apache.http mereka sendiri di APK-nya. Jika melakukan hal ini, Anda harus mem-bundling ulang library tersebut (dengan utilitas seperti Jar Jar) untuk menghindari masalah kompatibilitas class dengan class yang disediakan dalam waktu proses.

Perubahan UI

Fokus tampilan

Tampilan dengan area 0 (baik lebar maupun tinggi adalah 0) tidak dapat lagi difokuskan.

Selain itu, aktivitas tidak lagi menetapkan fokus awal secara implisit dalam mode sentuh. Sebagai gantinya, Anda dapat memilih untuk meminta fokus awal secara eksplisit, jika menginginkannya.

Penanganan nilai hex RGBA CSS

Aplikasi yang menargetkan Android 9 atau yang lebih tinggi harus mengaktifkan draf perilaku CSS Color Module Level 4 untuk menangani CSS color 4 dan 8 digit hex.

CSS Color Module Level 4 telah didukung oleh Chrome sejak rilis 52, tetapi WebView saat ini menonaktifkan fitur tersebut karena aplikasi Android yang ada diketahui memuat 32 bit warna hex dalam pengurutan Android (ARGB), yang akan menyebabkan rendering error.

Misalnya, warna #80ff8080 saat ini dirender di WebView sebagai merah terang (#ff8080) untuk aplikasi yang menargetkan API level 27 atau lebih rendah. Komponen utama (yang akan diinterpretasikan oleh Android sebagai komponen alfa) saat ini diabaikan. Jika aplikasi menargetkan API level 28 atau lebih tinggi, #80ff8080 diinterpretasikan sebagai lampu hijau transparan 50% (#80ff80).

Perkiraan jenis MIME untuk file: URI

Versi Android sebelum Android 9 dapat memperkirakan jenis MIME dari konten file. Dimulai dengan Android 9 (API level 28), aplikasi harus menggunakan ekstensi file yang benar saat memuat file: URI di WebView.

Menggunakan konten file untuk memperkirakan jenis MIME dapat menjadi sumber bug keamanan dan biasanya hal ini tidak diizinkan oleh browser modern.

Jika file memiliki ekstensi file yang dikenali seperti .html, .txt, .js, atau .css, jenis MIME akan ditentukan oleh ekstensi. Jika file tidak memiliki ekstensi atau memiliki ekstensi yang tidak dikenal, jenis MIME akan menjadi teks biasa.

Misalnya, URI seperti file:///sdcard/test.html akan dirender sebagai HTML, tetapi URI seperti file:///sdcard/test akan dirender sebagai teks biasa, meskipun file tersebut berisi data HTML.

Elemen scroll dokumen

Android 9 menangani kasus dengan benar ketika elemen root dokumen adalah elemen scroll. Pada versi sebelumnya, posisi scroll disetel pada elemen bodi, dan elemen root memiliki nilai scroll nol. Android 9 memungkinkan perilaku sesuai standar dengan elemen scroll adalah elemen root.

Selain itu, mengakses document.body.scrollTop, document.body.scrollLeft, document.documentElement.scrollTop, atau document.documentElement.scrollLeft secara langsung akan menampilkan perilaku yang berbeda tergantung pada SDK target. Untuk mengakses nilai scroll viewport, gunakan document.scrollingElement, jika tersedia.

Notifikasi dari aplikasi yang ditangguhkan

Sebelum Android 9, notifikasi dari aplikasi yang ditangguhkan akan dibatalkan. Mulai Android 9, notifikasi dari aplikasi yang ditangguhkan akan disembunyikan hingga aplikasi dilanjutkan.