Android 10 menyertakan perubahan perilaku yang dapat memengaruhi aplikasi Anda.
Perubahan yang tercantum di halaman ini berlaku untuk aplikasi Anda saat berjalan
di Android 10, terlepas dari targetSdkVersion
aplikasi. Sebaiknya
uji aplikasi Anda dan ubah sesuai kebutuhan untuk mendukung perubahan ini dengan benar.
Jika targetSdkVersion aplikasi adalah 29
atau lebih tinggi, Anda juga harus
mendukung perubahan tambahan. Pastikan untuk membaca perubahan perilaku untuk aplikasi
yang menargetkan 29 untuk mengetahui detailnya.
Catatan: Selain perubahan yang tercantum di halaman ini, Android 10 memperkenalkan sejumlah besar perubahan dan pembatasan berbasis privasi, termasuk hal berikut:
- Akses latar belakang ke lokasi perangkat
- Dimulainya aktivitas latar belakang
- Informasi afinitas kontak
- Pengacakan alamat MAC
- Metadata kamera
- Model izin
Perubahan ini memengaruhi semua aplikasi dan meningkatkan privasi pengguna. Untuk mempelajari lebih lanjut cara mendukung perubahan ini, lihat halaman Perubahan privasi.
Pembatasan antarmuka non-SDK
Untuk membantu memastikan stabilitas dan kompatibilitas aplikasi, platform mulai membatasi antarmuka non-SDK yang dapat digunakan aplikasi Anda di Android 9 (API level 28). Android 10 menyertakan daftar terbaru antarmuka non-SDK yang dibatasi berdasarkan kolaborasi dengan developer Android dan pengujian internal terbaru. Tujuan kami adalah memastikan bahwa alternatif publik tersedia sebelum kami membatasi antarmuka non-SDK.
Jika Anda tidak menargetkan Android 10 (API level 29), beberapa perubahan ini mungkin tidak langsung memengaruhi Anda. Namun, meskipun saat ini Anda dapat menggunakan beberapa antarmuka non-SDK (bergantung pada API level target aplikasi Anda), penggunaan metode atau kolom non-SDK tetap sangat berisiko merusak aplikasi Anda.
Jika tidak yakin apakah aplikasi Anda menggunakan antarmuka non-SDK atau tidak, Anda dapat menguji aplikasi untuk mencari tahu. Jika aplikasi Anda mengandalkan antarmuka non-SDK, sebaiknya mulailah merencanakan migrasi ke alternatif SDK. Meskipun begitu, kami paham bahwa beberapa aplikasi memiliki kasus penggunaan yang valid untuk menggunakan antarmuka non-SDK. Jika tidak dapat menemukan alternatif penggunaan antarmuka non-SDK untuk fitur dalam aplikasi Anda, sebaiknya minta API publik baru.
Untuk mempelajari lebih lanjut, lihat Pembaruan pada pembatasan antarmuka non-SDK di Android 10 dan lihat Pembatasan pada antarmuka non-SDK.
Navigasi Gestur
Mulai Android 10, pengguna dapat mengaktifkan navigasi gestur di seluruh perangkat. Jika pengguna mengaktifkan navigasi gestur, semua aplikasi di perangkat akan terpengaruh, terlepas apakah aplikasi tersebut menargetkan API level 29 atau tidak. Misalnya, jika pengguna menggeser dari tepi layar ke tengah, sistem akan mengartikan gestur tersebut sebagai navigasi Kembali, kecuali jika aplikasi secara khusus mengganti gestur tersebut untuk beberapa bagian layar.
Agar aplikasi Anda kompatibel dengan navigasi gestur, Anda dapat memperluas konten aplikasi dari tepi ke tepi layar, dan menangani gestur yang bermasalah dengan benar. Untuk mengetahui informasinya, lihat dokumentasi Navigasi gestur.
NDK
Android 10 menyertakan perubahan NDK berikut ini.
Objek bersama tidak boleh berisi relokasi teks
Android 6.0 (API level 23) melarang penggunaan relokasi teks dalam objek bersama. Kode harus dimuat apa adanya, dan tidak boleh dimodifikasi. Perubahan ini akan mempercepat waktu pemuatan aplikasi dan meningkatkan keamanannya.
SELinux memberlakukan batasan ini pada aplikasi yang menargetkan Android 10 atau yang lebih tinggi. Jika terus menggunakan objek bersama yang berisi relokasi teks, aplikasi ini akan sangat rentan mengalami kerusakan.
Perubahan pada library Bionic dan lokasi linker dinamis
Mulai Android 10, beberapa jalur akan menjadi link simbolis, bukan file biasa. Aplikasi yang telah mengandalkan jalur yang berupa file reguler mungkin akan rusak:
/system/lib/libc.so
->/apex/com.android.runtime/lib/bionic/libc.so
/system/lib/libm.so
->/apex/com.android.runtime/lib/bionic/libm.so
/system/lib/libdl.so
->/apex/com.android.runtime/lib/bionic/libdl.so
/system/bin/linker
->/apex/com.android.runtime/bin/linker
Perubahan ini juga berlaku untuk varian file 64-bit, dengan
lib/
diganti dengan lib64/
.
Untuk kompatibilitas, symlink disediakan pada lokasi yang lama. Misalnya,
/system/lib/libc.so
adalah symlink ke
/apex/com.android.runtime/lib/bionic/libc.so
. Jadi,
dlopen(“/system/lib/libc.so”)
akan terus berfungsi, tetapi aplikasi akan menemukan
perbedaan saat benar-benar mencoba memeriksa library yang dimuat dengan membaca
/proc/self/maps
atau yang serupa, yang tidak biasa, tetapi kami mendapati bahwa
beberapa aplikasi melakukannya sebagai bagian dari proses anti-peretasan mereka. Jika demikian, jalur /apex/…
harus ditambahkan sebagai jalur yang valid untuk file Bionic.
Biner/library sistem dipetakan ke memori execute-only
Mulai dari Android 10, segmen biner dan library sistem yang dapat dijalankan kini dipetakan ke memori khusus eksekusi (tidak dapat dibaca) sebagai teknik hardening
terhadap serangan dari kode yang digunakan kembali. Jika aplikasi Anda melakukan operasi baca ke
segmen memori yang ditandai sebagai khusus eksekusi, baik dari bug, kerentanan, maupun
inspeksi memori yang disengaja, sistem akan mengirimkan sinyal SIGSEGV
ke aplikasi Anda.
Anda dapat mengidentifikasi apakah perilaku ini menyebabkan error dengan memeriksa file
tombstone terkait di /data/tombstones/
. Error terkait memori khusus eksekusi
berisi pesan pembatalan berikut:
Cause: execute-only (no-read) memory access error; likely due to data in .text.
Untuk mengatasi masalah ini guna melakukan operasi seperti inspeksi memori, Anda dapat
menandai segmen khusus eksekusi sebagai baca+eksekusi dengan memanggil
mprotect()
. Namun, sebaiknya kembalikan setelan ini ke
khusus eksekusi setelahnya, karena setelan izin akses ini memberikan perlindungan
yang lebih baik bagi aplikasi dan pengguna Anda.
Keamanan
Android 10 menghadirkan perubahan keamanan berikut.
TLS 1.3 diaktifkan secara default
Di Android 10 dan yang lebih tinggi, TLS 1.3 diaktifkan secara default untuk semua koneksi TLS. Berikut adalah beberapa detail penting tentang implementasi TLS 1.3 kami:
- Cipher suite TLS 1.3 tidak bisa disesuaikan. Cipher suite TLS 1.3 yang didukung
selalu diaktifkan saat TLS 1.3 diaktifkan. Upaya apa pun untuk menonaktifkannya
dengan memanggil
setEnabledCipherSuites()
akan diabaikan. - Saat TLS 1.3 dinegosiasikan, objek
HandshakeCompletedListener
akan dipanggil sebelum sesi ditambahkan ke cache sesi. (Pada TLS 1.2 dan versi sebelumnya, objek ini dipanggil setelah sesi ditambahkan ke cache sesi.) - Dalam beberapa situasi saat instance
SSLEngine
menampilkanSSLHandshakeException
di versi Android sebelumnya, instance ini akan menampilkanSSLProtocolException
di Android 10 dan yang lebih tinggi. - Mode 0-RTT tidak didukung.
Jika diinginkan, Anda bisa mendapatkan SSLContext
yang menonaktifkan TLS 1.3 dengan memanggil
SSLContext.getInstance("TLSv1.2")
.
Anda juga dapat mengaktifkan atau menonaktifkan versi protokol per koneksi dengan
memanggil setEnabledProtocols()
di objek yang sesuai.
Sertifikat yang ditandatangani dengan SHA-1 tidak dipercaya di TLS
Di Android 10, sertifikat yang menggunakan algoritma hash SHA-1 tidak dipercaya dalam koneksi TLS. CA root belum menerbitkan sertifikat seperti itu sejak 2016, dan sertifikat tersebut tidak lagi dipercaya di Chrome atau browser utama lainnya.
Setiap upaya untuk terhubung akan gagal jika koneksi dibuat ke situs yang menyajikan sertifikat yang menggunakan SHA-1.
Perubahan dan peningkatan perilaku KeyChain
Beberapa browser, seperti Google Chrome, memungkinkan pengguna untuk memilih sertifikat saat
server TLS mengirimkan pesan permintaan sertifikat sebagai bagian dari TLS handshake. Mulai
Android 10,
objek KeyChain
mematuhi penerbit dan
parameter spesifikasi kunci saat memanggil KeyChain.choosePrivateKeyAlias()
untuk
menampilkan prompt pemilihan sertifikat kepada pengguna. Secara khusus, perintah ini tidak
berisi pilihan yang tidak mematuhi spesifikasi server.
Jika tidak ada sertifikat yang bisa dipilih pengguna, seperti ketika tidak ada sertifikat yang cocok dengan spesifikasi server atau perangkat tidak memiliki sertifikat yang terinstal, prompt pemilihan sertifikat tidak akan muncul.
Selain itu, di Android 10 atau yang lebih tinggi, Anda tidak harus menyetel
kunci layar perangkat untuk mengimpor kunci atau sertifikat CA ke objek KeyChain
.
Perubahan TLS dan kriptografi lainnya
Ada beberapa perubahan kecil dalam library TLS dan kriptografi yang diberlakukan di Android 10:
- Cipher AES/GCM/NoPadding dan ChaCha20/Poly1305/NoPadding menampilkan ukuran buffer yang lebih
akurat dari
getOutputSize()
. - Cipher suite
TLS_FALLBACK_SCSV
dihilangkan dari upaya koneksi dengan protokol maksimum TLS 1.2 atau yang lebih baru. Dengan diterapkannya peningkatan di server TLS, sebaiknya Anda tidak mencoba penggantian TLS eksternal. Sebagai gantinya, sebaiknya anda mengandalkan negosiasi versi TLS. - ChaCha20-Poly1305 adalah alias untuk ChaCha20/Poly1305/NoPadding.
- Hostname yang memiliki titik akhir tidak dianggap sebagai nama host SNI yang valid.
- Ekstensi supported_signature_algorithms di
CertificateRequest
dihormati saat memilih kunci penandatanganan untuk respons sertifikat. - Kunci penandatanganan dengan akses terbatas, seperti yang berasal dari Android Keystore, dapat digunakan dengan tanda tangan RSA-PSS di TLS.
Siaran Wi-Fi Langsung
Di Android 10, siaran berikut yang terkait dengan Wi-Fi Langsung tidak melekat:
Jika aplikasi Anda mengandalkan penerimaan siaran ini pada saat pendaftaran karena
sifatnya yang melekat, gunakan metode get()
yang sesuai saat inisialisasi untuk
mendapatkan informasi tersebut.
Kemampuan Wi-Fi Aware
Android 10 menambahkan dukungan untuk memudahkan pembuatan Soket TCP/UDP menggunakan jalur data Wi-Fi Aware. Untuk membuat soket TCP/UDP yang terhubung ke ServerSocket
, perangkat
klien harus mengetahui alamat IPv6 dan port server. Sebelumnya, hal ini
perlu dikomunikasikan di luar band, seperti menggunakan pesan lapisan 2 Wi-Fi Aware
atau BT, atau ditemukan dalam band menggunakan protokol lain, seperti mDNS. Dengan
Android 10, informasi ini dapat dikomunikasikan sebagai bagian dari penyiapan jaringan.
Server bisa melakukan salah satu hal berikut:
- Lakukan inisialisasi
ServerSocket
dan tetapkan atau dapatkan port yang akan digunakan. - Menentukan informasi port sebagai bagian dari permintaan jaringan Wi-Fi Aware.
Contoh kode berikut menunjukkan cara menentukan informasi port sebagai bagian dari permintaan jaringan:
Kotlin
val ss = ServerSocket() val ns = WifiAwareNetworkSpecifier.Builder(discoverySession, peerHandle) .setPskPassphrase("some-password") .setPort(ss.localPort) .build() val myNetworkRequest = NetworkRequest.Builder() .addTransportType(NetworkCapabilities.TRANSPORT_WIFI_AWARE) .setNetworkSpecifier(ns) .build()
Java
ServerSocket ss = new ServerSocket(); WifiAwareNetworkSpecifier ns = new WifiAwareNetworkSpecifier .Builder(discoverySession, peerHandle) .setPskPassphrase(“some-password”) .setPort(ss.getLocalPort()) .build(); NetworkRequest myNetworkRequest = new NetworkRequest.Builder() .addTransportType(NetworkCapabilities.TRANSPORT_WIFI_AWARE) .setNetworkSpecifier(ns) .build();
Klien kemudian melakukan permintaan jaringan Wi-Fi Aware untuk mendapatkan IPv6 dan port yang disediakan oleh server:
Kotlin
val callback = object : ConnectivityManager.NetworkCallback() { override fun onAvailable(network: Network) { ... } override fun onLinkPropertiesChanged(network: Network, linkProperties: LinkProperties) { ... } override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) { ... val ti = networkCapabilities.transportInfo if (ti is WifiAwareNetworkInfo) { val peerAddress = ti.peerIpv6Addr val peerPort = ti.port } } override fun onLost(network: Network) { ... } }; connMgr.requestNetwork(networkRequest, callback)
Java
callback = new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(Network network) { ... } @Override public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) { ... } @Override public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) { ... TransportInfo ti = networkCapabilities.getTransportInfo(); if (ti instanceof WifiAwareNetworkInfo) { WifiAwareNetworkInfo info = (WifiAwareNetworkInfo) ti; Inet6Address peerAddress = info.getPeerIpv6Addr(); int peerPort = info.getPort(); } } @Override public void onLost(Network network) { ... } }; connMgr.requestNetwork(networkRequest, callback);
SYSTEM_ALERT_WINDOW pada perangkat Go
Aplikasi yang berjalan di perangkat Android 10 (edisi Go) tidak dapat menerima izin
SYSTEM_ALERT_WINDOW
. Hal ini dikarenakan proses penggambaran jendela overlay membutuhkan banyak sekali memori,
yang menjadi cukup berbahaya bagi performa perangkat Android
dengan memori rendah.
Jika aplikasi yang berjalan di perangkat edisi Go yang menjalankan Android 9 atau yang lebih rendah menerima
izin SYSTEM_ALERT_WINDOW
, aplikasi akan mempertahankan izin tersebut meskipun
perangkat diupgrade ke Android 10. Namun, aplikasi yang belum memiliki izin
tersebut tidak dapat diberi izin setelah perangkat diupgrade.
Jika aplikasi di perangkat Go mengirim intent dengan tindakan
ACTION_MANAGE_OVERLAY_PERMISSION
,
sistem akan otomatis menolak permintaan, dan mengarahkan pengguna ke
layar Setelan yang menyatakan bahwa izin tidak diizinkan karena
memperlambat perangkat. Jika aplikasi di perangkat Go memanggil
Settings.canDrawOverlays()
,
metode ini akan selalu menampilkan nilai salah. Sekali lagi, pembatasan ini tidak berlaku untuk aplikasi
yang menerima izin SYSTEM_ALERT_WINDOW
sebelum perangkat
diupgrade ke Android 10.
Peringatan untuk aplikasi yang menargetkan Android versi lama
Perangkat yang menjalankan Android 10 atau yang lebih tinggi akan memperingatkan pengguna pada kali pertama mereka menjalankan aplikasi yang menargetkan Android 5.1 (API level 22) atau yang lebih rendah. Jika aplikasi memerlukan pengguna untuk memberikan izin, pengguna juga akan diberi kesempatan untuk menyesuaikan izin aplikasi sebelum aplikasi diizinkan berjalan untuk kali pertama.
Karena persyaratan API target Google Play, pengguna hanya akan melihat peringatan ini saat menjalankan aplikasi yang belum diupdate baru-baru ini. Untuk aplikasi yang didistribusikan melalui app store lain, persyaratan API target yang serupa akan berlaku selama tahun 2019. Untuk mengetahui informasi selengkapnya tentang persyaratan ini, lihat Memperluas persyaratan level API target pada tahun 2019.
Cipher suite SHA-2 CBC dihapus
Cipher suite SHA-2 CBC berikut telah dihapus dari platform:
TLS_RSA_WITH_AES_128_CBC_SHA256
TLS_RSA_WITH_AES_256_CBC_SHA256
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
Cipher suite ini kurang aman dibandingkan cipher suite serupa yang menggunakan GCM, dan sebagian besar server mendukung varian GCM sekaligus CBC cipher suite ini, atau tidak mendukung keduanya sama sekali.
Penggunaan aplikasi
Android 10 memperkenalkan perubahan perilaku berikut yang terkait dengan penggunaan aplikasi:
Perubahan koneksi HTTPS
Jika aplikasi yang menjalankan Android 10 meneruskan null
ke
setSSLSocketFactory()
,
IllegalArgumentException
akan terjadi. Pada versi sebelumnya, meneruskan null
ke setSSLSocketFactory()
memiliki efek yang sama dengan meneruskan pabrik
default saat ini.
Library android.preference tidak digunakan lagi
Library android.preference
tidak digunakan lagi mulai di Android 10.
Sebagai gantinya, developer sebaiknya menggunakan library preferensi AndroidX, yang merupakan bagian dari Android
Jetpack. Sebagai referensi bantuan tambahan untuk melakukan migrasi dan
pengembangan, lihat Panduan
Setelan yang telah diperbarui beserta aplikasi sampel
publik
dan dokumentasi referensi kami.
Perubahan library utilitas file ZIP
Android 10 memperkenalkan perubahan berikut untuk class dalam paket
java.util.zip
, yang menangani file ZIP. Perubahan ini membuat perilaku library menjadi lebih konsisten antara Android dan platform lain yang menggunakan java.util.zip
.
Inflater
Pada versi sebelumnya, beberapa metode di class Inflater
menampilkan
IllegalStateException
jika
dipanggil setelah panggilan ke end()
.
Di Android 10, metode ini akan menampilkan
NullPointerException
.
ZipFile
Di Android 10 dan yang lebih tinggi, konstruktor untuk
ZipFile
yang menggunakan argumen jenis File
, int
, dan Charset
tidak menampilkan
ZipException
jika file ZIP yang disediakan
tidak berisi file apa pun.
ZipOutputStream
Di Android 10 dan yang lebih baru, metode
finish()
di
ZipOutputStream
tidak menampilkan
ZipException
jika mencoba menulis
streaming output untuk file ZIP yang tidak berisi file apa pun.
Perubahan kamera
Banyak aplikasi yang memanfaatkan fungsi kamera menganggap bahwa jika perangkat berada dalam konfigurasi potret, perangkat fisiknya juga berada dalam orientasi potret, seperti yang dijelaskan dalam Orientasi kamera. Dulu asumsi ini memang benar, tetapi sekarang sudah tidak berlaku lagi karena faktor bentuk baru, seperti perangkat foldable. Asumsi tersebut pada perangkat ini dapat menyebabkan tampilan jendela bidik kamera diputar atau diskalakan secara tidak semestinya (atau keduanya).
Aplikasi yang menargetkan API level 24 atau yang lebih tinggi harus secara eksplisit menetapkan
android:resizeableActivity
dan menyediakan fungsi yang diperlukan untuk menangani
operasi multi-aplikasi.
Pelacakan penggunaan baterai
Mulai dari Android 10,
SystemHealthManager
mereset
statistik penggunaan baterai setiap kali perangkat dicabut dari pengisi daya setelah peristiwa
pengisian daya utama. Secara umum, peristiwa pengisian daya utama adalah: Daya perangkat sudah terisi penuh, atau daya sudah terisi dari hampir habis hingga hampir penuh.
Sebelum Android 10, statistik penggunaan baterai disetel ulang setiap kali perangkat dicabut dari pengisi daya, sekecil apa pun perubahan yang terjadi pada level baterai.
Android Beam tidak digunakan lagi
Di Android 10, kami secara resmi menghentikan Android Beam, fitur yang lebih lama untuk memulai berbagi data di seluruh perangkat melalui Komunikasi Nirkabel Jarak Dekat (NFC). Kami juga akan menghentikan beberapa API NFC yang terkait. Android Beam tetap tersedia secara opsional bagi partner pembuat perangkat yang ingin menggunakannya, tetapi tidak lagi dikembangkan secara aktif. Namun, Android akan terus mendukung kemampuan dan API NFC lainnya, dan kasus penggunaan seperti membaca dari tag dan pembayaran akan terus berfungsi seperti yang diharapkan.
Perubahan perilaku java.math.BigDecimal.stripTrailingZeros()
BigDecimal.stripTrailingZeros()
tidak lagi mempertahankan nol di akhir sebagai
kasus khusus jika nilai inputnya nol.
Perubahan perilaku java.util.regex.Matcher dan Pattern
Hasil split()
diubah agar tidak lagi dimulai dengan String
kosong
("") saat ada kecocokan lebar nol di awal input. Hal ini juga
memengaruhi String.split()
. Misalnya, "x".split("")
kini menampilkan {"x"}
,
sedangkan sebelumnya menampilkan {"", "x"}
pada Android versi lama.
"aardvark".split("(?=a)"
kini menampilkan {"a", "ardv", "ark"}
, bukan
{"", "a", "ardv", "ark"}
.
Perilaku pengecualian untuk argumen yang tidak valid juga telah ditingkatkan:
appendReplacement(StringBuffer, String)
kini menampilkanIllegalArgumentException
, bukanIndexOutOfBoundsException
, jikaString
penggantian diakhiri dengan garis miring terbalik tunggal, yang tidak sah. Pengecualian yang sama sekarang ditampilkan jikaString
penggantian diakhiri dengan$
. Sebelumnya, tidak ada pengecualian yang ditampilkan dalam skenario ini.replaceFirst(null)
tidak lagi memanggilreset()
diMatcher
jika menampilkanNullPointerException
.NullPointerException
kini juga ditampilkan jika tidak ada kecocokan. Sebelumnya, pengecualian ini hanya ditampilkan saat ada kecocokan.start(int group)
,end(int group)
, dangroup(int group)
kini menampilkanIndexOutOfBoundsException
yang lebih umum jika indeks grup berada di luar batas. Sebelumnya, metode ini menampilkanArrayIndexOutOfBoundsException
.
Sudut default untuk GradientDrawable kini adalah TOP_BOTTOM
Di Android 10, jika Anda menentukan
GradientDrawable
dalam XML dan tidak memberikan pengukuran sudut, orientasi gradien
akan ditetapkan secara default ke
TOP_BOTTOM
.
Ini adalah perubahan dari versi Android sebelumnya, dengan default
LEFT_RIGHT
.
Sebagai solusi, jika Anda mengupdate ke versi terbaru AAPT2, alat ini akan menetapkan pengukuran sudut 0 untuk aplikasi lama jika tidak ada pengukuran sudut yang ditentukan.
Logging untuk objek serial menggunakan SUID default
Mulai Android 7.0 (API level 24), platform ini melakukan perbaikan
pada serialVersionUID
default untuk objek
yang dapat diserialisasi. Perbaikan ini
tidak memengaruhi aplikasi yang menargetkan API level 23 atau yang lebih rendah.
Mulai Android 10, jika aplikasi menargetkan API level 23 atau yang lebih rendah
dan mengandalkan serialVersionUID
default lama yang salah, sistem akan mencatat
peringatan dan menyarankan perbaikan kode.
Secara khusus, sistem akan mencatat peringatan jika semua hal berikut terpenuhi:
- Aplikasi menargetkan API level 23 atau yang lebih rendah.
- Class diserialisasi.
- Class serialisasi menggunakan
serialVersionUID
default, bukan menyetelserialVersionUID
secara eksplisit. serialVersionUID
default berbeda denganserialVersionUID
jika aplikasi menargetkan API level 24 atau yang lebih tinggi.
Peringatan ini dicatat satu kali untuk setiap class yang terpengaruh.
Pesan peringatan menyertakan perbaikan yang disarankan, yaitu menetapkan
serialVersionUID
secara eksplisit ke nilai default yang akan dihitung jika
aplikasi menargetkan API level 24 atau yang lebih tinggi. Dengan menggunakan perbaikan tersebut, Anda dapat memastikan bahwa
jika objek dari class tersebut diserialisasi di aplikasi yang menargetkan API level
23 atau yang lebih rendah, objek akan dibaca dengan benar oleh aplikasi yang menargetkan 24 atau yang lebih tinggi,
dan sebaliknya.
Perubahan java.io.FileChannel.map()
Mulai Android 10, FileChannel.map()
tidak didukung untuk
file non-standar, seperti /dev/zero
, yang ukurannya tidak dapat diubah menggunakan
truncate()
. Versi
Android sebelumnya menggunakan errno yang ditampilkan oleh
truncate()
, tetapi Android 10 akan menampilkan IOException. Jika memerlukan perilaku lama,
Anda harus menggunakan kode native.