Ringkasan Fitur dan API

Android 15 memperkenalkan fitur dan API baru yang hebat untuk para developer. Bagian berikut merangkum fitur ini untuk membantu Anda mulai menggunakan API terkait.

Untuk melihat daftar mendetail tentang API yang ditambahkan, diubah, dan dihapus, baca laporan perbedaan API. Untuk mengetahui detail tentang API yang ditambahkan, buka referensi API Android — untuk Android 15, cari API yang ditambahkan di level API 35. Untuk mempelajari area tempat perubahan platform dapat memengaruhi aplikasi Anda, pastikan untuk memeriksa perubahan perilaku Android 15 untuk aplikasi yang menargetkan Android 15 dan untuk semua aplikasi.

Kamera dan media

Android 15 menyertakan berbagai fitur yang meningkatkan pengalaman kamera dan media serta memberi Anda akses ke alat dan hardware untuk mendukung kreator dalam mewujudkan visi mereka di Android.

Untuk mengetahui informasi selengkapnya tentang fitur dan solusi developer terbaru untuk media dan kamera Android, lihat materi Membangun pengalaman media dan kamera Android modern dari Google I/O.

Peningkatan Cahaya Rendah

Android 15 memperkenalkan Low Light Boost, mode eksposur otomatis yang tersedia untuk Camera 2 dan ekstensi kamera mode malam. Peningkatan Cahaya Redup menyesuaikan eksposur streaming Pratinjau dalam kondisi cahaya redup. Hal ini berbeda dengan cara ekstensi kamera mode malam membuat gambar diam, karena mode malam menggabungkan serangkaian foto untuk membuat satu gambar yang ditingkatkan. Meskipun mode malam berfungsi sangat baik untuk membuat gambar diam, mode ini tidak dapat membuat streaming frame yang berkelanjutan, tetapi Low Light Boost dapat melakukannya. Dengan demikian, Pengoptimalan Cahaya Rendah memungkinkan kemampuan kamera, seperti:

  • Memberikan pratinjau gambar yang ditingkatkan, sehingga pengguna dapat lebih baik membingkai gambar dalam kondisi cahaya redup
  • Memindai kode QR dalam kondisi cahaya redup

Jika Anda mengaktifkan Peningkatan Cahaya Redup, fitur ini akan otomatis aktif saat ada tingkat cahaya yang rendah, dan nonaktif saat ada lebih banyak cahaya.

Aplikasi dapat merekam dari streaming Pratinjau dalam kondisi cahaya redup untuk menyimpan video yang lebih terang.

Untuk informasi selengkapnya, lihat Penguatan Cahaya Redup.

Kontrol kamera dalam aplikasi

Android 15 menambahkan ekstensi untuk lebih mengontrol hardware kamera dan algoritmanya di perangkat yang didukung:

  • Penyesuaian kekuatan flash lanjutan yang memungkinkan kontrol intensitas flash yang presisi dalam mode SINGLE dan TORCH saat mengambil gambar.

Kontrol ruang kosong HDR

Android 15 memilih headroom HDR yang sesuai dengan kemampuan perangkat yang mendasari dan kedalaman bit panel. Untuk halaman yang memiliki banyak konten SDR, seperti aplikasi pesan yang menampilkan satu thumbnail HDR, perilaku ini dapat memengaruhi kecerahan konten SDR yang dirasakan. Android 15 memungkinkan Anda mengontrol headroom HDR dengan setDesiredHdrHeadroom untuk mencapai keseimbangan antara konten SDR dan HDR.

Kecerahan elemen UI SDR di layar kiri tampaknya lebih seragam daripada kecerahan di layar kanan, yang menyimulasikan kemungkinan masalah headroom saat konten HDR dan SDR dicampur. Dengan menyesuaikan headroom HDR, Anda dapat mencapai keseimbangan yang lebih baik antara konten SDR dan HDR.

Kontrol keras suara

Android 15 memperkenalkan dukungan untuk standar kenyaringan CTA-2075 guna membantu Anda menghindari inkonsistensi kenyaringan audio dan memastikan pengguna tidak perlu terus-menerus menyesuaikan volume saat beralih antarkonten. Sistem ini memanfaatkan informasi karakteristik perangkat output (headphone dan speaker) beserta metadata kenyaringan yang tersedia dalam konten audio AAC untuk menyesuaikan secara cerdas tingkat kenyaringan audio dan rentang dinamis.

Untuk mengaktifkan fitur ini, pastikan metadata kenyaringan tersedia di konten AAC dan mengaktifkan fitur platform di aplikasi Anda. Untuk itu, Anda dapat Buat instance objek LoudnessCodecController dengan memanggil metode factory create-nya dengan audio ID sesi dari AudioTrack terkait; ingin otomatis mulai menerapkan pembaruan audio. Anda dapat meneruskan OnLoudnessCodecUpdateListener untuk mengubah atau memfilter parameter volume sebelum diterapkan di MediaCodec.

// Media contains metadata of type MPEG_4 OR MPEG_D
val mediaCodec = 
val audioTrack = AudioTrack.Builder()
                                .setSessionId(sessionId)
                                .build()
...
// Create new loudness controller that applies the parameters to the MediaCodec
try {
   val lcController = LoudnessCodecController.create(mSessionId)
   // Starts applying audio updates for each added MediaCodec
}

AndroidX media3 ExoPlayer juga akan diupdate untuk menggunakan LoudnessCodecController API untuk integrasi aplikasi yang lancar.

Perangkat MIDI 2.0 virtual

Android 13 menambahkan dukungan untuk terhubung ke perangkat MIDI 2.0 menggunakan USB, yang berkomunikasi menggunakan Universal MIDI Packets (UMP). Android 15 memperluas dukungan UMP ke aplikasi MIDI virtual, yang memungkinkan aplikasi komposisi mengontrol aplikasi synthesizer sebagai perangkat MIDI 2.0 virtual seperti yang dilakukan dengan perangkat USB MIDI 2.0.

Decoding software AV1 yang lebih efisien

logo dav1d

dav1d, decoder software AV1 populer dari VideoLAN tersedia untuk perangkat Android yang tidak mendukung dekode AV1 dalam hardware. dav1d memiliki performa hingga 3x lebih baik daripada decoder software AV1 lama, sehingga memungkinkan pemutaran AV1 HD untuk lebih banyak pengguna, termasuk beberapa perangkat tingkat rendah dan menengah.

Aplikasi Anda harus memilih untuk menggunakan dav1d dengan memanggilnya berdasarkan nama "c2.android.av1-dav1d.decoder". dav1d akan dijadikan decoder software AV1 default dalam update berikutnya. Dukungan ini distandarisasi dan di-backport ke perangkat Android 11 yang menerima update sistem Google Play.

Alat dan produktivitas developer

Meskipun sebagian besar upaya kami untuk meningkatkan produktivitas Anda berpusat pada alat seperti Android Studio, Jetpack Compose, dan library Android Jetpack, kami selalu mencari cara di platform untuk membantu Anda mewujudkan visi dengan lebih mudah.

Update OpenJDK 17

Android 15 continues the work of refreshing Android's core libraries to align with the features in the latest OpenJDK LTS releases.

The following key features and improvements are included:

These APIs are updated on over a billion devices running Android 12 (API level 31) and higher through Google Play System updates, so you can target the latest programming features.

Peningkatan PDF

Android 15 menyertakan peningkatan substansial pada PdfRenderer Google Cloud Platform. Aplikasi dapat menggabungkan fitur lanjutan seperti rendering file yang dilindungi sandi, anotasi, pengeditan formulir, penelusuran, dan pemilihan dengan salinan. PDF yang dilinierkan pengoptimalan didukung untuk mempercepat penayangan PDF lokal dan mengurangi penggunaan resource. Library Jetpack PDF menggunakan API ini untuk menyederhanakan penambahan PDF menampilkan aplikasi Anda.

Pembaruan terbaru pada rendering PDF mencakup fitur seperti menelusuri file PDF yang disematkan.

PdfRenderer telah dipindahkan ke modul yang dapat diupdate menggunakan update sistem Google Play, terlepas dari rilis platform, dan kami mendukung perubahan ini kembali ke Android 11 (API level 30) dengan membuat platform API versi pra-Android 15 yang kompatibel, yang disebut PdfRendererPreV.

Penyempurnaan pengalihan bahasa otomatis

Android 14 menambahkan pengenalan multibahasa di perangkat dalam audio dengan peralihan otomatis antarbahasa, tetapi hal ini dapat menyebabkan kata dihapus, terutama saat bahasa beralih dengan sedikit jeda di antara dua ucapan. Android 15 menambahkan kontrol tambahan untuk membantu aplikasi menyesuaikan pengalihan ini ke kasus penggunaannya. EXTRA_LANGUAGE_SWITCH_INITIAL_ACTIVE_DURATION_TIME_MILLIS membatasi pengalihan otomatis ke awal sesi audio, sedangkan EXTRA_LANGUAGE_SWITCH_MATCH_SWITCHES menonaktifkan pengalihan bahasa setelah sejumlah pengalihan yang ditentukan. Opsi ini sangat berguna jika Anda memperkirakan bahwa akan ada satu bahasa yang diucapkan selama sesi yang akan dideteksi secara otomatis.

Peningkatan OpenType Variable Font API

Android 15 improves the usability of the OpenType variable font. You can create a FontFamily instance from a variable font without specifying weight axes with the buildVariableFamily API. The text renderer overrides the value of wght axis to match the displaying text.

Using the API simplifies the code for creating a Typeface considerably:

Kotlin

val newTypeface = Typeface.CustomFallbackBuilder(
            FontFamily.Builder(
                Font.Builder(assets, "RobotoFlex.ttf").build())
                    .buildVariableFamily())
    .build()

Java

Typeface newTypeface = Typeface.CustomFallbackBuilder(
            new FontFamily.Builder(
                new Font.Builder(assets, "RobotoFlex.ttf").build())
                    .buildVariableFamily())
    .build();

Previously, to create the same Typeface, you would need much more code:

Kotlin

val oldTypeface = Typeface.CustomFallbackBuilder(
            FontFamily.Builder(
                Font.Builder(assets, "RobotoFlex.ttf")
                    .setFontVariationSettings("'wght' 400")
                    .setWeight(400)
                    .build())
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 100")
                        .setWeight(100)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 200")
                        .setWeight(200)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 300")
                        .setWeight(300)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 500")
                        .setWeight(500)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 600")
                        .setWeight(600)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 700")
                        .setWeight(700)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 800")
                        .setWeight(800)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 900")
                        .setWeight(900)
                        .build()
                ).build()
        ).build()

Java

Typeface oldTypeface = new Typeface.CustomFallbackBuilder(
    new FontFamily.Builder(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 400")
            .setWeight(400)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 100")
            .setWeight(100)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 200")
            .setWeight(200)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 300")
            .setWeight(300)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 500")
            .setWeight(500)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 600")
            .setWeight(600)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 700")
            .setWeight(700)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 800")
            .setWeight(800)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 900")
            .setWeight(900)
            .build()
    )
    .build()
).build();

Here's an example of how a Typeface created with both the old and new APIs renders:

An example of how Typeface rendering differs using new and old
APIs

In this example, the Typeface created with the old API doesn't have the capability to create accurate font weights for the 350, 450, 550 and 650 Font instances, so the renderer falls back to the closest weight. So in this case, 300 is rendered instead of 350, 400 is rendered instead of 450, and so on. By contrast, the Typeface created with the new APIs dynamically creates a Font instance for a given weight, so accurate weights are rendered for 350, 450, 550, and 650 as well.

Kontrol pemisah baris terperinci

Mulai Android 15, TextView dan pemisah baris yang mendasarinya dapat mempertahankan bagian teks tertentu di baris yang sama untuk meningkatkan keterbacaan. Anda dapat memanfaatkan penyesuaian akhir baris ini dengan menggunakan tag <nobreak> dalam resource string atau createNoBreakSpan. Demikian pula, Anda dapat mempertahankan kata dari pemisahan kata dengan menggunakan tag <nohyphen> atau createNoHyphenationSpan.

Misalnya, resource string berikut tidak menyertakan baris baru, dan dirender dengan teks "Pixel 8 Pro" yang terputus di tempat yang tidak diinginkan:

<resources>
    <string name="pixel8pro">The power and brains behind Pixel 8 Pro.</string>
</resources>

Sebaliknya, resource string ini menyertakan tag <nobreak>, yang menggabungkan frasa "Pixel 8 Pro" dan mencegah pemisahan baris:

<resources>
    <string name="pixel8pro">The power and brains behind <nobreak>Pixel 8 Pro.</nobreak></string>
</resources>

Perbedaan cara string ini dirender ditunjukkan dalam gambar berikut:

Tata letak untuk baris teks dengan frasa "Pixel 8 Pro". yang tidak digabungkan menggunakan tag <nobreak>.
Tata letak untuk baris teks yang sama dengan frasa "Pixel 8 Pro". yang digabungkan menggunakan tag <nobreak>.

Pengarsipan aplikasi

Android dan Google Play mengumumkan dukungan untuk pengarsipan aplikasi tahun lalu, yang memungkinkan pengguna mengosongkan ruang dengan menghapus sebagian aplikasi yang jarang digunakan dari perangkat yang dipublikasikan menggunakan Android App Bundle di Google Play. Android 15 menyertakan dukungan tingkat OS untuk pengarsipan dan pembatalan pengarsipan aplikasi, sehingga mempermudah semua app store untuk menerapkannya.

Aplikasi dengan izin REQUEST_DELETE_PACKAGES dapat memanggil metode PackageInstaller requestArchive untuk meminta pengarsipan paket aplikasi yang diinstal, yang akan menghapus APK dan file dalam cache, tetapi mempertahankan data pengguna. Aplikasi yang diarsipkan akan ditampilkan sebagai aplikasi yang dapat ditampilkan melalui LauncherApps API; pengguna akan melihat tampilan UI untuk menyoroti bahwa mereka aplikasi akan diarsipkan. Jika pengguna mengetuk aplikasi yang diarsipkan, penginstal yang bertanggung jawab akan mendapatkan permintaan untuk membatalkan pengarsipan file, dan proses pemulihan dapat dipantau oleh siaran ACTION_PACKAGE_ADDED.

Mengaktifkan mode 16 KB di perangkat menggunakan opsi developer

Aktifkan opsi developer Boot dengan ukuran halaman 16 KB untuk mem-boot perangkat dalam mode 16 KB.

Mulai dari Android 15 QPR1, Anda dapat menggunakan opsi developer yang tersedia di perangkat tertentu untuk mem-boot perangkat dalam mode 16 KB dan melakukan pengujian di perangkat. Sebelum menggunakan opsi developer, buka Setelan > Sistem > Update software dan terapkan update yang tersedia.

Opsi developer ini tersedia di perangkat berikut:

  • Pixel 8 dan 8 Pro (dengan Android 15 QPR1 atau yang lebih baru)

  • Pixel 8a (dengan Android 15 QPR1 atau yang lebih baru)

  • Pixel 9, 9 Pro, dan 9 Pro XL (dengan Android 15 QPR2 Beta 2 atau yang lebih baru)

Grafik

Android 15 menghadirkan peningkatan grafis terbaru, termasuk ANGLE dan penambahan pada sistem grafis Canvas.

Memodernisasi akses GPU Android

Logo Vulkan

Hardware Android telah berkembang cukup banyak sejak awal ketika OS inti akan berjalan di satu CPU dan GPU diakses menggunakan API berdasarkan pipeline fungsi tetap. API grafis Vulkan® telah tersedia di NDK sejak Android 7.0 (API level 24) dengan abstraksi tingkat rendah yang lebih mencerminkan hardware GPU modern, diskalakan dengan lebih baik untuk mendukung beberapa core CPU, dan menawarkan overhead driver CPU yang lebih rendah — sehingga meningkatkan performa aplikasi. Vulkan didukung oleh semua game engine modern.

Vulkan adalah antarmuka pilihan Android untuk GPU. Oleh karena itu, Android 15 menyertakan ANGLE sebagai lapisan opsional untuk menjalankan OpenGL® ES di atas Vulkan. Beralih ke ANGLE akan menstandarkan implementasi OpenGL Android untuk meningkatkan kompatibilitas, dan, dalam beberapa kasus, meningkatkan performa. Anda dapat menguji stabilitas dan performa aplikasi OpenGL ES dengan ANGLE dengan mengaktifkan opsi developer di Setelan -> Sistem -> Opsi Developer -> Eksperimental: Aktifkan ANGLE di Android 15.

Roadmap Android ANGLE di Vulkan

Roadmap perubahan mendatang pada Android GPU API.

Sebagai bagian dari penyederhanaan stack GPU, ke depannya kami akan mengirimkan ANGLE sebagai driver sistem GL di lebih banyak perangkat baru, dengan ekspektasi di masa mendatang bahwa OpenGL/ES hanya akan tersedia melalui ANGLE. Meskipun demikian, kami berencana untuk melanjutkan dukungan untuk OpenGL ES di semua perangkat.

Rekomendasi langkah selanjutnya

Gunakan opsi developer untuk memilih driver ANGLE untuk OpenGL ES dan menguji aplikasi Anda. Untuk project baru, sebaiknya gunakan Vulkan untuk C/C++.

Peningkatan untuk Canvas

Android 15 melanjutkan modernisasi sistem grafis Canvas Android dengan kemampuan tambahan:

  • Matrix44 menyediakan matriks 4x4 untuk mengubah koordinat yang harus digunakan saat Anda ingin memanipulasi kanvas dalam 3D.
  • clipShader memotong klip saat ini dengan shader yang ditentukan, sedangkan clipOutShader menetapkan klip ke perbedaan klip saat ini dan shader, yang masing-masing memperlakukan shader sebagai mask alfa. Hal ini mendukung gambar bentuk kompleks secara efisien.

Performa dan baterai

Android terus berfokus untuk membantu Anda meningkatkan performa dan kualitas aplikasi Anda. Android 15 memperkenalkan API yang membantu membuat tugas di aplikasi Anda dieksekusi secara lebih efisien, mengoptimalkan performa aplikasi, dan mengumpulkan insight tentang aplikasi Anda.

Untuk mengetahui praktik terbaik yang hemat baterai, cara men-debug penggunaan jaringan dan daya, serta detail tentang cara kami meningkatkan efisiensi baterai tugas latar belakang di Android 15 dan Android versi terbaru, lihat materi Meningkatkan efisiensi baterai tugas latar belakang di Android dari Google I/O.

ApplicationStartInfo API

Pada versi Android sebelumnya, startup aplikasi agak misterius. Sulit untuk menentukan dalam aplikasi Anda apakah aplikasi dimulai dari status cold, warm, atau hot. Sulit juga untuk mengetahui berapa lama aplikasi Anda menghabiskan waktu selama berbagai fase peluncuran: melakukan fork pada proses, memanggil onCreate, menggambar frame pertama, dan lainnya. Saat class Application dibuat instance-nya, Anda tidak memiliki cara untuk mengetahui apakah aplikasi dimulai dari siaran, penyedia konten, tugas, pencadangan, booting selesai, alarm, atau Activity.

ApplicationStartInfo API di Android 15 menyediakan semua hal ini dan lainnya. Anda bahkan dapat memilih untuk menambahkan stempel waktu Anda sendiri ke dalam alur untuk membantu mengumpulkan data pengaturan waktu di satu tempat. Selain mengumpulkan metrik, Anda dapat menggunakan ApplicationStartInfo untuk membantu mengoptimalkan langsung startup aplikasi; misalnya, Anda dapat menghilangkan pembuatan instance library terkait UI yang mahal dalam class Application saat aplikasi dimulai karena siaran.

Informasi mendetail tentang ukuran aplikasi

Sejak Android 8.0 (API level 26), Android telah menyertakan StorageStats.getAppBytes API yang merangkum ukuran aplikasi yang diinstal sebagai satu angka byte, yang merupakan jumlah ukuran APK, ukuran file yang diekstrak dari APK, dan file yang dihasilkan di perangkat seperti kode yang dikompilasi ahead-of-time (AOT). Jumlah ini tidak terlalu mendalam dalam hal cara aplikasi Anda menggunakan penyimpanan.

Android 15 menambahkan StorageStats.getAppBytesByDataType([type]) API, yang memungkinkan Anda mendapatkan insight tentang cara aplikasi menggunakan semua ruang tersebut, termasuk pemisahan file APK, AOT, dan kode terkait percepatan, metadata dex, library, dan profil yang dipandu.

Pembuatan profil yang dikelola aplikasi

Android 15 menyertakan class ProfilingManager, yang memungkinkan Anda mengumpulkan informasi pembuatan profil dari dalam aplikasi seperti heap dump, profil heap, sampling stack, dan lainnya. Fitur ini memberikan callback ke aplikasi Anda dengan tag yang disediakan untuk mengidentifikasi file output, yang dikirim ke direktori file aplikasi Anda. API melakukan pembatasan kapasitas untuk meminimalkan dampak performa.

Untuk menyederhanakan pembuatan permintaan pembuatan profil di aplikasi Anda, sebaiknya gunakan AndroidX API Profiling yang sesuai, yang tersedia di Core 1.15.0-rc01 atau yang lebih tinggi.

Peningkatan database SQLite

Android 15 memperkenalkan SQLite API yang mengekspos fitur lanjutan dari mesin SQLite dasar yang menargetkan masalah performa tertentu manifes dalam aplikasi. API ini disertakan dengan update SQLite ke versi 3.44.3.

Developer harus membaca praktik terbaik untuk performa SQLite untuk mendapatkan hasil maksimal dari database SQLite, terutama saat menangani {i>database <i}atau saat menjalankan kueri yang sensitif terhadap latensi.

  • Transaksi yang ditangguhkan (hanya baca): saat menerbitkan transaksi yang hanya-baca (tidak sertakan pernyataan tulis), gunakan beginTransactionReadOnly() dan beginTransactionWithListenerReadOnly(SQLiteTransactionListener) untuk melakukan transaksi DEFERRED hanya baca. Transaksi tersebut dapat berjalan secara bersamaan satu sama lain, dan jika {i>database<i} berada dalam mode WAL, mereka bisa berjalan serentak dengan transaksi IMMEDIATE atau EXCLUSIVE.
  • Jumlah dan ID baris: API ditambahkan untuk mengambil jumlah baris yang berubah atau ID baris terakhir yang disisipkan tanpa mengeluarkan kueri tambahan. getLastChangedRowCount() menampilkan jumlah baris yang dimasukkan, diperbarui, atau dihapus oleh pernyataan SQL terbaru dalam transaksi saat ini, sedangkan getTotalChangedRowCount() mengembalikan jumlah koneksi saat ini. getLastInsertRowId() menampilkan rowid baris terakhir yang akan disisipkan pada koneksi saat ini.
  • Pernyataan mentah: mengeluarkan pernyataan SQlite mentah, mengabaikan wrapper kemudahan dan overhead pemrosesan tambahan yang mungkin terjadi.

Update Android Dynamic Performance Framework

Android 15 continues our investment in the Android Dynamic Performance Framework (ADPF), a set of APIs that allow games and performance intensive apps to interact more directly with power and thermal systems of Android devices. On supported devices, Android 15 adds ADPF capabilities:

  • A power-efficiency mode for hint sessions to indicate that their associated threads should prefer power saving over performance, great for long-running background workloads.
  • GPU and CPU work durations can both be reported in hint sessions, allowing the system to adjust CPU and GPU frequencies together to best meet workload demands.
  • Thermal headroom thresholds to interpret possible thermal throttling status based on headroom prediction.

To learn more about how to use ADPF in your apps and games, head over to the documentation.

Privasi

Android 15 menyertakan berbagai fitur yang membantu developer aplikasi melindungi privasi pengguna.

Deteksi perekaman layar

Android 15 adds support for apps to detect that they are being recorded. A callback is invoked whenever the app transitions between being visible or invisible within a screen recording. An app is considered visible if activities owned by the registering process's UID are being recorded. This way, if your app is performing a sensitive operation, you can inform the user that they're being recorded.

val mCallback = Consumer<Int> { state ->
  if (state == SCREEN_RECORDING_STATE_VISIBLE) {
    // We're being recorded
  } else {
    // We're not being recorded
  }
}

override fun onStart() {
   super.onStart()
   val initialState =
      windowManager.addScreenRecordingCallback(mainExecutor, mCallback)
   mCallback.accept(initialState)
}

override fun onStop() {
    super.onStop()
    windowManager.removeScreenRecordingCallback(mCallback)
}

Kemampuan IntentFilter yang diperluas

Android 15 builds in support for more precise Intent resolution through UriRelativeFilterGroup, which contains a set of UriRelativeFilter objects that form a set of Intent matching rules that must each be satisfied, including URL query parameters, URL fragments, and blocking or exclusion rules.

These rules can be defined in the AndroidManifest XML file with the <uri-relative-filter-group> tag, which can optionally include an android:allow tag. These tags can contain <data> tags that use existing data tag attributes as well as the android:query and android:fragment attributes.

Here's an example of the AndroidManifest syntax:

<intent-filter android:autoVerify="true">
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.BROWSABLE" />
  <category android:name="android.intent.category.DEFAULT" />
  <data android:scheme="http" />
  <data android:scheme="https" />
  <data android:host="astore.com" />
  <uri-relative-filter-group>
    <data android:pathPrefix="/auth" />
    <data android:query="region=na" />
  </uri-relative-filter-group>
  <uri-relative-filter-group android:allow="false">
    <data android:pathPrefix="/auth" />
    <data android:query="mobileoptout=true" />
  </uri-relative-filter-group>
  <uri-relative-filter-group android:allow="false">
    <data android:pathPrefix="/auth" />
    <data android:fragmentPrefix="faq" />
  </uri-relative-filter-group>
</intent-filter>

Ruang privasi

The private space can be unlocked and locked to show or hide sensitive apps on a device.

Private space lets users create a separate space on their device where they can keep sensitive apps away from prying eyes, under an additional layer of authentication. The private space uses a separate user profile. The user can choose to use the device lock or a separate lock factor for the private space.

Apps in the private space show up in a separate container in the launcher, and are hidden from the recents view, notifications, settings, and from other apps when the private space is locked. User-generated and downloaded content (such as media or files) and accounts are separated between the private space and the main space. The system sharesheet and the photo picker can be used to give apps access to content across spaces when the private space is unlocked.

Users can't move existing apps and their data into the private space. Instead, users select an install option in the private space to install an app using whichever app store they prefer. Apps in the private space are installed as separate copies from any apps in the main space (new copies of the same app).

When a user locks the private space, the profile is stopped. While the profile is stopped, apps in the private space are no longer active and can't perform foreground or background activities, including showing notifications.

We recommend that you test your app with private space to make sure your app works as expected, especially if your app falls into one of the following categories:

Membuat kueri pilihan pengguna terbaru untuk Akses Foto yang Dipilih

Aplikasi kini hanya dapat menyoroti foto dan video yang baru saja dipilih saat akses sebagian ke izin media diberikan. Fitur ini dapat meningkatkan pengalaman pengguna untuk aplikasi yang sering meminta akses ke foto dan video. Untuk menggunakan fitur ini di aplikasi Anda, aktifkan argumen QUERY_ARG_LATEST_SELECTION_ONLY saat membuat kueri MediaStore melalui ContentResolver.

Kotlin

val externalContentUri = MediaStore.Files.getContentUri("external")

val mediaColumns = arrayOf(
   FileColumns._ID,
   FileColumns.DISPLAY_NAME,
   FileColumns.MIME_TYPE,
)

val queryArgs = bundleOf(
   // Return only items from the last selection (selected photos access)
   QUERY_ARG_LATEST_SELECTION_ONLY to true,
   // Sort returned items chronologically based on when they were added to the device's storage
   QUERY_ARG_SQL_SORT_ORDER to "${FileColumns.DATE_ADDED} DESC",
   QUERY_ARG_SQL_SELECTION to "${FileColumns.MEDIA_TYPE} = ? OR ${FileColumns.MEDIA_TYPE} = ?",
   QUERY_ARG_SQL_SELECTION_ARGS to arrayOf(
       FileColumns.MEDIA_TYPE_IMAGE.toString(),
       FileColumns.MEDIA_TYPE_VIDEO.toString()
   )
)

Java

Uri externalContentUri = MediaStore.Files.getContentUri("external");

String[] mediaColumns = {
    FileColumns._ID,
    FileColumns.DISPLAY_NAME,
    FileColumns.MIME_TYPE
};

Bundle queryArgs = new Bundle();
queryArgs.putBoolean(MediaStore.QUERY_ARG_LATEST_SELECTION_ONLY, true);
queryArgs.putString(MediaStore.QUERY_ARG_SQL_SORT_ORDER, FileColumns.DATE_ADDED + " DESC");
queryArgs.putString(MediaStore.QUERY_ARG_SQL_SELECTION, FileColumns.MEDIA_TYPE + " = ? OR " + FileColumns.MEDIA_TYPE + " = ?");
queryArgs.putStringArray(MediaStore.QUERY_ARG_SQL_SELECTION_ARGS, new String[] {
    String.valueOf(FileColumns.MEDIA_TYPE_IMAGE),
    String.valueOf(FileColumns.MEDIA_TYPE_VIDEO)
});

Privacy Sandbox di Android

Android 15 menyertakan ekstensi Layanan Iklan Android terbaru, yang menggabungkan versi terbaru Privacy Sandbox di Android. Penambahan ini adalah bagian dari upaya kami untuk mengembangkan teknologi yang meningkatkan privasi pengguna dan memungkinkan pengalaman iklan yang dipersonalisasi secara efektif untuk aplikasi seluler. Halaman sandbox privasi kami memiliki informasi selengkapnya tentang Privacy Sandbox di program pratinjau developer dan beta Android untuk membantu Anda memulai.

Health Connect

Android 15 mengintegrasikan ekstensi terbaru di seputar Health Connect dari Android, platform terpusat dan aman untuk mengelola serta membagikan data kesehatan dan kebugaran yang dikumpulkan aplikasi. Update ini menambahkan dukungan untuk jenis data tambahan di seluruh kebugaran, gizi, suhu kulit, rencana latihan, dan lainnya.

Pelacakan suhu kulit memungkinkan pengguna menyimpan dan membagikan data suhu yang lebih akurat dari perangkat wearable atau perangkat pelacakan lainnya.

Rencana latihan adalah rencana olahraga terstruktur untuk membantu pengguna mencapai kebugaran mereka tujuan tersebut. Dukungan paket pelatihan mencakup berbagai penyelesaian dan performa tujuan:

Pelajari lebih lanjut update terbaru untuk Health Connect di Android dalam presentasi Membuat pengalaman yang dapat disesuaikan dengan Android Health dari Google I/O.

Berbagi layar aplikasi

Android 15 mendukung berbagi layar aplikasi sehingga pengguna dapat berbagi atau merekam jendela aplikasi, bukan seluruh layar perangkat. Fitur ini, yang pertama kali diaktifkan di Android 14 QPR2, mencakup callback MediaProjection yang memungkinkan aplikasi Anda menyesuaikan pengalaman berbagi layar aplikasi. Perhatikan bahwa untuk aplikasi yang menargetkan Android 14 (level API 34) atau yang lebih tinggi, izin pengguna diperlukan untuk setiap sesi pengambilan MediaProjection.

Pengalaman pengguna dan UI sistem

Android 15 memberi developer dan pengguna aplikasi kontrol dan fleksibilitas yang lebih besar untuk mengonfigurasi perangkat agar sesuai dengan kebutuhan mereka.

Untuk mempelajari lebih lanjut cara menggunakan peningkatan terbaru di Android 15 untuk meningkatkan pengalaman pengguna aplikasi Anda, tonton sesi Meningkatkan pengalaman pengguna aplikasi Android Anda dari Google I/O.

Pratinjau widget yang lebih kaya dengan Generated Previews API

Before Android 15, the only way to provide widget picker previews was to specify a static image or layout resource. These previews often differ significantly from the look of the actual widget when it is placed on the home screen. Also, static resources can't be created with Jetpack Glance, so a Glance developer had to screenshot their widget or create an XML layout to have a widget preview.

Android 15 adds support for generated previews. This means that app widget providers can generate RemoteViews to use as the picker preview, instead of a static resource.

Apps can provide Remote Views to the Widget Picker, so they can update the content in the picker to be more representative of what the user will see.

Push API

Apps can provide generated previews through a push API. Apps can provide previews at any point in their lifecycle, and don't receive an explicit request from the host to provide previews. Previews are persisted in AppWidgetService, and hosts can request them on-demand. The following example loads an XML widget layout resource and sets it as the preview:

AppWidgetManager.getInstance(appContext).setWidgetPreview(
   ComponentName(
       appContext,
       SociaLiteAppWidgetReceiver::class.java
   ),
   AppWidgetProviderInfo.WIDGET_CATEGORY_HOME_SCREEN,
   RemoteViews("com.example", R.layout.widget_preview)
)

The expected flow is:

  1. At any time, the widget provider calls setWidgetPreview. The provided previews are persisted in AppWidgetService with other provider info.
  2. setWidgetPreview notifies hosts of an updated preview through the AppWidgetHost.onProvidersChanged callback. In response, the widget host reloads all of its provider information.
  3. When displaying a widget preview, the host checks AppWidgetProviderInfo.generatedPreviewCategories, and if the chosen category is available, calls AppWidgetManager.getWidgetPreview to return the saved preview for this provider.

When to call setWidgetPreview

Because there is no callback to provide previews, apps can choose to send previews at any point when they are running. How often to update the preview depends on the widget's use case.

The following list describes the two main categories of preview use cases:

  • Providers that show real data in their widget previews, such as personalized or recent information. These providers can set the preview once the user has signed in or has done initial configuration in their app. After this, they can set up a periodic task to update the previews at their chosen cadence. Examples of this type of widget could be a photo, calendar, weather or news widget.
  • Providers that show static information in previews or quick-action widgets that don't display any data. These providers can set previews once, when the app first launches. Examples of this type of widget include a drive quick actions widget or chrome shortcuts widget.

Some providers might show static previews on the hub mode picker, but real information on the homescreen picker. These providers should follow the guidance for both of these use cases to set previews.

Picture-in-Picture

Android 15 memperkenalkan perubahan pada Picture-in-Picture (PiP) yang memastikan transisi yang lebih lancar saat memasuki mode PiP. Hal ini akan bermanfaat bagi aplikasi dengan elemen UI yang ditempatkan di atas UI utamanya, yang akan masuk ke PiP.

Developer menggunakan callback onPictureInPictureModeChanged untuk menentukan logika yang mengubah visibilitas elemen UI overlay. Callback ini dipicu saat animasi masuk atau keluar PiP selesai. Dimulai dalam Android 15, class PictureInPictureUiState menyertakan status lain.

Dengan status UI ini, aplikasi yang menargetkan Android 15 (API level 35) akan mengamati Callback Activity#onPictureInPictureUiStateChanged dipanggil dengan isTransitioningToPip() segera setelah animasi PiP dimulai. Ada banyak elemen UI yang tidak relevan untuk aplikasi saat dalam mode PiP, untuk contoh tampilan atau tata letak yang menyertakan informasi seperti saran, teks mendatang video, rating, dan judul. Saat aplikasi masuk ke mode PiP, gunakan Callback onPictureInPictureUiStateChanged untuk menyembunyikan elemen UI ini. Jika aplikasi masuk ke mode layar penuh dari jendela PiP, gunakan Callback onPictureInPictureModeChanged untuk memperlihatkan elemen ini, seperti yang ditunjukkan pada contoh berikut:

override fun onPictureInPictureUiStateChanged(pipState: PictureInPictureUiState) {
        if (pipState.isTransitioningToPip()) {
          // Hide UI elements
        }
    }
override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean) {
        if (isInPictureInPictureMode) {
          // Unhide UI elements
        }
    }

Tombol visibilitas cepat dari elemen UI yang tidak relevan (untuk jendela PiP) membantu memastikan animasi masuk PiP yang lebih halus dan bebas kedipan.

Aturan Jangan Ganggu yang ditingkatkan

AutomaticZenRule memungkinkan aplikasi menyesuaikan aturan Pengelolaan Perhatian (Jangan Ganggu) dan memutuskan kapan harus mengaktifkan atau menonaktifkannya. Android 15 menyempurnakan aturan ini secara signifikan dengan tujuan meningkatkan {i>user experience<i}. Peningkatan berikut disertakan:

  • Menambahkan jenis ke AutomaticZenRule, sehingga sistem dapat menerapkan perlakuan terhadap beberapa aturan.
  • Menambahkan ikon ke AutomaticZenRule, membantu membuat mode lebih menarik dikenali.
  • Menambahkan string triggerDescription ke AutomaticZenRule yang mendeskripsikan kondisi tempat aturan harus diaktifkan bagi pengguna.
  • Ditambahkan ZenDeviceEffects ke AutomaticZenRule, yang memungkinkan aturan memicu hal-hal seperti hitam putih layar, mode malam, atau meredupkan wallpaper.

Menetapkan VibrationEffect untuk saluran notifikasi

Android 15 mendukung setelan getaran yang kaya untuk notifikasi masuk dengan saluran menggunakan NotificationChannel.setVibrationEffect, sehingga pengguna dapat membedakan berbagai jenis notifikasi tanpa hanya dengan melihat perangkat mereka.

Chip status bar proyeksi media dan penghentian otomatis

Media projection can expose private user information. A new, prominent status bar chip makes users aware of any ongoing screen projection. Users can tap the chip to stop screen casting, sharing, or recording. Also, for a more intuitive user experience, any in‑progress screen projection now automatically stops when the device screen is locked.

Chip status bar untuk berbagi layar, transmisi, dan perekaman.

Perangkat layar besar dan faktor bentuk

Android 15 memberi aplikasi Anda dukungan untuk mendapatkan hasil maksimal dari faktor bentuk Android, termasuk layar besar, perangkat flippable, dan perangkat foldable.

Multitasking layar besar yang ditingkatkan

Android 15 gives users better ways to multitask on large screen devices. For example, users can save their favorite split-screen app combinations for quick access and pin the taskbar on screen to quickly switch between apps. This means that making sure your app is adaptive is more important than ever.

Google I/O has sessions on Building adaptive Android apps and Building UI with the Material 3 adaptive library that can help, and our documentation has more to help you Design for large screens.

Dukungan layar luar

Aplikasi Anda dapat mendeklarasikan properti yang digunakan Android 15 untuk memungkinkan Application atau Activity ditampilkan di layar penutup kecil perangkat yang dapat dibalik yang didukung. Layar ini terlalu kecil untuk dianggap sebagai target yang kompatibel untuk menjalankan aplikasi Android, tetapi aplikasi Anda dapat memilih untuk mendukungnya, sehingga aplikasi Anda tersedia di lebih banyak tempat.

Konektivitas

Android 15 mengupdate platform untuk memberi aplikasi Anda akses ke kemajuan terbaru dalam teknologi nirkabel dan komunikasi.

Dukungan satelit

Android 15 continues to extend platform support for satellite connectivity and includes some UI elements to ensure a consistent user experience across the satellite connectivity landscape.

Apps can use ServiceState.isUsingNonTerrestrialNetwork() to detect when a device is connected to a satellite, giving them more awareness of why full network services might be unavailable. Additionally, Android 15 provides support for SMS and MMS apps as well as preloaded RCS apps to use satellite connectivity for sending and receiving messages.

A notification appears when the device connects to a satellite.

Pengalaman NFC yang lebih lancar

Android 15 berupaya membuat pengalaman pembayaran nirsentuh menjadi lebih lancar dan andal sekaligus terus mendukung ekosistem aplikasi NFC Android yang andal. Di perangkat yang didukung, aplikasi dapat meminta NfcAdapter untuk memasuki mode pengamatan, tempat perangkat memproses tetapi tidak merespons pembaca NFC, yang mengirim PollingFrame objek layanan NFC aplikasi untuk diproses. Objek PollingFrame dapat digunakan untuk melakukan autentikasi sebelum komunikasi pertama ke pembaca NFC, sehingga memungkinkan transaksi sekali ketuk dalam banyak kasus.

Selain itu, aplikasi dapat mendaftarkan filter di perangkat yang didukung sehingga aplikasi dapat diberi tahu tentang aktivitas loop polling, yang memungkinkan operasi yang lancar dengan beberapa aplikasi yang mendukung NFC.

Peran Wallet

Android 15 introduces a Wallet role that allows tighter integration with the user's preferred wallet app. This role replaces the NFC default contactless payment setting. Users can manage the Wallet role holder by navigating to Settings > Apps > Default Apps.

The Wallet role is used when routing NFC taps for AIDs registered in the payment category. Taps always go to the Wallet role holder unless another app that is registered for the same AID is running in the foreground.

This role is also used to determine where the Wallet Quick Access tile should go when activated. When the role is set to "None", the Quick Access tile isn't available and payment category NFC taps are only delivered to the foreground app.

Keamanan

Android 15 membantu Anda meningkatkan keamanan aplikasi, melindungi data aplikasi, dan memberi pengguna lebih banyak transparansi dan kontrol atas data mereka. Tonton video Menjaga keamanan pengguna di Android dari Google I/O untuk mengetahui lebih lanjut tindakan yang kami lakukan untuk meningkatkan pengamanan pengguna dan melindungi aplikasi Anda dari ancaman baru.

Mengintegrasikan Credential Manager dengan isi otomatis

Mulai Android 15, developer dapat menautkan tampilan tertentu seperti kolom nama pengguna atau sandi dengan permintaan Pengelola Kredensial, sehingga lebih mudah untuk memberikan pengalaman pengguna yang disesuaikan selama proses login. Saat pengguna berfokus pada salah satu tampilan ini, permintaan yang sesuai akan dikirim ke Pengelola Kredensial. Kredensial yang dihasilkan digabungkan di seluruh penyedia dan ditampilkan di UI penggantian isi otomatis, seperti saran inline atau saran dropdown. Library androidx.credentials Jetpack adalah endpoint pilihan yang dapat digunakan developer dan akan segera tersedia untuk lebih meningkatkan fitur ini di Android 15 dan yang lebih baru.

Mengintegrasikan pendaftaran dan login sekali ketuk dengan perintah biometrik

Credential Manager integrates biometric prompts into the credential creation and sign-in processes, eliminating the need for providers to manage biometric prompts. As a result, credential providers only need to focus on the results of the create and get flows, augmented with the biometric flow result. This simplified process creates a more efficient and streamlined credential creation and retrieval process.

Pengelolaan kunci untuk enkripsi end-to-end

We are introducing the E2eeContactKeysManager in Android 15, which facilitates end-to-end encryption (E2EE) in your Android apps by providing an OS-level API for the storage of cryptographic public keys.

The E2eeContactKeysManager is designed to integrate with the platform contacts app to give users a centralized way to manage and verify their contacts' public keys.

Pemeriksaan izin pada URI konten

Android 15 introduces a set of APIs that perform permission checks on content URIs:

Aksesibilitas

Android 15 menambahkan fitur yang meningkatkan aksesibilitas bagi pengguna.

Braille yang Lebih Baik

Di Android 15, kami telah memungkinkan TalkBack untuk mendukung layar Braille yang menggunakan standar HID melalui USB dan Bluetooth aman.

Standar ini, seperti yang digunakan oleh mouse dan keyboard, akan membantu Android mendukung berbagai penampil Braille yang lebih luas dari waktu ke waktu.

Internasionalisasi

Android 15 menambahkan fitur dan kemampuan yang melengkapi pengalaman pengguna saat perangkat digunakan dalam bahasa yang berbeda.

Font variabel CJK

Mulai Android 15, file font untuk bahasa China, Jepang, dan Korea (CJK), NotoSansCJK, kini menjadi font variabel. Font variabel membuka kemungkinan untuk tipografi kreatif dalam bahasa CJK. Desainer dapat menjelajahi berbagai gaya yang lebih luas dan membuat tata letak yang menarik secara visual yang sebelumnya sulit atau tidak mungkin dicapai.

Tampilan font variabel untuk bahasa China, Jepang, dan Korea (CJK) dengan lebar font yang berbeda.

Penjustifikasi antar-karakter

Mulai Android 15, teks dapat dibenarkan menggunakan spasi huruf dengan menggunakan JUSTIFICATION_MODE_INTER_CHARACTER. Justifikasi antarkata pertama kali diperkenalkan di Android 8.0 (API level 26), dan justifikasi antarkarakter memberikan kemampuan serupa untuk bahasa yang menggunakan karakter spasi kosong untuk segmentasi, seperti China, Jepang, dan lainnya.

Tata letak untuk teks bahasa Jepang menggunakan JUSTIFICATION_MODE_NONE.
Tata letak untuk teks bahasa Inggris menggunakan JUSTIFICATION_MODE_NONE.


Tata letak untuk teks bahasa Jepang menggunakan JUSTIFICATION_MODE_INTER_WORD.
Tata letak untuk teks bahasa Inggris menggunakan JUSTIFICATION_MODE_INTER_WORD.


Tata letak untuk teks bahasa Jepang menggunakan JUSTIFICATION_MODE_INTER_CHARACTER.
Tata letak untuk teks bahasa Inggris menggunakan JUSTIFICATION_MODE_INTER_CHARACTER.

Konfigurasi jeda baris otomatis

Android started supporting phrase-based line breaks for Japanese and Korean in Android 13 (API level 33). However, while phrase-based line breaks improve the readability of short lines of text, they don't work well for long lines of text. In Android 15, apps can apply phrase-based line breaks only for short lines of text, using the LINE_BREAK_WORD_STYLE_AUTO option. This option selects the best word style option for the text.

For short lines of text, phrase-based line breaks are used, functioning the same as LINE_BREAK_WORD_STYLE_PHRASE, as shown in the following image:

For short lines of text, LINE_BREAK_WORD_STYLE_AUTO applies phrase-based line breaks to improve the readability of the text. This is the same as applying LINE_BREAK_WORD_STYLE_PHRASE.

For longer lines of text, LINE_BREAK_WORD_STYLE_AUTO uses a no line-break word style, functioning the same as LINE_BREAK_WORD_STYLE_NONE, as shown in the following image:

For long lines of text, LINE_BREAK_WORD_STYLE_AUTO applies no line-break word style to improve the readability of the text. This is the same as applying LINE_BREAK_WORD_STYLE_NONE.

Font Hentaigana Jepang Tambahan

Di Android 15, file font untuk huruf Hiragana Jepang lama (yang dikenal sebagai Hentaigana) secara default dipaketkan. Bentuk unik karakter Hentaigana dapat menambahkan gaya unik pada karya seni atau desain sekaligus membantu mempertahankan transmisi dan pemahaman yang akurat tentang dokumen Jepang kuno.

Karakter dan gaya teks untuk Hentaigana Jepang font.

VideoLAN cone Copyright (c) 1996-2010 VideoLAN. This logo or a modified version may be used or modified by anyone to refer to the VideoLAN project or any product developed by the VideoLAN team, but does not indicate endorsement by the project.

Vulkan and the Vulkan logo are registered trademarks of the Khronos Group Inc.

OpenGL is a registered trademark and the OpenGL ES logo is a trademark of Hewlett Packard Enterprise used by permission by Khronos.