Seperti rilis sebelumnya, Android 15 menyertakan perubahan perilaku yang dapat 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 agar 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.
- Jenis layanan latar depan pemrosesan media baru
- Pembatasan pada penerima siaran
BOOT_COMPLETED
yang meluncurkan layanan latar depan
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:
- Minta layanan Anda mengimplementasikan metode
Service.onTimeout(int, int)
baru. Saat aplikasi menerima callback, pastikan untuk memanggilstopSelf()
dalam beberapa detik. (Jika Anda tidak langsung menghentikan aplikasi, sistem akan mengalami kegagalan.) - 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). - 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. - 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:
- Minta layanan Anda mengimplementasikan metode
Service.onTimeout(int, int)
baru. Saat aplikasi menerima callback, pastikan untuk memanggilstopSelf()
dalam beberapa detik. (Jika Anda tidak langsung menghentikan aplikasi, sistem akan mengalami kegagalan.) - 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). - 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. - 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:
dataSync
camera
mediaPlayback
phoneCall
mediaProjection
microphone
(pembatasan ini telah diterapkan untukmicrophone
sejak Android 14)
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 waktu 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()
danFormatter.format()
API berikut:String.format(String, Object[])
String.format(Locale, String, Object[])
Formatter.format(String, Object[])
Formatter.format(Locale, String, Object[])
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 menggunakanArrays.asList(...).toArray()
, jenis komponen array yang dihasilkan kini merupakanObject
—bukan jenis elemen array dasar. Jadi, kode berikut akan menampilkanClassCastException
:String[] elements = (String[]) Arrays.asList("one", "two").toArray();
Untuk kasus ini, untuk mempertahankan
String
sebagai jenis komponen dalam array yang dihasilkan, Anda dapat menggunakanCollection.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).yi
id
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 metodeRandom.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 denganRandom.nextInt()
.
Keamanan
Android 15 menyertakan perubahan yang mempromosikan 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 membuatPendingIntent
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.
Intent yang lebih aman
Android 15 memperkenalkan langkah-langkah keamanan baru untuk membuat intent lebih aman dan lebih kokoh. Perubahan ini bertujuan untuk mencegah potensi kerentanan dan penyalahgunaan intent yang dapat dieksploitasi oleh aplikasi berbahaya. Ada dua peningkatan utama pada keamanan intent di Android 15:
- Mencocokkan filter intent target: Intent yang menargetkan komponen tertentu harus cocok dengan spesifikasi filter intent target. Jika Anda mengirim intent untuk meluncurkan aktivitas aplikasi lain, komponen intent target harus diselaraskan dengan filter intent yang dideklarasikan aktivitas penerima.
- Intent harus memiliki tindakan: Intent tanpa tindakan tidak akan lagi cocok dengan filter intent apa pun. Artinya, intent yang digunakan untuk memulai aktivitas atau layanan harus memiliki tindakan yang ditentukan dengan jelas.
- Intent tertunda: Pembuat intent yang tertunda diperlakukan sebagai pengirim intent yang menyertakan, bukan pengirim intent yang tertunda
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 ditampilkan di layar penuh secara default di perangkat yang menjalankan Android 15 jika aplikasi menargetkan Android 15 (level API 35).
Ini adalah perubahan yang dapat menyebabkan gangguan yang mungkin berdampak negatif terhadap UI aplikasi Anda. Perubahan tersebut memengaruhi area UI berikut:
- Menu navigasi handel gestur
- Transparan secara default.
- Offset bawah dinonaktifkan sehingga konten digambar di belakang menu navigasi sistem kecuali inset diterapkan.
setNavigationBarColor
danR.attr#navigationBarColor
tidak digunakan lagi dan tidak memengaruhi navigasi gestur.setNavigationBarContrastEnforced
danR.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
danR.attr#navigationBarColor
disetel 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
danR.attr#navigationBarContrastEnforced
bernilai benar (true) 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 inset diterapkan.
setStatusBarColor
danR.attr#statusBarColor
tidak digunakan lagi dan tidak berpengaruh di Android 15.setStatusBarContrastEnforced
danR.attr#statusBarContrastEnforced
tidak digunakan lagi, tetapi masih berpengaruh di Android 15.
- Potongan layar
layoutInDisplayCutoutMode
dari jendela yang tidak mengambang harusLAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
.SHORT_EDGES
,NEVER
, danDEFAULT
ditafsirkan sebagaiALWAYS
sehingga pengguna tidak melihat batang Hitam yang disebabkan oleh potongan layar dan muncul dari tepi ke tepi.
Contoh berikut menunjukkan aplikasi sebelum dan sesudah menargetkan Android 15 (level API 35), serta sebelum dan sesudah menerapkan inset.
Yang harus diperiksa apakah aplikasi Anda sudah berada di layar penuh
Jika aplikasi Anda sudah bersifat edge-to-edge dan menerapkan inset, sebagian besar 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 menggunakanSHORT_EDGES
,NEVER
, atauDEFAULT
, bukanLAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
. Jika aplikasi Anda error saat peluncuran, hal ini mungkin disebabkan oleh layar pembuka. Anda dapat mengupgrade dependensi layar pembuka inti ke 1.2.0-alpha01 atau yang lebih baru, atau menetapkanwindow.attributes.layoutInDisplayCutoutMode = WindowManager.LayoutInDisplayCutoutMode.always
. - Mungkin ada layar dengan traffic yang lebih rendah dengan UI yang terhalang. Pastikan
layar yang kurang 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 tata letak layar penuh
Jika aplikasi Anda belum layar penuh, kemungkinan besar Anda akan terpengaruh. Selain skenario untuk aplikasi yang sudah layar penuh, Anda harus mempertimbangkan hal berikut:
- Jika aplikasi Anda menggunakan Komponen Material 3 (
androidx.compose.material3
) di compose, sepertiTopAppBar
,BottomAppBar
, danNavigationBar
, komponen ini mungkin 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 parameterwindowInsets
untuk menerapkan inset secara manual untukBottomAppBar
,TopAppBar
,BottomNavigation
, danNavigationRail
. Demikian pula, gunakan parametercontentWindowInsets
untukScaffold
. - Jika aplikasi Anda menggunakan tampilan dan Komponen Material
(
com.google.android.material
), sebagian besar Komponen Material berbasis tampilan sepertiBottomNavigationView
,BottomAppBar
,NavigationRailView
, atauNavigationView
, akan menangani inset dan tidak memerlukan pekerjaan tambahan. Namun, Anda perlu menambahkanandroid:fitsSystemWindows="true"
jika menggunakanAppBarLayout
. - Untuk composable kustom, terapkan inset secara manual sebagai padding. Jika
konten Anda berada dalam
Scaffold
, Anda dapat menggunakan inset menggunakan nilai paddingScaffold
. Jika tidak, terapkan padding menggunakan salah satuWindowInsets
. - Jika aplikasi Anda menggunakan tampilan dan
BottomSheet
,SideSheet
, atau penampung khusus, terapkan padding menggunakanViewCompat.setOnApplyWindowInsetsListener
. UntukRecyclerView
, terapkan padding menggunakan pemroses ini dan juga tambahkanclipToPadding="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
.
Resource tata letak layar penuh tambahan
Lihat panduan Tampilan Edge to Edge dan Edge to Edge Compose untuk pertimbangan tambahan terkait penerapan inset.
API yang tidak digunakan lagi
API berikut sekarang tidak digunakan lagi:
R.attr#enforceStatusBarContrast
R.attr#navigationBarColor
R.attr#navigationBarDividerColor
R.attr#statusBarColor
Window#getNavigationBarColor
Window#getNavigationBarDividerColor
Window#getStatusBarColor
Window#isStatusBarContrastEnforced
Window#setDecorFitsSystemWindows
Window#setNavigationBarColor
Window#setNavigationBarDividerColor
Window#setStatusBarColor
Window#setStatusBarContrastEnforced
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:
- Ukuran
Configuration.screenWidthDp
danscreenHeightDp
tidak lagi mengecualikan kolom sistem. Configuration.smallestScreenWidthDp
secara tidak langsung terpengaruh oleh perubahan padascreenWidthDp
danscreenHeightDp
.Configuration.orientation
secara tidak langsung terpengaruh oleh perubahan padascreenWidthDp
danscreenHeightDp
di perangkat yang berada di dekat persegi.Display.getSize(Point)
tidak langsung terpengaruh oleh perubahan padaConfiguration
. Fitur ini tidak digunakan lagi mulai level API 30.Display.getMetrics()
sudah bekerja seperti ini sejak API level 33.
Atribut eleganTextHeight ditetapkan secara default ke benar (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
.
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.
Tinggi baris default berbasis 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:
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:
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 baru.
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.