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 Anda menargetkan Android 15 atau yang lebih tinggi, Anda harus memodifikasi aplikasi untuk mendukung perilaku ini dengan benar, jika berlaku.
Pastikan Anda meninjau daftar perubahan perilaku yang memengaruhi semua aplikasi
yang berjalan di Android 15, terlepas dari targetSdkVersion
aplikasi Anda.
Fungsi inti
Android 15 mengubah atau memperluas berbagai kemampuan inti sistem Android.
Perubahan pada layanan latar depan
We are making the following changes to foreground services with Android 15.
- Data sync foreground service timeout behavior
- New media processing foreground service type
- Restrictions on
BOOT_COMPLETED
broadcast receivers launching foreground services - Restrictions on starting foreground services while an app holds the
SYSTEM_ALERT_WINDOW
permission
Data sync foreground service timeout behavior
Android 15 memperkenalkan perilaku waktu tunggu baru ke dataSync
untuk aplikasi yang menargetkan
Android 15 (API level 35) 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 berjalan (diperkenalkan di Android
15). Saat ini, layanan memiliki waktu beberapa detik untuk memanggil
Service.stopSelf()
. Saat Service.onTimeout()
dipanggil, layanan tidak lagi dianggap sebagai layanan latar depan. Jika layanan tidak
memanggil Service.stopSelf()
, sistem akan menampilkan pengecualian internal. Pengecualian
akan dicatat ke dalam log di Logcat dengan pesan berikut:
Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type dataSync did not stop within its timeout: [component name]"
Untuk menghindari masalah dengan perubahan perilaku ini, Anda dapat melakukan satu atau beberapa hal berikut:
- Minta layanan Anda menerapkan metode
Service.onTimeout(int, int)
baru. Saat aplikasi Anda menerima callback, pastikan untuk memanggilstopSelf()
dalam beberapa detik. (Jika Anda tidak segera menghentikan aplikasi, sistem akan menghasilkan kegagalan.) - Pastikan layanan
dataSync
aplikasi Anda tidak berjalan selama lebih dari 6 jam dalam periode 24 jam (kecuali jika pengguna berinteraksi dengan aplikasi, mereset timer). - Hanya mulai layanan latar depan
dataSync
sebagai hasil dari interaksi pengguna langsung; karena aplikasi Anda berada di latar depan saat layanan dimulai, layanan Anda memiliki waktu enam jam penuh setelah aplikasi beralih ke latar belakang. - Sebagai ganti menggunakan layanan latar depan
dataSync
, gunakan API alternatif.
Jika layanan latar depan dataSync
aplikasi Anda telah berjalan selama 6 jam dalam 24
jam terakhir, Anda tidak dapat memulai layanan latar depan dataSync
lain kecuali pengguna
telah memindahkan 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".
Pengujian
Untuk menguji perilaku aplikasi, Anda dapat mengaktifkan waktu tunggu sinkronisasi data meskipun aplikasi
tidak menargetkan Android 15 (asalkan aplikasi berjalan di perangkat
Android 15). Untuk mengaktifkan waktu tunggu, jalankan perintah adb
berikut:
adb shell am compat enable FGS_INTRODUCE_TIME_LIMITS your-package-name
Anda juga dapat menyesuaikan periode waktu tunggu, untuk memudahkan pengujian perilaku
aplikasi saat batas tercapai. Untuk menetapkan periode waktu tunggu baru, jalankan perintah adb
berikut:
adb shell device_config put activity_manager data_sync_fgs_timeout_duration duration-in-milliseconds
New media processing foreground service type
Android 15 memperkenalkan jenis layanan latar depan baru, mediaProcessing
. Jenis
layanan ini sesuai untuk operasi seperti melakukan 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 berlanjut bahkan saat 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 berjalan (diperkenalkan di Android
15). Saat ini, layanan memiliki waktu beberapa detik untuk memanggil
Service.stopSelf()
. Jika layanan tidak
memanggil Service.stopSelf()
, sistem akan menampilkan pengecualian internal. Pengecualian
akan dicatat ke dalam log di Logcat dengan pesan berikut:
Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type mediaProcessing did not stop within its timeout: [component name]"
Untuk menghindari pengecualian, Anda dapat melakukan salah satu hal berikut:
- Minta layanan Anda menerapkan metode
Service.onTimeout(int, int)
baru. Saat aplikasi Anda menerima callback, pastikan untuk memanggilstopSelf()
dalam beberapa detik. (Jika Anda tidak segera menghentikan aplikasi, sistem akan menghasilkan kegagalan.) - Pastikan layanan
mediaProcessing
aplikasi Anda tidak berjalan selama lebih dari jumlah 6 jam dalam periode 24 jam (kecuali jika pengguna berinteraksi dengan aplikasi, mereset timer). - Hanya mulai layanan latar depan
mediaProcessing
sebagai hasil dari interaksi pengguna langsung; karena aplikasi Anda 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 Anda telah berjalan selama 6 jam dalam
24 terakhir, Anda tidak dapat memulai layanan latar depan mediaProcessing
lainnya kecuali jika
pengguna telah memindahkan aplikasi Anda ke latar depan (yang akan mereset timer). Jika Anda
mencoba memulai layanan latar depan mediaProcessing
lainnya, sistem akan menampilkan
ForegroundServiceStartNotAllowedException
dengan pesan error seperti "Batas waktu sudah habis untuk jenis layanan
latar depan mediaProcessing".
Untuk informasi selengkapnya tentang jenis layanan mediaProcessing
, lihat Perubahan pada
jenis layanan latar depan untuk Android 15: Pemrosesan media.
Pengujian
Untuk menguji perilaku aplikasi, Anda dapat mengaktifkan waktu tunggu pemrosesan media meskipun
aplikasi tidak menargetkan Android 15 (selama aplikasi berjalan di
perangkat Android 15). Untuk mengaktifkan waktu tunggu, jalankan perintah adb
berikut:
adb shell am compat enable FGS_INTRODUCE_TIME_LIMITS your-package-name
Anda juga dapat menyesuaikan periode waktu tunggu untuk mempermudah pengujian perilaku
aplikasi saat batas tercapai. Untuk menetapkan periode waktu tunggu baru, jalankan perintah adb
berikut:
adb shell device_config put activity_manager media_processing_fgs_timeout_duration duration-in-milliseconds
Restrictions on BOOT_COMPLETED
broadcast receivers launching foreground services
There are new restrictions on BOOT_COMPLETED
broadcast receivers launching
foreground services. BOOT_COMPLETED
receivers are not allowed to launch the
following types of foreground services:
dataSync
camera
mediaPlayback
phoneCall
mediaProjection
microphone
(this restriction has been in place formicrophone
since Android 14)
If a BOOT_COMPLETED
receiver tries to launch any of those types of foreground
services, the system throws ForegroundServiceStartNotAllowedException
.
Testing
To test your app's behavior, you can enable these new restrictions even if your
app is not targeting Android 15 (as long as the app is running on an Android 15
device). Run the following adb
command:
adb shell am compat enable FGS_BOOT_COMPLETED_RESTRICTIONS your-package-name
To send a BOOT_COMPLETED
broadcast without restarting the device,
run the following adb
command:
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED your-package-name
Restrictions on starting foreground services while an app holds the SYSTEM_ALERT_WINDOW
permission
Previously, if an app held the SYSTEM_ALERT_WINDOW
permission, it could launch
a foreground service even if the app was currently in the background (as
discussed in exemptions from background start restrictions).
If an app targets Android 15, this exemption is now narrower. The app now needs
to have the SYSTEM_ALERT_WINDOW
permission and also have a visible overlay
window. That is, the app needs to first launch a
TYPE_APPLICATION_OVERLAY
window and the window
needs to be visible before you start a foreground service.
If your app attempts to start a foreground service from the background without
meeting these new requirements (and it does not have some other exemption), the
system throws ForegroundServiceStartNotAllowedException
.
If your app declares the SYSTEM_ALERT_WINDOW
permission
and launches foreground services from the background, it may be affected by this
change. If your app gets a ForegroundServiceStartNotAllowedException
, check
your app's order of operations and make sure your app already has an active
overlay window before it attempts to start a foreground service from the
background. You can check if your overlay window is currently visible
by calling View.getWindowVisibility()
, or you
can override View.onWindowVisibilityChanged()
to get notified whenever the visibility changes.
Testing
To test your app's behavior, you can enable these new restrictions even if your
app is not targeting Android 15 (as long as the app is running on an Android 15
device). To enable these new restrictions on starting foreground services
from the background, run the following adb
command:
adb shell am compat enable FGS_SAW_RESTRICTIONS your-package-name
Perubahan pada waktu aplikasi dapat mengubah status global mode Jangan Ganggu
Aplikasi yang menargetkan Android 15 (API level 35) dan yang lebih tinggi tidak dapat lagi mengubah
status atau kebijakan global Jangan Ganggu (DND) di perangkat (baik dengan mengubah
setelan pengguna, atau menonaktifkan mode DND). Sebagai gantinya, aplikasi harus berkontribusi pada
AutomaticZenRule
, yang digabungkan sistem menjadi kebijakan global dengan
skema kebijakan paling ketat yang ada. Panggilan ke API yang ada yang
sebelumnya memengaruhi status global (setInterruptionFilter
,
setNotificationPolicy
) menghasilkan pembuatan atau pembaruan AutomaticZenRule
implisit, yang diaktifkan dan dinonaktifkan bergantung pada siklus panggilan
panggilan API tersebut.
Perhatikan bahwa perubahan ini hanya memengaruhi perilaku yang dapat diamati jika aplikasi memanggil
setInterruptionFilter(INTERRUPTION_FILTER_ALL)
dan mengharapkan panggilan tersebut untuk
menonaktifkan AutomaticZenRule
yang sebelumnya diaktifkan oleh pemiliknya.
Perubahan OpenJDK API
Android 15 melanjutkan pekerjaan memuat ulang library inti Android agar selaras dengan fitur dalam rilis OpenJDK LTS terbaru.
Beberapa perubahan ini dapat memengaruhi kompatibilitas aplikasi untuk aplikasi yang menargetkan Android 15 (API level 35):
Perubahan pada API pemformatan string: Validasi indeks argumen, tanda, lebar, dan presisi kini lebih ketat saat menggunakan API
String.format()
danFormatter.format()
berikut:String.format(String, Object[])
String.format(Locale, String, Object[])
Formatter.format(String, Object[])
Formatter.format(Locale, String, Object[])
Misalnya, pengecualian berikut ditampilkan saat indeks argumen 0 digunakan (
%0
dalam string format):IllegalFormatArgumentIndexException: Illegal format argument index = 0
Dalam hal ini, masalah dapat diperbaiki dengan 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 menjadiObject
—bukan jenis elemen array yang mendasarinya. Jadi, kode berikut akan menampilkanClassCastException
:String[] elements = (String[]) Arrays.asList("one", "two").toArray();
Untuk kasus ini, guna 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, Yiddish, dan Indonesia tidak lagi dikonversi ke bentuk yang sudah tidak digunakan lagi (Ibrani:iw
, Yiddish:ji
, dan Indonesia:in
). Saat menentukan kode bahasa untuk salah satu lokalitas ini, gunakan kode dari ISO 639-1 (Ibrani:he
, Yiddish:yi
, dan Indonesia: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 menyebabkan perilaku yang merusak aplikasi, tetapi kode Anda tidak boleh mengharapkan urutan yang dihasilkan dari metode
Random.ints()
untuk cocok denganRandom.nextInt()
.
API SequencedCollection
baru dapat memengaruhi kompatibilitas aplikasi
setelah Anda mengupdate compileSdk
di konfigurasi build aplikasi untuk menggunakan
Android 15 (API level 35):
Tabrakan dengan fungsi ekstensi
MutableList.removeFirst()
danMutableList.removeLast()
dikotlin-stdlib
Jenis
List
di Java dipetakan ke jenisMutableList
di Kotlin. Karena APIList.removeFirst()
danList.removeLast()
telah diperkenalkan di Android 15 (API level 35), compiler Kotlin akan me-resolve panggilan fungsi, misalnyalist.removeFirst()
, secara statis keList
API baru, bukan ke fungsi ekstensi dikotlin-stdlib
.Jika aplikasi dikompilasi ulang dengan
compileSdk
ditetapkan ke35
danminSdk
ditetapkan ke34
atau yang lebih rendah, lalu aplikasi dijalankan di Android 14 dan yang lebih rendah, error runtime akan ditampilkan:java.lang.NoSuchMethodError: No virtual method removeFirst()Ljava/lang/Object; in class Ljava/util/ArrayList;
Opsi lint
NewApi
yang ada di Plugin Android Gradle dapat menangkap penggunaan API baru ini../gradlew lint
MainActivity.kt:41: Error: Call requires API level 35 (current min is 34): java.util.List#removeFirst [NewApi] list.removeFirst()Untuk memperbaiki pengecualian runtime dan error lint, panggilan fungsi
removeFirst()
danremoveLast()
dapat diganti denganremoveAt(0)
danremoveAt(list.lastIndex)
di Kotlin. Jika Anda menggunakan Android Studio Ladybug | 2024.1.3 atau yang lebih tinggi, IDE ini juga menyediakan opsi perbaikan cepat untuk error ini.Pertimbangkan untuk menghapus
@SuppressLint("NewApi")
danlintOptions { disable 'NewApi' }
jika opsi lint telah dinonaktifkan.Tabrakan dengan metode lain di Java
Metode baru telah ditambahkan ke jenis yang ada, misalnya,
List
danDeque
. Metode baru ini mungkin tidak kompatibel dengan metode dengan nama dan jenis argumen yang sama di antarmuka dan class lain. Jika terjadi konflik tanda tangan metode dengan inkompatibilitas, compilerjavac
akan menghasilkan error waktu build. Contoh:Contoh error 1:
javac MyList.java
MyList.java:135: error: removeLast() in MyList cannot implement removeLast() in List public void removeLast() { ^ return type void is not compatible with Object where E is a type-variable: E extends Object declared in interface ListContoh error 2:
javac MyList.java
MyList.java:7: error: types Deque<Object> and List<Object> are incompatible; public class MyList implements List<Object>, Deque<Object> { both define reversed(), but with unrelated return types 1 errorContoh error 3:
javac MyList.java
MyList.java:43: error: types List<E#1> and MyInterface<E#2> are incompatible; public static class MyList implements List<Object>, MyInterface<Object> { class MyList inherits unrelated defaults for getFirst() from types List and MyInterface where E#1,E#2 are type-variables: E#1 extends Object declared in interface List E#2 extends Object declared in interface MyInterface 1 errorUntuk memperbaiki error build ini, class yang mengimplementasikan antarmuka ini harus mengganti metode dengan jenis nilai yang kompatibel. Contoh:
@Override public Object getFirst() { return List.super.getFirst(); }
Keamanan
Android 15 menyertakan perubahan yang meningkatkan keamanan sistem untuk membantu melindungi aplikasi dan pengguna dari aplikasi berbahaya.
Versi TLS yang dibatasi
Android 15 restricts the usage of TLS versions 1.0 and 1.1. These versions had previously been deprecated in Android, but are now disallowed for apps targeting Android 15.
Peluncuran aktivitas latar belakang yang aman
Android 15 melindungi pengguna dari aplikasi berbahaya dan memberi pengguna kontrol yang lebih besar perangkat mereka dengan menambahkan perubahan yang mencegah aplikasi latar belakang berbahaya membawa aplikasi lain ke latar depan, meningkatkan hak istimewanya, dan menyalahgunakan interaksi pengguna. Peluncuran aktivitas latar belakang dibatasi sejak Android 10 (level API 29).
Blokir aplikasi yang tidak cocok dengan UID teratas pada tumpukan agar tidak meluncurkan aktivitas
Aplikasi berbahaya bisa meluncurkan aktivitas aplikasi lain dalam tugas yang sama, lalu
menempatkan diri di atasnya, menciptakan ilusi sebagai aplikasi. "Tugas ini
pembajakan" serangan menghindari pembatasan peluncuran
di latar belakang saat ini karena semuanya
muncul dalam tugas terlihat yang sama. Untuk memitigasi risiko ini, Android 15 menambahkan
penanda yang memblokir aplikasi yang tidak cocok dengan UID teratas pada tumpukan agar tidak diluncurkan
aktivitas Anda. Untuk ikut serta dalam semua aktivitas aplikasi Anda, perbarui
allowCrossUidActivitySwitchFromBelow
di file AndroidManifest.xml
aplikasi Anda:
<application android:allowCrossUidActivitySwitchFromBelow="false" >
Langkah-langkah keamanan baru akan aktif jika semua hal berikut terpenuhi:
- Aplikasi yang melakukan peluncuran menargetkan Android 15.
- Aplikasi di atas tumpukan tugas menargetkan Android 15.
- Semua aktivitas yang terlihat telah diikutsertakan ke perlindungan baru
Jika langkah-langkah keamanan diaktifkan, aplikasi mungkin akan dikembalikan ke beranda, bukan aplikasi yang terakhir terlihat, jika mereka menyelesaikan tugas mereka sendiri.
Perubahan lainnya
Selain pembatasan untuk pencocokan UID, perubahan lain ini juga termasuk:
- Ubah
PendingIntent
kreator untuk memblokir peluncuran aktivitas latar belakang dengan default. Hal ini membantu mencegah aplikasi secara tidak sengaja membuatPendingIntent
yang dapat disalahgunakan oleh pelaku kejahatan. - Jangan memindahkan aplikasi ke latar depan kecuali jika pengirim
PendingIntent
mengizinkannya. Perubahan ini bertujuan untuk mencegah aplikasi berbahaya menyalahgunakan kemampuan untuk memulai aktivitas di latar belakang. Secara default, aplikasi tidak diizinkan untuk memindahkan stack tugas ke latar depan kecuali jika kreator mengizinkan hak istimewa peluncuran aktivitas latar belakang atau pengirim memiliki aktivitas latar belakang hak istimewa peluncuran. - Kontrol cara aktivitas teratas tumpukan tugas dapat menyelesaikan tugasnya. Jika aktivitas teratas yang menyelesaikan tugas, Android akan kembali ke tugas mana pun yang terakhir aktif. Selain itu, jika aktivitas non-top menyelesaikan tugasnya, Android akan kembali ke layar beranda; itu tidak akan memblokir penyelesaian non-top ini aktivitas Anda.
- Mencegah peluncuran aktivitas arbitrer dari aplikasi lain ke aplikasi Anda sendiri tugas. Perubahan ini mencegah aplikasi berbahaya melakukan phishing pengguna dengan membuat aktivitas yang tampaknya berasal dari aplikasi lain.
- Memblokir jendela yang tidak terlihat agar tidak dipertimbangkan untuk aktivitas latar belakang peluncuran. Tindakan ini membantu mencegah aplikasi berbahaya menyalahgunakan latar belakang peluncuran aktivitas untuk menampilkan konten yang tidak diinginkan atau berbahaya kepada pengguna.
Intent yang lebih aman
Android 15 introduces new optional security measures to make intents safer and more robust. These changes are aimed at preventing potential vulnerabilities and misuse of intents that can be exploited by malicious apps. There are two main improvements to the security of intents in Android 15:
- Match target intent-filters: Intents that target specific components must accurately match the target's intent-filter specifications. If you send an intent to launch another app's activity, the target intent component needs to align with the receiving activity's declared intent-filters.
- Intents must have actions: Intents without an action will no longer match any intent-filters. This means that intents used to start activities or services must have a clearly defined action.
In order to check how your app responds to these changes, use
StrictMode
in your app. To see detailed
logs about Intent
usage violations, add the following method:
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
There are two changes related to window insets in Android 15: edge-to-edge is enforced by default, and there are also configuration changes, such as the default configuration of system bars.
Edge-to-edge enforcement
Aplikasi secara default memiliki tampilan dari tepi ke tepi di perangkat yang menjalankan Android 15 jika aplikasi menargetkan Android 15 (API level 35).

Ini adalah perubahan yang dapat menyebabkan gangguan yang mungkin berdampak negatif pada UI aplikasi Anda. Perubahan ini memengaruhi area UI berikut:
- Menu navigasi handle gestur
- Transparan secara default.
- Offset bawah dinonaktifkan sehingga konten digambar di belakang menu navigasi sistem, kecuali jika inset diterapkan.
setNavigationBarColor
danR.attr#navigationBarColor
tidak digunakan lagi dan tidak memengaruhi navigasi gestur.setNavigationBarContrastEnforced
danR.attr#navigationBarContrastEnforced
terus tidak berpengaruh pada navigasi gestur.
- Navigasi 3 tombol
- Opasitasnya 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 jika inset diterapkan.
setNavigationBarColor
danR.attr#navigationBarColor
ditetapkan agar cocok dengan latar belakang jendela secara default. Latar belakang jendela harus berupa drawable warna agar default ini 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 seluruh navigasi 3 tombol.
- Status bar
- Transparan secara default.
- Offset atas dinonaktifkan sehingga konten digambar di belakang status bar, kecuali jika inset diterapkan.
setStatusBarColor
danR.attr#statusBarColor
tidak digunakan lagi dan tidak berpengaruh pada Android 15.setStatusBarContrastEnforced
danR.attr#statusBarContrastEnforced
tidak digunakan lagi, tetapi masih memiliki efek pada Android 15.
- Potongan layar
layoutInDisplayCutoutMode
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 (API level 35), serta sebelum dan sesudah menerapkan inset.



Hal yang perlu diperiksa jika aplikasi Anda sudah memenuhi seluruh layar
Jika aplikasi Anda sudah dari tepi ke tepi dan menerapkan inset, Anda 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 diluncurkan, hal ini mungkin disebabkan oleh layar pembuka. Anda dapat mengupgrade dependensi layar utama ke 1.2.0-alpha01 atau yang lebih baru atau menetapkanwindow.attributes.layoutInDisplayCutoutMode = WindowManager.LayoutInDisplayCutoutMode.always
. - Mungkin ada layar dengan traffic lebih rendah yang memiliki UI yang terhalang. Pastikan
layar yang jarang dikunjungi ini tidak memiliki UI yang terhalang. Layar dengan traffic lebih rendah mencakup:
- Layar aktivasi atau login
- Halaman setelan
Yang harus diperiksa jika aplikasi Anda belum memenuhi syarat untuk layar penuh
Jika aplikasi Anda belum memenuhi seluruh layar, kemungkinan besar Anda akan terpengaruh. Selain skenario untuk aplikasi yang sudah memiliki tampilan layar penuh, Anda harus mempertimbangkan hal berikut:
- Jika aplikasi Anda menggunakan Komponen Material 3 (
androidx.compose.material3
) di compose, sepertiTopAppBar
,BottomAppBar
, danNavigationBar
, komponen ini kemungkinan tidak terpengaruh karena secara otomatis menangani inset. - Jika aplikasi Anda menggunakan Komponen Material 2 (
androidx.compose.material
) di Compose, komponen ini tidak otomatis menangani inset. Namun, Anda dapat memperoleh 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
, menangani inset dan tidak memerlukan tindakan 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 kontainer kustom, terapkan padding menggunakanViewCompat.setOnApplyWindowInsetsListener
. UntukRecyclerView
, terapkan padding menggunakan pemroses ini dan juga tambahkanclipToPadding="false"
.
Hal yang harus diperiksa jika aplikasi Anda harus menawarkan perlindungan latar belakang kustom
Jika aplikasi Anda harus menawarkan perlindungan latar belakang kustom ke navigasi 3 tombol atau
status bar, aplikasi Anda harus menempatkan composable atau tampilan di belakang status bar
menggunakan WindowInsets.Type#tappableElement()
untuk mendapatkan tinggi menu navigasi
3 tombol atau WindowInsets.Type#statusBars
.
Referensi edge-to-edge tambahan
Lihat panduan Tampilan dari Tepi ke Tepi dan Compose dari Tepi ke Tepi untuk pertimbangan tambahan tentang penerapan inset.
API yang Tidak Digunakan Lagi
API berikut tidak digunakan lagi, tetapi tidak dinonaktifkan:
R.attr#enforceStatusBarContrast
R.attr#navigationBarColor
(untuk navigasi 3 tombol, dengan alfa 80%)Window#isStatusBarContrastEnforced
Window#setNavigationBarColor
(untuk navigasi 3 tombol, dengan alpha 80%)Window#setStatusBarContrastEnforced
API berikut tidak digunakan lagi dan dinonaktifkan:
R.attr#navigationBarColor
(untuk navigasi gestur)R.attr#navigationBarDividerColor
R.attr#statusBarColor
Window#setDecorFitsSystemWindows
Window#getNavigationBarColor
Window#getNavigationBarDividerColor
Window#getStatusBarColor
Window#setNavigationBarColor
(untuk navigasi gestur)Window#setNavigationBarDividerColor
Window#setStatusBarColor
Stable configuration
Jika aplikasi Anda menargetkan Android 15 (API level 35) atau yang lebih baru, Configuration
tidak
lagi mengecualikan bilah sistem. Jika menggunakan ukuran layar di
class Configuration
untuk penghitungan tata letak, Anda harus menggantinya dengan
alternatif yang lebih baik seperti ViewGroup
, WindowInsets
, atau
WindowMetricsCalculator
yang sesuai, bergantung pada kebutuhan Anda.
Configuration
telah tersedia sejak API 1. Nilai ini biasanya diperoleh dari
Activity.onConfigurationChanged
. Fitur ini memberikan informasi seperti kepadatan,
orientasi, dan ukuran jendela. Satu karakteristik penting tentang ukuran jendela
yang ditampilkan dari Configuration
adalah fungsi tersebut sebelumnya mengecualikan kolom sistem.
Ukuran konfigurasi biasanya digunakan untuk pemilihan resource, seperti
/res/layout-h500dp
, dan ini masih kasus penggunaan yang valid. Namun, penggunaannya untuk
penghitungan tata letak selalu tidak dianjurkan. Jika Anda melakukannya, Anda harus menjauhi
situs tersebut 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
navbar sistem, gunakan WindowInsets
. Jika Anda 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 panel sistem. Configuration.smallestScreenWidthDp
terpengaruh secara tidak langsung oleh perubahan kescreenWidthDp
danscreenHeightDp
.Configuration.orientation
terpengaruh secara tidak langsung oleh perubahan padascreenWidthDp
danscreenHeightDp
pada perangkat yang berdekatan.Display.getSize(Point)
dipengaruhi secara tidak langsung oleh perubahan dalamConfiguration
. Ini tidak digunakan lagi mulai API level 30.Display.getMetrics()
sudah berfungsi seperti ini sejak level API 33.
Atribut elegantTextHeight ditetapkan secara default ke true
For apps targeting Android 15 (API level 35), the
elegantTextHeight
TextView
attribute
becomes true
by default, replacing the compact font used by default with some
scripts that have large vertical metrics with one that is much more readable.
The compact font was introduced to prevent breaking layouts; Android 13 (API
level 33) prevents many of these breakages by allowing the text layout to
stretch the vertical height utilizing the fallbackLineSpacing
attribute.
In Android 15, the compact font still remains in the system, so your app can set
elegantTextHeight
to false
to get the same behavior as before, but it is
unlikely to be supported in upcoming releases. So, if your app supports the
following scripts: Arabic, Lao, Myanmar, Tamil, Gujarati, Kannada, Malayalam,
Odia, Telugu or Thai, test your app by setting elegantTextHeight
to true
.

elegantTextHeight
behavior for apps targeting Android 14 (API level 34) and lower.
elegantTextHeight
behavior for apps targeting Android 15.Perubahan lebar TextView untuk bentuk huruf yang kompleks
Pada versi Android sebelumnya, beberapa font atau bahasa kursif yang memiliki
bentuk kompleks dapat menggambar huruf di area karakter sebelumnya atau berikutnya.
Dalam beberapa kasus, huruf tersebut dipangkas 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 untuk
mencegah pemangkasan.
Karena perubahan ini memengaruhi cara TextView
menentukan lebar, TextView
mengalokasikan lebih banyak lebar secara default jika aplikasi menargetkan Android 15 (level API 35) atau
yang lebih baru. Anda dapat mengaktifkan atau menonaktifkan perilaku ini dengan memanggil
setUseBoundsForWidth
API di TextView
.
Karena menambahkan 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 pemangkasan dengan memanggil
setShiftDrawingOffsetForStartOverhang
.
Contoh berikut menunjukkan bagaimana perubahan ini dapat meningkatkan tata letak teks untuk beberapa font dan bahasa.

<TextView android:fontFamily="cursive" android:text="java" />

<TextView android:fontFamily="cursive" android:text="java" android:useBoundsForWidth="true" android:shiftDrawingOffsetForStartOverhang="true" />

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

<TextView android:text="คอมพิวเตอร์" android:useBoundsForWidth="true" android:shiftDrawingOffsetForStartOverhang="true" />
Tinggi baris default yang mempertimbangkan lokalitas untuk EditText
Pada versi Android sebelumnya, tata letak teks meregangkan tinggi
teks untuk memenuhi tinggi baris font yang cocok dengan lokalitas saat ini. Misalnya, jika konten dalam bahasa Jepang, karena tinggi baris font
Jepang sedikit lebih besar dari font Latin, tinggi teks
menjadi sedikit lebih besar. Namun, meskipun ada perbedaan tinggi baris ini, elemen
EditText
berukuran seragam, terlepas
dari lokalitas yang digunakan, seperti yang diilustrasikan pada gambar berikut:

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 (API level 35), tinggi baris minimum kini
disediakan untuk EditText
agar cocok dengan font referensi untuk Lokalitas yang ditentukan, seperti
yang ditunjukkan pada gambar berikut:

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 membuat perubahan berikut pada perilaku kamera dan media untuk aplikasi yang menargetkan Android 15 atau yang lebih tinggi.
Pembatasan dalam meminta fokus audio
Aplikasi yang menargetkan Android 15 (API level 35) harus menjadi aplikasi teratas atau menjalankan
layanan latar depan untuk meminta fokus audio. Jika aplikasi
mencoba meminta fokus saat tidak memenuhi salah satu persyaratan ini, panggilan akan menampilkan AUDIOFOCUS_REQUEST_FAILED
.
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 API level target aplikasi Anda, penggunaan metode atau kolom non-SDK selalu berisiko tinggi 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 memahami 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 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.