Perubahan perilaku: Aplikasi yang menargetkan Android 15 atau yang lebih tinggi

Seperti rilis sebelumnya, Android 15 menyertakan perubahan perilaku yang mungkin memengaruhi aplikasi Anda. Perubahan perilaku berikut ini berlaku khusus bagi aplikasi yang menargetkan Android 15 atau yang lebih tinggi. Jika aplikasi menargetkan Android 15 atau yang lebih tinggi, Anda harus memodifikasi aplikasi untuk mendukung perilaku ini dengan benar, jika memungkinkan.

Selain itu, pastikan Anda meninjau daftar perubahan perilaku yang memengaruhi semua aplikasi yang berjalan di Android 15, terlepas dari targetSdkVersion aplikasi Anda.

Fungsi inti

Android 15 memodifikasi atau memperluas berbagai kemampuan inti sistem Android.

Perubahan pada layanan latar depan

Kami melakukan perubahan berikut pada layanan latar depan dengan Android 15.

Perilaku waktu tunggu layanan latar depan sinkronisasi data

Android 15 memperkenalkan perilaku waktu tunggu baru ke dataSync untuk aplikasi yang menargetkan Android 15 atau yang lebih tinggi. Perilaku ini juga berlaku untuk jenis layanan latar depan mediaProcessing yang baru.

Sistem mengizinkan layanan dataSync aplikasi berjalan selama total 6 jam dalam periode 24 jam, setelah itu sistem akan memanggil metode Service.onTimeout(int, int) layanan yang sedang berjalan (diperkenalkan di Android 15). Saat ini, layanan memiliki beberapa detik untuk memanggil Service.stopSelf(). Saat Service.onTimeout() dipanggil, layanan tidak lagi dianggap sebagai layanan latar depan. Jika layanan tidak memanggil Service.stopSelf(), kegagalan akan terjadi dengan pesan error ini: " Layanan latar depan <fgs_type> tidak berhenti dalam waktu tunggunya: <component_name>". Di Beta 2, pesan kegagalan ditampilkan sebagai ANR, tetapi dalam rilis Beta mendatang, pesan kegagalan ini akan menampilkan pengecualian kustom.

Untuk menghindari masalah pada perubahan perilaku ini, Anda dapat melakukan satu atau beberapa hal berikut:

  1. Minta layanan Anda mengimplementasikan metode Service.onTimeout(int, int) baru. Saat aplikasi menerima callback, pastikan untuk memanggil stopSelf() dalam beberapa detik. (Jika Anda tidak langsung menghentikan aplikasi, sistem akan mengalami kegagalan.)
  2. Pastikan layanan dataSync aplikasi Anda tidak berjalan lebih dari total 6 jam dalam periode 24 jam (kecuali jika pengguna berinteraksi dengan aplikasi, menyetel ulang timer).
  3. Hanya mulai layanan latar depan dataSync sebagai hasil dari interaksi pengguna langsung; karena aplikasi berada di latar depan saat layanan dimulai, layanan Anda memiliki waktu enam jam penuh setelah aplikasi beralih ke latar belakang.
  4. Gunakan API alternatif, bukan layanan latar depan dataSync.

Jika layanan latar depan dataSync aplikasi Anda telah berjalan selama 6 jam dalam 24 terakhir, Anda tidak dapat memulai layanan latar depan dataSync lainnya kecuali jika pengguna telah membawa aplikasi Anda ke latar depan (yang mereset timer). Jika Anda mencoba memulai layanan latar depan dataSync lainnya, sistem akan menampilkan ForegroundServiceStartNotAllowedException dengan pesan error seperti "Batas waktu sudah habis untuk jenis layanan latar depan dataSync".

Jenis layanan latar depan pemrosesan media baru

Android 15 memperkenalkan jenis layanan latar depan baru, mediaProcessing. Jenis layanan ini cocok untuk operasi seperti transcoding file media. Misalnya, aplikasi media mungkin mendownload file audio dan perlu mengonversinya ke format lain sebelum memutarnya. Anda dapat menggunakan layanan latar depan mediaProcessing untuk memastikan konversi terus berlanjut meskipun aplikasi berada di latar belakang.

Sistem mengizinkan layanan mediaProcessing aplikasi berjalan selama total 6 jam dalam periode 24 jam, setelah itu sistem akan memanggil metode Service.onTimeout(int, int) layanan yang sedang berjalan (diperkenalkan di Android 15). Saat ini, layanan memiliki beberapa detik untuk memanggil Service.stopSelf(). Jika layanan tidak memanggil Service.stopSelf(), kegagalan akan terjadi dengan pesan error ini: "Layanan latar depan <fgs_type> tidak berhenti dalam waktu tunggunya: <component_name>". Di Beta 2, pesan kegagalan ditampilkan sebagai ANR, tetapi dalam rilis Beta mendatang, pesan kegagalan ini akan menampilkan pengecualian kustom.

Untuk menghindari ANR, Anda dapat melakukan salah satu hal berikut:

  1. Minta layanan Anda mengimplementasikan metode Service.onTimeout(int, int) baru. Saat aplikasi menerima callback, pastikan untuk memanggil stopSelf() dalam beberapa detik. (Jika Anda tidak langsung menghentikan aplikasi, sistem akan mengalami kegagalan.)
  2. Pastikan layanan mediaProcessing aplikasi Anda tidak berjalan lebih dari total 6 jam dalam periode 24 jam (kecuali jika pengguna berinteraksi dengan aplikasi, menyetel ulang timer).
  3. Hanya mulai layanan latar depan mediaProcessing sebagai hasil dari interaksi pengguna langsung; karena aplikasi berada di latar depan saat layanan dimulai, layanan Anda memiliki waktu enam jam penuh setelah aplikasi beralih ke latar belakang.
  4. Daripada menggunakan layanan latar depan mediaProcessing, gunakan API alternatif, seperti WorkManager.

Jika layanan latar depan mediaProcessing aplikasi telah berjalan selama 6 jam dalam 24 terakhir, Anda tidak dapat memulai layanan latar depan mediaProcessing lainnya kecuali pengguna telah membawa aplikasi ke latar depan (yang mereset timer). Jika Anda mencoba memulai layanan latar depan mediaProcessing lain, sistem akan menampilkan ForegroundServiceStartNotAllowedException dengan pesan error seperti "Time limit alreadyUjis untuk jenis layanan latar depan mediaProcessing".

Untuk mengetahui informasi selengkapnya tentang jenis layanan mediaProcessing, lihat Perubahan pada jenis layanan latar depan untuk Android 15: Pemrosesan media.

Pembatasan pada BOOT_COMPLETED penerima siaran yang meluncurkan layanan latar depan

Ada pembatasan baru pada penerima siaran BOOT_COMPLETED yang meluncurkan layanan latar depan. Penerima BOOT_COMPLETED tidak diizinkan meluncurkan jenis layanan latar depan berikut:

Jika penerima BOOT_COMPLETED mencoba meluncurkan salah satu jenis layanan latar depan tersebut, sistem akan menampilkan ForegroundServiceStartNotAllowedException.

Pembatasan dalam memulai layanan latar depan saat aplikasi memiliki izin SYSTEM_ALERT_WINDOW

Sebelumnya, jika memiliki izin SYSTEM_ALERT_WINDOW, aplikasi dapat meluncurkan layanan latar depan meskipun saat ini aplikasi berada di latar belakang (seperti yang dibahas dalam pengecualian dari pembatasan mulai latar belakang).

Jika aplikasi menargetkan Android 15, pengecualian ini kini lebih sempit. Aplikasi kini harus memiliki izin SYSTEM_ALERT_WINDOW dan juga memiliki jendela overlay yang terlihat. Artinya, aplikasi harus meluncurkan jendela TYPE_APPLICATION_OVERLAY terlebih dahulu dan jendela harus terlihat sebelum Anda memulai layanan latar depan.

Jika aplikasi Anda mencoba memulai layanan latar depan dari latar belakang tanpa memenuhi persyaratan baru ini (dan tidak memiliki pengecualian lain), sistem akan menampilkan ForegroundServiceStartNotAllowedException.

Jika aplikasi Anda mendeklarasikan izin SYSTEM_ALERT_WINDOW dan meluncurkan layanan latar depan dari latar belakang, aplikasi tersebut mungkin akan terpengaruh oleh perubahan ini. Jika aplikasi mendapatkan ForegroundServiceStartNotAllowedException, periksa urutan operasi aplikasi dan pastikan aplikasi Anda sudah memiliki jendela overlay aktif sebelum mencoba memulai layanan latar depan dari latar belakang. Anda dapat memeriksa apakah jendela overlay saat ini terlihat dengan memanggil View.getWindowVisibility(), atau mengganti View.onWindowVisibilityChanged() untuk mendapatkan notifikasi setiap kali visibilitas berubah.

Perubahan terkait kapan aplikasi dapat mengubah status global mode Jangan Ganggu

Aplikasi yang menargetkan Android 15 tidak dapat lagi mengubah status global atau kebijakan Jangan Ganggu (DND) di perangkat (baik dengan mengubah setelan pengguna atau menonaktifkan mode DND). Sebagai gantinya, aplikasi harus memberikan kontribusi AutomaticZenRule, yang digabungkan oleh sistem ke dalam kebijakan global dengan skema yang paling ketat-kebijakan-kemenangan yang sudah ada. Panggilan ke API yang ada dan sebelumnya memengaruhi status global (setInterruptionFilter, setNotificationPolicy) menyebabkan pembuatan atau pembaruan AutomaticZenRule implisit, yang diaktifkan dan dinonaktifkan bergantung pada siklus panggilan panggilan API tersebut.

Perlu diperhatikan bahwa perubahan ini hanya memengaruhi perilaku yang dapat diamati jika aplikasi memanggil setInterruptionFilter(INTERRUPTION_FILTER_ALL) dan mengharapkan panggilan tersebut menonaktifkan AutomaticZenRule yang sebelumnya diaktifkan oleh pemiliknya.

Perubahan OpenJDK 17

Android 15 melanjutkan pekerjaan memuat ulang library inti Android agar selaras dengan fitur dalam rilis OpenJDK LTS terbaru.

Salah satu perubahan berikut dapat memengaruhi kompatibilitas aplikasi untuk aplikasi yang menargetkan Android 15:

  • Perubahan pada API pemformatan string: Validasi indeks argumen, flag, lebar, dan presisi kini lebih ketat jika menggunakan String.format() dan Formatter.format() API berikut:

    Misalnya, pengecualian berikut dilempar saat menggunakan indeks argumen 0 (%0 dalam string format):

    IllegalFormatArgumentIndexException: Illegal format argument index = 0
    

    Dalam hal ini, masalah ini dapat diperbaiki menggunakan indeks argumen 1 (%1 dalam string format).

  • Perubahan pada jenis komponen Arrays.asList(...).toArray(): Saat menggunakan Arrays.asList(...).toArray(), jenis komponen array yang dihasilkan kini merupakan Object—bukan jenis elemen array dasar. Jadi, kode berikut akan menampilkan ClassCastException:

    String[] elements = (String[]) Arrays.asList("one", "two").toArray();
    

    Untuk kasus ini, untuk mempertahankan String sebagai jenis komponen dalam array yang dihasilkan, Anda dapat menggunakan Collection.toArray(Object[]):

    String[] elements = Arrays.asList("two", "one").toArray(new String[0]);
    
  • Perubahan pada penanganan kode bahasa: Saat menggunakan Locale API, kode bahasa untuk bahasa Ibrani, Yiddi, dan Indonesia tidak lagi dikonversi ke bentuk yang tidak digunakan lagi (Ibrani: iw, Yiddish: ji, dan Indonesia: in). Saat menentukan kode bahasa untuk salah satu lokal ini, gunakan kode dari ISO 639-1 (Ibrani: he, Yiddish: {10, dan Indonesia). yiid

  • Perubahan pada urutan int acak: Setelah perubahan yang dilakukan di https://bugs.openjdk.org/browse/JDK-8301574, metode Random.ints() berikut kini menampilkan urutan angka yang berbeda dengan metode Random.nextInt():

    Umumnya, perubahan ini tidak akan menghasilkan perilaku yang dapat menyebabkan gangguan aplikasi, tetapi kode Anda seharusnya tidak mengharapkan urutan yang dihasilkan dari metode Random.ints() untuk cocok dengan Random.nextInt().

Keamanan

Android 15 menyertakan perubahan yang mendukung keamanan sistem untuk membantu melindungi aplikasi dan pengguna dari aplikasi berbahaya.

Peluncuran aktivitas latar belakang yang aman

Android 15 melindungi pengguna dari aplikasi berbahaya dan memberi mereka kontrol yang lebih besar atas perangkat mereka dengan menambahkan perubahan yang mencegah aplikasi latar belakang berbahaya membawa aplikasi lain ke latar depan, meningkatkan hak istimewa mereka, dan menyalahgunakan interaksi pengguna. Peluncuran aktivitas latar belakang telah dibatasi sejak Android 10 (API level 29).

Memblokir aplikasi yang tidak cocok dengan UID teratas di tumpukan agar tidak meluncurkan aktivitas

Aplikasi berbahaya dapat meluncurkan aktivitas aplikasi lain dalam tugas yang sama, lalu menempatkan dirinya di atasnya, menciptakan ilusi menjadi aplikasi tersebut. Serangan "pembajakan tugas" ini mengabaikan batasan peluncuran latar belakang saat ini karena semuanya terjadi dalam tugas terlihat yang sama. Untuk mengurangi risiko ini, Android 15 menambahkan flag yang memblokir aplikasi yang tidak cocok dengan UID teratas pada stack agar tidak meluncurkan aktivitas. Untuk ikut serta dalam semua aktivitas aplikasi Anda, perbarui atribut allowCrossUidActivitySwitchFromBelow di file AndroidManifest.xml aplikasi Anda:

<application android:allowCrossUidActivitySwitchFromBelow="false" >

Langkah-langkah keamanan baru akan aktif jika semua hal berikut berlaku:

  • Aplikasi yang menjalankan peluncuran menargetkan Android 15.
  • Aplikasi di atas stack tugas menargetkan Android 15.
  • Semua aktivitas yang terlihat telah ikut serta dalam perlindungan baru

Jika langkah-langkah keamanan diaktifkan, aplikasi dapat kembali ke beranda, bukan aplikasi yang terakhir terlihat, jika menyelesaikan tugasnya sendiri.

Perubahan lainnya

Selain batasan untuk pencocokan UID, perubahan lain berikut juga disertakan:

  • Ubah kreator PendingIntent untuk memblokir peluncuran aktivitas latar belakang secara default. Hal ini membantu mencegah aplikasi membuat PendingIntent secara tidak sengaja yang dapat disalahgunakan oleh pelaku kejahatan.
  • Jangan membawa aplikasi ke latar depan kecuali jika pengirim PendingIntent mengizinkannya. Perubahan ini bertujuan mencegah aplikasi berbahaya menyalahgunakan kemampuan memulai aktivitas di latar belakang. Secara default, aplikasi tidak diizinkan untuk membawa stack tugas ke latar depan kecuali jika pembuat mengizinkan hak istimewa peluncuran aktivitas latar belakang atau pengirim memiliki hak istimewa peluncuran aktivitas latar belakang.
  • Mengontrol cara aktivitas teratas pada stack tugas dapat menyelesaikan tugasnya. Jika aktivitas teratas menyelesaikan tugas, Android akan kembali ke tugas mana pun yang terakhir kali aktif. Selain itu, jika aktivitas bukan atas menyelesaikan tugasnya, Android akan kembali ke layar utama dan tidak akan memblokir penyelesaian aktivitas bukan atas ini.
  • Cegah peluncuran aktivitas arbitrer dari aplikasi lain ke tugas Anda sendiri. Perubahan ini mencegah aplikasi berbahaya dari melakukan phishing pengguna dengan membuat aktivitas yang tampaknya berasal dari aplikasi lain.
  • Blokir jendela yang tidak terlihat agar tidak dipertimbangkan untuk peluncuran aktivitas latar belakang. Hal ini membantu mencegah aplikasi berbahaya menyalahgunakan peluncuran aktivitas latar belakang untuk menampilkan konten yang tidak diinginkan atau berbahaya kepada pengguna.

Niat yang lebih aman

Android 15 memperkenalkan langkah-langkah keamanan baru untuk membuat intent lebih aman dan lebih kokoh. Perubahan ini dimaksudkan untuk mencegah potensi kerentanan dan penyalahgunaan intent yang dapat dieksploitasi oleh aplikasi berbahaya. Ada dua peningkatan utama pada keamanan intent di Android 15:

  • Cocok dengan filter intent target: Intent yang menargetkan komponen tertentu harus cocok dengan spesifikasi filter intent target secara akurat. Jika Anda mengirim intent untuk meluncurkan aktivitas aplikasi lain, komponen intent target harus menyelaraskan dengan filter intent yang dideklarasikan aktivitas penerima.
  • Intent harus memiliki tindakan: Intent tanpa tindakan tidak akan cocok lagi dengan filter intent apa pun. Artinya, intent yang digunakan untuk memulai aktivitas atau layanan harus memiliki tindakan yang ditentukan dengan jelas.

Kotlin


fun onCreate() {
    StrictMode.setVmPolicy(VmPolicy.Builder()
        .detectUnsafeIntentLaunch()
        .build()
    )
}

Java


public void onCreate() {
    StrictMode.setVmPolicy(new VmPolicy.Builder()
            .detectUnsafeIntentLaunch()
            .build());
}

Pengalaman pengguna dan UI sistem

Android 15 menyertakan beberapa perubahan yang dimaksudkan untuk menciptakan pengalaman pengguna yang lebih konsisten dan intuitif.

Perubahan inset jendela

Ada dua perubahan terkait inset jendela di Android 15: tata letak layar penuh diterapkan secara default, dan ada juga perubahan konfigurasi, seperti konfigurasi default kolom sistem.

Penerapan menyeluruh

Aplikasi bersifat layar penuh secara default di perangkat yang menjalankan Android 15 jika aplikasi menargetkan Android 15.

Aplikasi yang menargetkan Android 14 dan tidak layar penuh di perangkat Android 15.


Aplikasi yang menargetkan Android 15 dan dibuat dari tepi ke tepi di perangkat Android 15. Aplikasi ini sebagian besar menggunakan Komponen Compose Material 3 yang otomatis menerapkan inset. Layar ini tidak terkena dampak negatif oleh penerapan layar penuh Android 15.

Ini adalah perubahan yang dapat menyebabkan gangguan yang mungkin berdampak negatif pada UI aplikasi Anda. Perubahan ini memengaruhi area UI berikut:

  • Menu navigasi tuas gestur
    • Transparan secara default.
    • Offset bawah dinonaktifkan sehingga konten digambar di belakang menu navigasi sistem kecuali jika inset diterapkan.
    • setNavigationBarColor dan R.attr#navigationBarColor tidak digunakan lagi dan tidak memengaruhi navigasi gestur.
    • setNavigationBarContrastEnforced dan R.attr#navigationBarContrastEnforced tetap tidak berpengaruh pada navigasi gestur.
  • Navigasi 3 tombol
    • Opasitas ditetapkan ke 80% secara default, dengan warna yang mungkin cocok dengan latar belakang jendela.
    • Offset bawah dinonaktifkan sehingga konten digambar di belakang menu navigasi sistem kecuali inset diterapkan.
    • setNavigationBarColor dan R.attr#navigationBarColor ditetapkan agar cocok dengan latar belakang jendela secara default. Latar belakang jendela harus berupa drawable warna agar default ini dapat diterapkan. API ini tidak digunakan lagi, tetapi terus memengaruhi navigasi 3 tombol.
    • setNavigationBarContrastEnforced dan R.attr#navigationBarContrastEnforced bernilai benar secara default, yang menambahkan latar belakang buram 80% di navigasi 3 tombol.
  • Status bar
    • Transparan secara default.
    • Offset atas dinonaktifkan sehingga konten digambar di belakang status bar kecuali jika inset diterapkan.
    • setStatusBarColor dan R.attr#statusBarColor tidak digunakan lagi dan tidak berpengaruh di Android 15.
    • setStatusBarContrastEnforced dan R.attr#statusBarContrastEnforced tidak digunakan lagi, tetapi masih memiliki efek di Android 15.
  • Potongan layar
    • layoutInDisplayCutoutMode jendela yang tidak mengambang harus LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS. SHORT_EDGES, NEVER, dan DEFAULT ditafsirkan sebagai ALWAYS sehingga pengguna tidak melihat kotak Hitam yang disebabkan oleh potongan layar dan akan muncul dari tepi ke tepi.

Contoh berikut menunjukkan aplikasi sebelum dan sesudah menargetkan Android 15, serta sebelum dan setelah menerapkan inset.

Aplikasi yang menargetkan Android 14 dan tidak layar penuh di perangkat Android 15.
Aplikasi yang menargetkan Android 15 dan dibuat dari tepi ke tepi di perangkat Android 15. Namun, banyak elemen kini terhalang oleh status bar, menu navigasi 3 tombol, atau potongan layar karena penerapan layar penuh Android 15. UI yang terhalang mencakup panel aplikasi atas Material 2, tombol tindakan mengambang, dan item daftar.
Aplikasi yang menargetkan Android 15 memiliki layar penuh di perangkat Android 15 dan menerapkan inset agar UI tidak terhalang.
Yang harus diperiksa apakah aplikasi Anda sudah diatur dari tepi ke tepi

Jika aplikasi Anda sudah dari tepi ke tepi dan menerapkan inset, sebagian besar Anda tidak akan terpengaruh, kecuali dalam skenario berikut. Namun, meskipun Anda merasa tidak terpengaruh, sebaiknya uji aplikasi Anda.

  • Anda memiliki jendela yang tidak mengambang, seperti Activity yang menggunakan SHORT_EDGES, NEVER, atau DEFAULT, bukan LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS. Jika aplikasi Anda error saat diluncurkan, ini mungkin disebabkan oleh layar pembuka. Anda dapat mengupgrade dependensi layar pembuka core ke 1.2.0-alpha01 atau yang lebih baru, atau menetapkan window.attributes.layoutInDisplayCutoutMode = WindowManager.LayoutInDisplayCutoutMode.always.
  • Mungkin ada layar dengan traffic yang lebih rendah dengan UI yang terhalang. Pastikan layar yang jarang dikunjungi ini tidak memiliki UI yang terhalang. Layar dengan traffic yang lebih rendah mencakup:
    • Layar orientasi atau login
    • Halaman setelan
Yang harus diperiksa jika aplikasi Anda belum diatur dari tepi ke tepi

Jika aplikasi Anda belum menggunakan layar penuh, kemungkinan besar Anda akan terpengaruh. Selain skenario untuk aplikasi yang sudah tata letak layar penuh, Anda harus mempertimbangkan hal-hal berikut:

  • Jika aplikasi Anda menggunakan Komponen Material 3 ( androidx.compose.material3) di compose, seperti TopAppBar, BottomAppBar, dan NavigationBar, komponen ini kemungkinan tidak terpengaruh karena otomatis menangani inset.
  • Jika aplikasi Anda menggunakan Komponen Material 2 ( androidx.compose.material) di Compose, komponen ini tidak otomatis menangani inset. Namun, Anda bisa mendapatkan akses ke inset dan menerapkannya secara manual. Di androidx.compose.material 1.6.0 dan yang lebih baru, gunakan parameter windowInsets untuk menerapkan inset secara manual untuk BottomAppBar, TopAppBar, BottomNavigation, dan NavigationRail. Demikian pula, gunakan parameter contentWindowInsets untuk Scaffold.
  • Jika aplikasi Anda menggunakan tampilan dan Komponen Material (com.google.android.material), sebagian besar Komponen Material berbasis tampilan seperti BottomNavigationView, BottomAppBar, NavigationRailView, atau NavigationView, akan menangani inset dan tidak memerlukan pekerjaan tambahan. Namun, Anda perlu menambahkan android:fitsSystemWindows="true" jika menggunakan AppBarLayout.
  • Untuk composable kustom, terapkan inset secara manual sebagai padding. Jika konten berada dalam Scaffold, Anda dapat menggunakan inset menggunakan nilai padding Scaffold. Jika tidak, terapkan padding menggunakan salah satu dari WindowInsets.
  • Jika aplikasi Anda menggunakan tampilan dan BottomSheet, SideSheet, atau penampung kustom, terapkan padding menggunakan ViewCompat.setOnApplyWindowInsetsListener. Untuk RecyclerView, terapkan padding menggunakan pemroses ini dan tambahkan juga clipToPadding="false".
Yang harus diperiksa apakah aplikasi Anda harus menawarkan perlindungan latar belakang kustom

Jika aplikasi Anda harus menawarkan perlindungan latar belakang kustom untuk navigasi 3 tombol atau status bar, aplikasi Anda harus menempatkan composable atau tampilan di belakang kolom sistem menggunakan WindowInsets.Type#tappableElement() untuk mendapatkan tinggi menu navigasi 3 tombol atau WindowInsets.Type#statusBars.

Referensi tata letak lainnya

Lihat panduan Tampilan Edge to Edge dan Edge to Edge Compose untuk pertimbangan tambahan terkait penerapan inset.

API yang tidak digunakan lagi

API berikut kini tidak digunakan lagi:

Konfigurasi stabil

Jika aplikasi Anda menargetkan Android 15 atau yang lebih tinggi, Configuration tidak lagi mengecualikan kolom sistem. Jika menggunakan ukuran layar dalam class Configuration untuk penghitungan tata letak, Anda harus menggantinya dengan alternatif yang lebih baik seperti ViewGroup, WindowInsets, atau WindowMetricsCalculator yang sesuai, tergantung kebutuhan Anda.

Configuration telah tersedia sejak API 1. ID ini biasanya diperoleh dari Activity.onConfigurationChanged. Ini memberikan informasi seperti kepadatan, orientasi, dan ukuran jendela. Salah satu karakteristik penting tentang ukuran jendela yang ditampilkan dari Configuration adalah bahwa sebelumnya kolom sistem tersebut dikecualikan.

Ukuran konfigurasi biasanya digunakan untuk pemilihan resource, seperti /res/layout-h500dp, dan ini masih merupakan kasus penggunaan yang valid. Namun, menggunakannya untuk penghitungan tata letak selalu tidak disarankan. Jika Anda melakukannya, Anda harus meninggalkannya sekarang. Anda harus mengganti penggunaan Configuration dengan sesuatu yang lebih cocok bergantung pada kasus penggunaan Anda.

Jika Anda menggunakannya untuk menghitung tata letak, gunakan ViewGroup yang sesuai, seperti CoordinatorLayout atau ConstraintLayout. Jika Anda menggunakannya untuk menentukan tinggi menu navigasi sistem, gunakan WindowInsets. Jika ingin mengetahui ukuran jendela aplikasi saat ini, gunakan computeCurrentWindowMetrics.

Daftar berikut menjelaskan kolom yang terpengaruh oleh perubahan ini:

Atribut eleganTextHeight ditetapkan secara default ke true

Untuk aplikasi yang menargetkan Android 15, atribut elegantTextHeight TextView menjadi true secara default, yang menggantikan font ringkas yang digunakan secara default dengan beberapa skrip yang memiliki metrik vertikal besar dengan metrik yang jauh lebih mudah dibaca. Font ringkas diperkenalkan untuk mencegah tata letak rusak; Android 13 (API level 33) mencegah banyak kerusakan ini dengan memungkinkan tata letak teks meregangkan tinggi vertikal menggunakan atribut fallbackLineSpacing.

Di Android 15, font yang ringkas masih tetap ada di sistem sehingga aplikasi Anda dapat menetapkan elegantTextHeight ke false untuk mendapatkan perilaku yang sama seperti sebelumnya, tetapi mungkin tidak akan didukung dalam rilis mendatang. Jadi, jika aplikasi Anda mendukung skrip berikut: Arab, Lao, Myanmar, Tamil, Gujarati, Kannada, Malayalam, Odia, Telugu, atau Thailand, uji aplikasi Anda dengan menetapkan elegantTextHeight ke true.

Perilaku elegantTextHeight untuk aplikasi yang menargetkan Android 14 (API level 34) dan yang lebih rendah.
Perilaku elegantTextHeight untuk aplikasi yang menargetkan Android 15.

Perubahan lebar TextView untuk bentuk huruf yang kompleks

Pada versi Android sebelumnya, beberapa font atau bahasa tulis tangan yang memiliki pembentukan kompleks dapat menggambar huruf di area karakter sebelumnya atau berikutnya. Terkadang, huruf seperti itu terpotong di posisi awal atau akhir. Mulai Android 15, TextView mengalokasikan lebar untuk menggambar ruang yang cukup untuk huruf tersebut dan memungkinkan aplikasi meminta padding tambahan ke kiri agar tidak terpotong.

Karena perubahan ini memengaruhi cara TextView menentukan lebar, TextView mengalokasikan lebih banyak lebar secara default jika aplikasi menargetkan Android 15 atau yang lebih tinggi. Anda dapat mengaktifkan atau menonaktifkan perilaku ini dengan memanggil API setUseBoundsForWidth pada TextView.

Karena penambahan padding kiri dapat menyebabkan ketidaksejajaran untuk tata letak yang ada, padding tidak ditambahkan secara default bahkan untuk aplikasi yang menargetkan Android 15 atau yang lebih tinggi. Namun, Anda dapat menambahkan padding tambahan untuk mencegah pemotongan dengan memanggil setShiftDrawingOffsetForStartOverhang.

Contoh berikut menunjukkan bagaimana perubahan ini dapat meningkatkan tata letak teks untuk beberapa font dan bahasa.

Tata letak standar untuk teks bahasa Inggris dalam font kursif. Beberapa huruf terpotong. Berikut adalah XML yang sesuai:

<TextView
    android:fontFamily="cursive"
    android:text="java" />
Tata letak untuk teks bahasa Inggris yang sama dengan lebar dan padding tambahan. Berikut adalah XML yang sesuai:

<TextView
    android:fontFamily="cursive"
    android:text="java"
    android:useBoundsForWidth="true"
    android:shiftDrawingOffsetForStartOverhang="true" />
Tata letak standar untuk teks Thailand. Beberapa huruf terpotong. Berikut adalah XML yang sesuai:

<TextView
    android:text="คอมพิวเตอร์" />
Tata letak untuk teks Thailand yang sama dengan lebar dan padding tambahan. Berikut adalah XML yang sesuai:

<TextView
    android:text="คอมพิวเตอร์"
    android:useBoundsForWidth="true"
    android:shiftDrawingOffsetForStartOverhang="true" />

Tinggi baris default yang peka lokal untuk EditText

Pada versi Android sebelumnya, tata letak teks merentangkan tinggi teks untuk memenuhi tinggi baris font yang cocok dengan lokalitas saat ini. Misalnya, jika konten menggunakan bahasa Jepang, karena tinggi baris font Jepang sedikit lebih besar daripada salah satu font Latin, tinggi teks menjadi sedikit lebih besar. Namun, terlepas dari perbedaan tinggi baris ini, elemen EditText memiliki ukuran yang seragam, terlepas dari lokalitas yang digunakan, seperti yang diilustrasikan dalam gambar berikut:

Tiga kotak yang mewakili elemen EditText yang dapat berisi teks dari bahasa Inggris (en), Jepang (ja), dan Burma (my). Tinggi EditText sama, meskipun bahasa ini memiliki tinggi baris yang berbeda satu sama lain.

Untuk aplikasi yang menargetkan Android 15, tinggi baris minimum sekarang disediakan untuk EditText agar cocok dengan font referensi untuk Lokalitas yang ditentukan, seperti yang ditunjukkan pada gambar berikut:

Tiga kotak yang mewakili elemen EditText yang dapat berisi teks dari bahasa Inggris (en), Jepang (ja), dan Burma (my). Tinggi EditText kini menyertakan ruang untuk mengakomodasi tinggi baris default untuk font bahasa ini.

Jika diperlukan, aplikasi Anda dapat memulihkan perilaku sebelumnya dengan menentukan atribut useLocalePreferredLineHeightForMinimum ke false, dan aplikasi Anda dapat menetapkan metrik vertikal minimum kustom menggunakan setMinimumFontMetrics API di Kotlin dan Java.

Kamera dan media

Android 15 melakukan perubahan berikut pada perilaku kamera dan media untuk aplikasi yang menargetkan Android 15 atau yang lebih tinggi.

Batasan dalam meminta fokus audio

Aplikasi yang menargetkan Android 15 harus menjadi aplikasi teratas atau menjalankan layanan latar depan terkait audio agar dapat meminta fokus audio. Jika aplikasi mencoba meminta fokus saat tidak memenuhi salah satu persyaratan ini, panggilan akan menampilkan AUDIOFOCUS_REQUEST_FAILED.

Layanan latar depan dianggap terkait audio jika jenisnya adalah mediaPlayback, camera, microphone, atau phoneCall.

Anda dapat mempelajari fokus audio lebih lanjut di Mengelola fokus audio.

Pembatasan non-SDK yang diperbarui

Android 15 menyertakan daftar terbaru antarmuka non-SDK yang dibatasi berdasarkan kolaborasi dengan developer Android dan pengujian internal terbaru. Jika memungkinkan, kami akan memastikan ketersediaan alternatif publik sebelum membatasi antarmuka non-SDK.

Jika aplikasi Anda tidak menargetkan Android 15, beberapa perubahan ini mungkin tidak langsung memengaruhi Anda. Namun, meskipun aplikasi Anda dapat mengakses beberapa antarmuka non-SDK bergantung pada level API 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 Anda mulai merencanakan migrasi ke alternatif SDK. Meskipun demikian, kami memahami 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 dalam aplikasi Anda, sebaiknya minta API publik baru.

Untuk mempelajari perubahan dalam rilis Android ini lebih lanjut, baca Pembaruan pembatasan antarmuka non-SDK di Android 15. Untuk mempelajari lebih lanjut antarmuka non-SDK secara umum, baca Pembatasan antarmuka non-SDK.