Perubahan perilaku: semua aplikasi

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 aplikasinya. 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 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 tentang 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 yang diperbarui antarmuka non-SDK yang dibatasi berdasarkan kolaborasi dengan developer Android dan pengujian internal terbaru. Tujuan kami adalah memastikan bahwa alternatif baru tersedia sebelum kami membatasi antarmuka non-SDK.

Jika Anda tidak akan menargetkan Android 10 (API level 29), beberapa perubahan ini mungkin tidak langsung mempengaruhi 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, Anda dapat menguji aplikasi Anda untuk temukan. Jika aplikasi Anda mengandalkan antarmuka non-SDK, sebaiknya Anda mulai merencanakan migrasi ke alternatif SDK. Meskipun begitu, kami paham bahwa beberapa aplikasi memiliki kasus penggunaan yang valid untuk menggunakan antarmuka non-SDK. Jika Anda tidak dapat menemukan alternatif penggunaan antarmuka non-SDK untuk fitur di aplikasi Anda, meminta API publik baru.

Untuk mempelajari lebih lanjut, baca Pembaruan pembatasan antarmuka non-SDK di Android 10 dan lihat Batasan antarmuka non-SDK.

Navigasi Gestur

Mulai Android 10, pengguna dapat mengaktifkan navigasi gestur di seluruh perangkat seluler. Jika pengguna mengaktifkan navigasi gestur, hal ini akan memengaruhi semua aplikasi di perangkat, terlepas dari apakah aplikasi tersebut menargetkan API level 29 atau tidak. Misalnya, jika pengguna menggeser dari tepi layar, sistem akan menginterpretasikan gestur tersebut sebagai tombol Kembali navigasi, kecuali jika aplikasi secara khusus mengganti gestur tersebut untuk bagian layar.

Agar aplikasi Anda kompatibel dengan navigasi gestur, Anda perlu memperluas konten aplikasi dari tepi ke tepi, dan menangani gerakan yang bertentangan dengan tepat. Untuk mengetahui informasinya, lihat dokumentasi Navigasi gestur.

NDK

Android 10 menyertakan perubahan NDK berikut ini.

Objek bersama tidak boleh berisi relokasi teks

Penggunaan yang tidak diizinkan di Android 6.0 (API level 23) relokasi teks dalam objek bersama. Kode harus dimuat apa adanya, dan tidak boleh diubah. Perubahan ini akan mempercepat waktu pemuatan aplikasi dan meningkatkan keamanannya.

SELinux memberlakukan pembatasan ini pada aplikasi yang menargetkan Android 10 atau yang lebih tinggi. Jika aplikasi ini terus menggunakan objek bersama yang berisi teks relokasi, mereka berisiko tinggi mengalami kerusakan.

Perubahan pada library Bionic dan lokasi linker dinamis

Mulai Android 10, beberapa jalur merupakan 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 64-bit dari {i>file<i}, 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-peretasannya. Jika ya, Jalur /apex/… harus ditambahkan sebagai jalur yang valid untuk file Bionic.

Biner/library sistem dipetakan ke memori execute-only

Mulai Android 10, segmen biner sistem yang dapat dieksekusi dan library dipetakan ke dalam memori {i>execute-only<i} (tidak dapat dibaca) sebagai {i>hardening<i} terhadap serangan {i>code-reuse<i}. Jika aplikasi Anda melakukan operasi baca ke dalam segmen memori yang ditandai sebagai khusus eksekusi, baik dari bug, kerentanan, atau pemeriksaan memori yang disengaja – sistem akan mengirimkan sinyal SIGSEGV ke aplikasi Anda.

Anda dapat mengidentifikasi apakah perilaku ini menyebabkan error dengan memeriksa elemen file tombstone di /data/tombstones/. Error terkait khusus eksekusi berisi pesan batalkan 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, dapat menandai segmen khusus eksekusi sebagai baca+eksekusi dengan memanggil mprotect(). Namun, kami sangat menyarankan untuk mengaturnya kembali ke hanya eksekusi setelahnya, karena setelan izin akses ini memberikan perlindungan untuk 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 TLS 1.3 kami penerapan:

  • Cipher suite TLS 1.3 tidak bisa disesuaikan. Cipher TLS 1.3 yang didukung suite 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. (Di TLS 1.2 dan versi sebelumnya lainnya, objek ini dipanggil setelah sesi ditambahkan ke cache sesi.)
  • Dalam beberapa situasi saat instance SSLEngine menampilkan SSLHandshakeException di versi Android sebelumnya, instance ini akan menampilkan SSLProtocolException 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 cara memanggil setEnabledProtocols() pada 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 tersebut sejak 2016, dan versi tersebut tidak lagi dipercaya di Chrome atau browser besar lainnya.

Setiap upaya untuk terhubung akan gagal jika koneksi dibuat ke situs yang menyajikan sertifikat 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. Sejak Android 10 Objek KeyChain menghormati penerbit dan parameter spesifikasi kunci saat memanggil KeyChain.choosePrivateKeyAlias() ke menampilkan prompt pemilihan sertifikat kepada pengguna. Secara khusus, prompt ini tidak berisi pilihan yang tidak mematuhi spesifikasi server.

Jika tidak ada sertifikat yang bisa dipilih pengguna, seperti halnya ketika tidak sertifikat sesuai dengan spesifikasi server atau perangkat tidak memiliki sertifikat diinstal, dialog pemilihan sertifikat tidak muncul sama sekali.

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 pustaka TLS dan kriptografi{i> <i}yang berlaku di Android 10:

  • Cipher AES/GCM/NoPadding dan ChaCha20/Poly1305/NoPadding menghasilkan lebih banyak ukuran buffer yang akurat dari getOutputSize().
  • Cipher suite TLS_FALLBACK_SCSV dihilangkan dari upaya koneksi dengan protokol maksimum TLS 1.2 atau yang lebih tinggi. Karena peningkatan di server TLS implementasi TLS, sebaiknya Anda tidak mencoba melakukan 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 sebelumnya, 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 Wi-Fi Aware {i>datapaths<i}. Untuk membuat soket TCP/UDP yang terhubung ke ServerSocket, perangkat klien harus mengetahui alamat IPv6 dan port server. Tugas ini sebelumnya perlu dikomunikasikan di luar band, seperti dengan menggunakan lapisan BT atau Wi-Fi Aware 2, atau ditemukan in-band menggunakan protokol lain, seperti mDNS. Dengan Android 10, informasi dapat dikomunikasikan sebagai bagian dari penyiapan jaringan.

Server bisa melakukan salah satu hal berikut:

  • Lakukan inisialisasi ServerSocket, lalu 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 porta 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 karena jendela overlay menggambar menggunakan memori berlebihan, yang sangat berbahaya bagi performa Android dengan memori rendah perangkat.

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 memilikinya izin akses tidak dapat diberikan setelah perangkat ditingkatkan versinya.

Jika aplikasi pada perangkat Go mengirimkan intent dengan tindakan ACTION_MANAGE_OVERLAY_PERMISSION, sistem secara otomatis menolak permintaan, dan membawa pengguna ke Layar Settings 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 API target Google Play persyaratan layanan, pengguna hanya akan melihat peringatan ini saat mereka menjalankan aplikasi yang belum diupdate baru-baru ini. Untuk aplikasi yang didistribusikan melalui app store lain, API target serupa persyaratan ini mulai berlaku selama tahun 2019. Untuk informasi selengkapnya tentang persyaratan, lihat Memperluas persyaratan level API target di 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

Paket penyandian{i> <i}ini kurang aman dibandingkan dengan rangkaian penyandian{i> <i}yang menggunakan GCM, dan sebagian besar server mendukung varian GCM dan CBC dari penyandian ini, suite atau tidak mendukung keduanya.

Penggunaan aplikasi

Android 10 memperkenalkan perubahan perilaku berikut yang terkait dengan penggunaan aplikasi:

  • Peningkatan penggunaan aplikasi UsageStats - Android 10 secara akurat melacak penggunaan aplikasi dengan UsageStats saat aplikasi digunakan dalam mode layar terpisah atau picture-in-picture. Selain itu, Android 10 melacak penggunaan aplikasi instan dengan benar.

  • Hitam putih per aplikasi - Android 10 dapat menyetel mode tampilan hitam putih per aplikasi.

  • Status gangguan per aplikasi - Android 10 dapat secara selektif menyetel aplikasi ke "status gangguan" dengan notifikasi akan disembunyikan dan tidak muncul sebagai aplikasi yang disarankan.

  • Penangguhan dan pemutaran - Di Android 10, aplikasi yang ditangguhkan tidak dapat memutar audio.

Perubahan koneksi HTTPS

Jika aplikasi yang menjalankan Android 10 meneruskan null ke setSSLSocketFactory() IllegalArgumentException apa yang 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. Untuk sumber daya tambahan untuk membantu proses migrasi dan pengembangan, lihat Setelan yang telah diperbarui Panduan beserta sampel publik kami aplikasi dan dokumentasi referensi.

Perubahan library utilitas file ZIP

Android 10 memperkenalkan perubahan berikut untuk class di java.util.zip , yang menangani file ZIP. Perubahan ini membuat perilaku library 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 saja.

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 tinggi, Metode finish() di ZipOutputStream tidak menampilkan ZipException jika mencoba menulis aliran {i>output<i} untuk file ZIP yang tidak berisi file apa pun.

Perubahan kamera

Banyak aplikasi yang menggunakan kamera menganggap jika perangkat dalam konfigurasi potret, perangkat fisik juga berada dalam orientasi potret, seperti yang dijelaskan Orientasi kamera. Asumsi ini dulunya aman, tetapi sekarang berubah seiring dengan perluasan faktor bentuk yang tersedia, 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 Android 10, SystemHealthManager direset statistik penggunaan baterainya setiap kali sambungan perangkat dicabut setelah batas peristiwa pengisian daya. Umumnya, aktivitas pengisian daya utama adalah: Perangkat telah terisi penuh, atau perangkat telah kehabisan daya menjadi hampir terisi.

Sebelum Android 10, statistik penggunaan baterai direset setiap kali perangkat dicabut, tidak peduli seberapa kecil perubahan 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 menghentikan beberapa API NFC terkait. Android Beam tetap tersedia secara opsional bagi partner pembuat perangkat yang ingin menggunakannya, tetapi tidak lagi dikembangkan secara aktif. Android akan terus mendukung NFC lainnya kemampuan dan API, serta kasus penggunaan seperti membaca dari tag dan pembayaran akan terus berfungsi seperti yang diharapkan.

Perubahan perilaku java.math.BigDesimal.stripTrailingZeros()

BigDecimal.stripTrailingZeros() tidak lagi mempertahankan angka nol di belakang sebagai kasus khusus jika nilai inputnya adalah nol.

java.util.regex.Matcher dan Perubahan perilaku Pola

Hasil split() diubah agar tidak lagi dimulai dengan String kosong ("") jika ada kecocokan lebar nol di awal input. Hal ini juga memengaruhi String.split(). Misalnya, "x".split("") sekarang menampilkan {"x"} sementara itu digunakan untuk menampilkan {"", "x"} pada versi Android yang lebih lama. "aardvark".split("(?=a)" sekarang menampilkan {"a", "ardv", "ark"}, bukan {"", "a", "ardv", "ark"}.

Perilaku pengecualian untuk argumen yang tidak valid juga telah ditingkatkan:

  • appendReplacement(StringBuffer, String) kini menampilkan IllegalArgumentException, bukan IndexOutOfBoundsException, jika String penggantian diakhiri dengan garis miring terbalik tunggal, yang tidak sah. Tujuan pengecualian yang sama kini ditampilkan jika penggantian String diakhiri dengan $. Sebelumnya, tidak ada pengecualian yang ditampilkan dalam skenario ini.
  • replaceFirst(null) tidak lagi memanggil reset() di Matcher jika menampilkan NullPointerException. NullPointerException kini juga ditampilkan jika ada tidak cocok. Sebelumnya, fungsi ini hanya ditampilkan jika ada kecocokan.
  • start(int group), end(int group), dan group(int group) sekarang memberikan lebih banyak umum IndexOutOfBoundsException jika indeks grup berada di luar batas. Sebelumnya, metode ini menampilkan ArrayIndexOutOfBoundsException.

Sudut default untuk GradientDrawable sekarang menjadi 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 menyetel pengukuran sudut 0 untuk aplikasi lama jika tidak ada sudut 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 yang lama, salah, default, serta log sistem peringatan dan menyarankan perbaikan kode.

Secara khusus, sistem akan mencatat peringatan jika semua hal berikut berlaku:

  • Aplikasi menargetkan API level 23 atau yang lebih rendah.
  • Class diserialisasi.
  • Class yang diserialisasi menggunakan serialVersionUID default, bukan menetapkan serialVersionUID secara eksplisit.
  • serialVersionUID default berbeda dengan serialVersionUID adalah 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 secara eksplisit serialVersionUID ke nilai default yang akan dihitung jika aplikasi menargetkan API level 24 atau yang lebih tinggi. Dengan menggunakan perbaikan itu, Anda dapat memastikan bahwa jika objek dari class tersebut diserialisasi pada aplikasi yang menargetkan level API 23 atau lebih rendah, objek akan dibaca dengan benar oleh aplikasi yang menargetkan 24 atau 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() Sebelumnya versi Android menelan errno yang dikembalikan oleh truncate(), tetapi Android 10 akan menampilkan IOException. Jika Anda membutuhkan perilaku lama, Anda harus menggunakan kode native.