Android 9 (API level 28) memperkenalkan banyak perubahan pada sistem Android.
Perubahan perilaku berikut berlaku secara eksklusif untuk aplikasi yang menargetkan
API level 28 atau yang lebih tinggi. Aplikasi yang menetapkan targetSdkVersion
ke API level 28 atau
yang lebih tinggi harus memodifikasi
aplikasinya untuk mendukung perilaku ini dengan benar, jika berlaku bagi aplikasi.
Untuk perubahan yang memengaruhi semua aplikasi yang berjalan di Android 9, terlepas dari level API 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 akan otomatis memberikannya ke aplikasi yang meminta.
Jika aplikasi yang menargetkan Android 9 atau yang lebih tinggi mencoba membuat layanan latar depan tanpa
meminta FOREGROUND_SERVICE
,
sistem akan menampilkan SecurityException
.
Perubahan privasi
Jika aplikasi Anda menargetkan Android 9, Anda harus memperhatikan perubahan perilaku berikut. Update pada seri perangkat dan informasi DNS ini meningkatkan privasi pengguna.
Penghentian penggunaan nomor seri build
Di Android 9, Build.SERIAL
selalu ditetapkan ke "UNKNOWN"
untuk melindungi privasi pengguna.
Jika aplikasi Anda perlu mengakses nomor seri hardware perangkat, Anda harus
meminta izin
READ_PHONE_STATE
, lalu memanggil
getSerial()
.
Privasi DNS
Aplikasi yang menargetkan Android 9 harus menerima API DNS pribadi. Secara khusus, aplikasi harus memastikan bahwa, jika resolver sistem melakukan DNS-over-TLS, setiap klien DNS bawaan akan menggunakan DNS terenkripsi ke nama host yang sama dengan sistem, atau dinonaktifkan untuk mendukung resolver sistem.
Perubahan keamanan framework
Android 9 menyertakan beberapa perubahan perilaku yang meningkatkan keamanan aplikasi Anda, tetapi perubahan ini hanya berlaku jika aplikasi Anda 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 menetapkan cleartextTrafficPermitted
secara eksplisit ke true
untuk domain tersebut dalam Konfigurasi Keamanan
Jaringan aplikasi.
Direktori data berbasis web dipisahkan menurut proses
Untuk meningkatkan stabilitas aplikasi dan integritas data di Android 9, aplikasi tidak dapat
membagikan satu direktori data
WebView
di antara
beberapa proses. Biasanya,
direktori data tersebut menyimpan cookie, cache HTTP, serta penyimpanan persisten dan
sementara yang terkait dengan penjelajahan web.
Pada umumnya, 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 proses yang sama. Anda dapat menerapkan aturan "satu-satunya proses saja" secara lebih ketat
dengan memanggil
disableWebView()
di
proses lain aplikasi Anda. Panggilan ini mencegah WebView
diinisialisasi
dalam proses lain tersebut secara tidak sengaja, meskipun dipanggil dari library
dependen.
Jika aplikasi Anda harus menggunakan instance
WebView
dalam lebih dari satu proses,
Anda harus menetapkan akhiran direktori data yang unik untuk setiap proses, menggunakan
metode WebView.setDataDirectorySuffix()
, sebelum menggunakan instance WebView
tertentu dalam proses tersebut. Metode ini menempatkan data web dari setiap proses di direktorinya sendiri 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, terutama persyaratan bahwa data pribadi aplikasi 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 di jaringan
yang bukan merupakan setelan default saat ini—seperti traffic seluler saat perangkat menggunakan
Wi-Fi—dan menyediakan metode dalam class
NetworkStatsManager
untuk membuat kueri traffic tersebut.
Secara khusus,
getMultipathPreference()
kini menampilkan nilai berdasarkan traffic jaringan yang disebutkan di atas. Mulai
Android 9, metode ini menampilkan true
untuk data seluler, tetapi jika traffic yang terakumulasi melebihi jumlah
tertentu dalam sehari, metode tersebut 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 memproses peristiwa konektivitas tanpa harus mencampur panggilan sinkron dan
asinkron serta menggunakan API terbatas. Selain itu, ini berarti
transfer informasi berfungsi seperti yang diharapkan saat 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 tidak tersedia untuk aplikasi secara default.
Untuk terus menggunakan klien HTTP Apache, aplikasi yang menargetkan Android 9 dan yang lebih baru dapat menambahkan kode berikut ke AndroidManifest.xml
mereka:
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
Sebagai alternatif menggunakan library Apache runtime, aplikasi dapat memaketkan
versi library org.apache.http
miliknya sendiri dalam APK. Jika melakukannya,
Anda harus mengemas ulang library (dengan utilitas seperti
Jar Jar) untuk menghindari masalah kompatibilitas class
dengan class yang disediakan dalam runtime.
Perubahan UI
Fokus tampilan
Tampilan dengan area 0 (baik lebar maupun tinggi adalah 0) tidak lagi focusable.
Selain itu, aktivitas tidak lagi menetapkan fokus awal secara implisit dalam mode sentuh. Sebagai gantinya, Anda dapat 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 warna 4 dan 8 digit heksadesimal.
CSS Color Module Level 4 telah didukung oleh Chrome sejak rilis 52, tetapi WebView saat ini menonaktifkan fitur tersebut karena aplikasi Android yang ada ternyata berisi warna hex 32 bit dalam pengurutan Android (ARGB), yang akan menyebabkan error rendering.
Misalnya, warna #80ff8080
saat ini dirender di
WebView sebagai merah
terang (#ff8080
) untuk aplikasi yang menargetkan API level 27 atau yang lebih rendah. Komponen
utama (yang akan ditafsirkan oleh Android sebagai komponen alfa)
saat ini diabaikan. Jika aplikasi menargetkan API level 28 atau yang lebih tinggi, #80ff8080
diinterpretasikan sebagai hijau muda transparan 50% (#80ff80
).
Perkiraan jenis MIME untuk file: URI
Versi Android sebelum Android 9 dapat menyimpulkan jenis MIME dari konten
file. Mulai Android 9 (API level 28), aplikasi harus menggunakan
ekstensi file yang benar saat memuat URI file:
di
WebView.
Menggunakan konten file untuk menyimpulkan jenis MIME dapat menjadi sumber bug keamanan, dan hal ini umumnya 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 berupa 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 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 isi, dan elemen root memiliki nilai scroll nol. Android 9 mengaktifkan perilaku yang sesuai dengan standar dengan elemen scroll adalah elemen root.
Selain itu, mengakses langsung document.body.scrollTop
, document.body.scrollLeft
,
document.documentElement.scrollTop
, atau document.documentElement.scrollLeft
akan berperilaku berbeda bergantung pada SDK target. Untuk mengakses nilai scroll area pandang, gunakan document.scrollingElement
, jika tersedia.
Notifikasi dari aplikasi yang ditangguhkan
Sebelum Android 9, notifikasi dari aplikasi yang ditangguhkan dibatalkan. Mulai Android 9, notifikasi dari aplikasi yang ditangguhkan akan disembunyikan hingga aplikasi dilanjutkan.