Perubahan perilaku: aplikasi yang menargetkan API 29+

Android 10 menghadirkan perubahan perilaku sistem terbaru yang mungkin memengaruhi aplikasi Anda. Perubahan yang tercantum dalam dokumen ini hanya berlaku untuk aplikasi yang menargetkan API 29 atau yang lebih tinggi. Jika aplikasi Anda menetapkan targetSdkVersion ke "29" atau yang lebih tinggi, sebaiknya Anda memodifikasi aplikasi agar mendukung perilaku ini dengan benar, jika memungkinkan.

Pastikan juga meninjau daftar perubahan perilaku yang memengaruhi semua aplikasi yang berjalan di Android 10.

Pembaruan pada pembatasan antarmuka non-SDK

Untuk membantu memastikan stabilitas dan kompatibilitas aplikasi, platform akan mulai membatasi antarmuka non-SDK yang bisa 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 nantinya tidak menargetkan Android 10 (API level 29), beberapa perubahan ini mungkin tidak langsung memengaruhi Anda. Namun, selagi bisa menggunakan antarmuka non-SDK yang merupakan bagian dari greylist (tergantung pada level API target aplikasi), penggunaan metode atau kolom non-SDK apa pun akan cukup berisiko merusak aplikasi Anda.

Jika tidak yakin apakah aplikasi Anda menggunakan antarmuka non-SDK atau tidak, Anda bisa menguji aplikasi untuk mencari tahu. Jika aplikasi Anda mengandalkan antarmuka non-SDK, sebaiknya Anda mulai merencanakan migrasi ke alternatif SDK. Namun demikian, kami memahami bahwa beberapa aplikasi memiliki kasus penggunaan yang valid untuk menggunakan antarmuka non-SDK. Jika tidak bisa menemukan cara selain penggunaan antarmuka non-SDK untuk fitur dalam aplikasi Anda, silakan minta API publik baru.

Untuk mempelajari lebih lanjut, lihat Update pada pembatasan antarmuka non-SDK di Android 10, dan lihat Pembatasan pada antarmuka non-SDK.

Memori bersama

Ashmem telah mengubah format peta dalvik di /proc/<pid>/maps, dan hal ini memengaruhi aplikasi yang secara langsung mengurai file peta tersebut. Developer aplikasi harus menguji format /proc/<pid>/maps pada perangkat yang menjalankan Android 10 atau yang lebih tinggi dan menguraikannya jika aplikasi bergantung pada format peta dalvik.

Aplikasi yang menargetkan Android 10 tidak dapat menggunakan ashmem (/dev/ashmem) secara langsung dan harus mengakses memori bersama melalui class ASharedMemory pada NDK. Selain itu, aplikasi tidak bisa membuat IOCTL langsung ke deskriptor file ashmem yang ada dan harus menggunakan class ASharedMemory pada NDK atau Android Java API untuk membuat region memori bersama. Perubahan ini meningkatkan keamanan dan keandalan saat menggunakan memori bersama, sehingga meningkatkan performa dan keamanan Android secara keseluruhan.

Izin eksekusi dihapus untuk direktori utama aplikasi

Aplikasi tidak tepercaya yang menargetkan Android 10 tidak bisa memanggil exec() pada file dalam direktori utama aplikasi. Eksekusi file dari direktori utama aplikasi yang bisa ditulis ini merupakan pelanggaran W^X. Aplikasi hanya boleh memuat kode biner yang tersemat dalam file APK aplikasi.

Selain itu, aplikasi yang menargetkan Android 10 tidak bisa mengubah kode yang bisa dieksekusi dalam memori dari file yang telah dibuka dengan dlopen(). File ini termasuk file objek bersama (.so) apa pun yang berisi relokasi teks.

Android runtime hanya menerima file OAT yang dihasilkan sistem

Android runtime (ART) tidak lagi memanggil dex2oat dari proses aplikasi. Perubahan ini berarti bahwa ART hanya akan menerima file OAT yang dibuat oleh sistem.

Memberlakukan ketepatan AOT dalam ART

Sebelumnya, kompilasi ahead-of-time (AOT) yang dijalankan oleh Android Runtime (ART) bisa menyebabkan error runtime jika lingkungan classpath tidak sama pada waktu kompilasi dan waktu proses. Android 10 dan yang lebih tinggi selalu mewajibkan konteks lingkungan ini sama sehingga menyebabkan perubahan perilaku berikut:

  • Pemuat class kustom — yaitu pemuat class yang ditulis oleh aplikasi, tidak seperti pemuat class dari paket dalvik.system — tidak dikompilasi AOT Hal ini karena ART tidak bisa mengetahui implementasi pencarian class yang disesuaikan saat runtime.
  • File dex sekunder — yaitu file dex yang dimuat secara manual oleh aplikasi yang tidak berada di APK utama — dikompilasi AOT di latar belakang. Hal ini karena kompilasi penggunaan pertama mungkin terlalu mahal, menyebabkan latensi yang tidak diinginkan sebelum eksekusi. Perlu diketahui, kami merekomendasikan agar aplikasi menggunakan pemisahan dan beralih dari file dex sekunder.
  • Library bersama di Android (entri <library> dan <uses-library> di manifes Android) diimplementasikan menggunakan hierarki pemuat class yang berbeda dengan yang digunakan pada versi platform sebelumnya.

Perubahan izin untuk intent layar penuh

Aplikasi yang menargetkan Android 10 atau versi lebih tinggi dan menggunakan notifikasi dengan intent layar penuh harus meminta izin USE_FULL_SCREEN_INTENT di file manifes aplikasinya. Ini adalah izin normal sehingga sistem akan otomatis memberikannya ke aplikasi yang meminta.

Jika aplikasi yang menargetkan Android 10 atau yang lebih tinggi berusaha membuat notifikasi dengan intent layar penuh tanpa meminta izin yang diperlukan, sistem akan mengabaikan intent layar penuh dan mengeluarkan pesan log berikut:

    Package your-package-name: Use of fullScreenIntent requires the USE_FULL_SCREEN_INTENT permission
    

Dukungan untuk perangkat foldable

Android 10 menghadirkan perubahan untuk mendukung perangkat foldable dan perangkat berlayar besar.

Ketika aplikasi berjalan pada Android 10, metode onResume() dan onPause() akan berfungsi secara berbeda. Saat beberapa aplikasi muncul bersamaan dalam mode multi-aplikasi atau multi-tampilan, semua aktivitas teratas yang dapat difokuskan dalam tumpukan yang terlihat akan berstatus dilanjutkan, tetapi hanya satu di antaranya, yaitu aktivitas "dilanjutkan teratas", yang sebenarnya mendapatkan fokus. Saat berjalan pada versi sebelum Android 10, hanya satu aktivitas dalam sistem yang bisa dilanjutkan pada satu waktu, semua aktivitas lain yang terlihat akan dijeda.

Jangan keliru memahami antara aktivitas "fokus" dan "prioritas tinggi untuk dilanjutkan". Sistem menetapkan prioritas ke aktivitas berdasarkan urutan z untuk memberikan prioritas lebih tinggi pada aktivitas yang terakhir digunakan pengguna. Aktivitas bisa menjadi prioritas utama untuk dilanjutkan, tetapi tidak memiliki fokus (misalnya, jika menu notifikasi diperluas).

Di Android 10 (API level 29) dan versi selanjutnya, Anda dapat berlangganan callback onTopResumedActivityChanged() untuk mendapat notifikasi ketika aktivitas mendapatkan atau kehilangan prioritas utama untuk dilanjutkan. Ini setara dengan status yang dilanjutkan sebelum versi Android 10 dan berguna sebagai petunjuk apakah aplikasi menggunakan resource khusus atau tunggal yang mungkin perlu dibagikan ke aplikasi lainnya.

Perilaku atribut manifes resizeableActivity juga berubah. Jika aplikasi ditetapkan ke resizeableActivity=false di Android 10 (API level 29) atau yang lebih baru, aplikasi mungkin berada dalam mode kompatibilitas saat ukuran layar yang tersedia berubah, atau jika aplikasi berpindah dari satu layar ke layar lainnya.

Aplikasi dapat menggunakan atribut android:minAspectRatio, yang diperkenalkan di Android 10, untuk menunjukkan rasio layar yang didukung aplikasi Anda.

Dimulai di versi 3.5, fitur emulator Android Studio mencakup perangkat virtual 7.3" dan 8" untuk menguji kode Anda dengan layar yang lebih besar.

Untuk informasi lebih lanjut, lihat Membuat aplikasi untuk Perangkat Foldable.

Perubahan java.io.FileChannel.map()

Dimulai di Android 10, FileChannel.map() tidak didukung untuk file yang bukan standar, seperti /dev/zero, dengan ukuran yang tidak dapat diubah menggunakan truncate(). Versi Android sebelumnya menggunakan errno yang ditampilkan truncate(), tetapi Android 10 akan menampilkan IOException. Jika memerlukan perilaku lama, Anda harus menggunakan kode native.