Ringkasan Fitur dan API

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

Untuk mengetahui daftar mendetail tentang API yang baru, diubah, dan dihapus, baca laporan perbedaan API. Untuk mengetahui detail tentang API baru, buka referensi API Android — API baru ditandai agar lebih mudah dilihat. Selain itu, untuk mempelajari area mana saja dalam aplikasi perubahan platform yang mungkin memengaruhi aplikasi Anda, pastikan untuk meninjau perubahan perilaku yang memengaruhi aplikasi saat menargetkan Android 15 dan perubahan perilaku yang memengaruhi semua aplikasi terlepas dari targetSdkVersion.

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 informasi selengkapnya tentang fitur dan solusi developer terbaru untuk media dan kamera Android, lihat diskusi Membangun pengalaman media dan kamera Android modern dari Google I/O.

Booster Cahaya Rendah

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

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

Jika Anda mengaktifkan Peningkatan Cahaya Rendah, fitur akan otomatis menyala saat level cahaya rendah, dan dinonaktifkan saat ada lebih banyak cahaya.

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

Untuk informasi selengkapnya, lihat Peningkatan Cahaya Rendah.

Kontrol kamera dalam aplikasi

Android 15 menambahkan ekstensi baru untuk kontrol yang lebih besar atas hardware kamera dan algoritmanya di perangkat yang didukung:

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

Kontrol headroom HDR

Android 15 memilih headroom HDR yang sesuai untuk kemampuan perangkat dasar dan kedalaman bit panel. Untuk halaman yang memiliki banyak konten SDR, seperti aplikasi pesan yang menampilkan satu thumbnail HDR, perilaku ini dapat berpengaruh buruk pada 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 tampak lebih seragam daripada kecerahan di layar kanan, yang menyimulasikan kemungkinan masalah headroom saat konten HDR dan SDR digabungkan. Dengan menyesuaikan headroom HDR, Anda dapat mencapai keseimbangan yang lebih baik antara konten SDR dan HDR.

Kontrol kenyaringan

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

Untuk mengaktifkan fitur ini, Anda harus memastikan metadata kenyaringan tersedia di konten AAC dan mengaktifkan fitur platform di aplikasi Anda. Untuk itu, Anda membuat instance objek LoudnessCodecController dengan memanggil metode factory create-nya dengan ID sesi audio dari AudioTrack terkait; tindakan ini akan otomatis mulai menerapkan update audio. Anda dapat meneruskan OnLoudnessCodecUpdateListener untuk mengubah atau memfilter parameter kebisingan sebelum diterapkan pada 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 menghubungkan ke perangkat MIDI 2.0 menggunakan USB, yang berkomunikasi menggunakan Universal MIDI Packets (UMP). Android 15 memperluas dukungan UMP ke aplikasi MIDI virtual, sehingga aplikasi komposisi dapat mengontrol aplikasi synthesizer sebagai perangkat MIDI 2.0 virtual seperti yang dilakukan dengan perangkat USB MIDI 2.0.

Dekode software AV1 yang lebih efisien

Logo dav1d

dav1d, dekoder software AV1 yang populer dari VideoLAN kini tersedia untuk perangkat Android yang tidak mendukung dekode AV1 di hardware. dav1d berperforma hingga 3x lebih banyak dibandingkan dekoder software AV1 lama, sehingga memungkinkan pemutaran HD AV1 bagi lebih banyak pengguna, termasuk beberapa perangkat tingkat rendah dan menengah.

Untuk saat ini, aplikasi Anda harus memilih untuk menggunakan dav1d dengan memanggilnya berdasarkan nama "c2.android.av1-dav1d.decoder". dav1d akan dijadikan sebagai dekoder software AV1 default dalam update berikutnya. Dukungan ini distandardisasi 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 ini untuk membantu Anda mewujudkan visi dengan lebih mudah.

Update OpenJDK 17

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

Fitur dan peningkatan utama berikut disertakan:

API ini diupdate di lebih dari satu miliar perangkat yang menjalankan Android 12 (API level 31) dan yang lebih baru melalui update Sistem Google Play, sehingga Anda dapat menargetkan fitur pemrograman terbaru.

Peningkatan PDF

Android 15 menyertakan peningkatan substansial pada PdfRenderer API. Aplikasi dapat menyertakan fitur lanjutan seperti rendering file yang dilindungi sandi, anotasi, pengeditan formulir, penelusuran, dan pemilihan dengan salinan. Pengoptimalan PDF terlinier didukung untuk mempercepat tampilan PDF lokal dan mengurangi penggunaan resource.

Update terbaru untuk rendering PDF mencakup fitur seperti penelusuran file PDF tersemat.

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

Kami menghargai masukan Anda tentang peningkatan yang telah kami lakukan pada platform API PdfRenderer, dan kami berencana untuk mempermudah penggabungan API ini ke dalam aplikasi Anda dengan library Android Jetpack mendatang.

Peningkatan kualitas pengalihan bahasa otomatis

Android 14 menambahkan pengenalan multibahasa di perangkat dengan peralihan otomatis antar-bahasa, tetapi hal ini dapat menyebabkan kata dihapus, terutama saat bahasa beralih dengan lebih sedikit jeda di antara kedua ucapan. Android 15 menambahkan kontrol tambahan untuk membantu aplikasi menyesuaikan peralihan 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 tombol yang ditentukan. Opsi ini sangat berguna jika Anda mengharapkan bahwa akan ada satu bahasa yang diucapkan selama sesi yang harus terdeteksi otomatis.

Peningkatan API Font Variabel OpenType

Android 15 提高了 OpenType 可变字体的易用性。您现在可以使用可变字体创建 FontFamily 实例,而无需使用 buildVariableFamily API 指定粗细轴。文本渲染程序会覆盖 wght 轴的值以匹配显示的文本。

使用新的 API,这大大简化了创建 Typeface 的代码:

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();

以前,如需创建相同的 Typeface,您需要更多代码:

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();

以下示例展示了同时使用新旧 API 创建的 Typeface 如何呈现:

使用新旧 API 时 Typeface 渲染有何不同的示例

在此示例中,使用旧 API 创建的 Typeface 无法为 350、450、550 和 650 Font 实例创建准确的字体粗细,因此渲染程序会回退到最接近的粗细。因此,在此例中,会渲染 300 而不是 350,渲染 400 而不是 450,依此类推。相比之下,使用新 API 创建的 Typeface 会为给定权重动态创建 Font 实例,因此也会为 350、450、550 和 650 呈现准确的权重。

Kontrol pemisah baris terperinci

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

Misalnya, resource string berikut tidak menyertakan jeda baris, dan merender dengan teks "Pixel 8 Pro." yang pecah 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 jeda baris:

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

Perbedaan cara string ini dirender ditampilkan dalam gambar berikut:

Tata letak untuk baris teks dengan frasa "Pixel 8 Pro". tidak digabungkan menggunakan tag <nobreak>.
Tata letak untuk baris teks yang sama tempat frasa "Pixel 8 Pro". 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 kini menyertakan dukungan tingkat OS untuk pengarsipan dan pembatalan pengarsipan aplikasi sehingga memudahkan semua app store menerapkannya.

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

Grafis

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

Memodernisasi akses GPU Android

Vulkan 徽标

从早期开始,核心操作系统在单个 CPU 上运行,GPU 通过基于固定函数流水线的 API 进行访问,Android 硬件已经发生了很大变化。从 Android 7.0(API 级别 24)开始,NDK 中就已提供 Vulkan® 图形 API。它采用较低级别的抽象,可以更好地反映现代 GPU 硬件,能够更好地进行扩展以支持多个 CPU 核心,并可减少 CPU 驱动程序开销,从而提升应用性能。所有现代游戏引擎都支持 Vulkan。

Vulkan 是 Android 的 GPU 首选接口。因此,Android 15 包含 ANGLE 作为可选层,用于在 Vulkan 上运行 OpenGL® ES。迁移到 ANGLE 会将 Android OpenGL 实现标准化,以提高兼容性,在某些情况下还可提升性能。您可以使用 ANGLE 测试 OpenGL ES 应用的稳定性和性能,方法是在 Android 15 上依次点击设置 -> 系统 -> 开发者选项 -> 实验性功能:启用 ANGLE,启用开发者选项。

Vulkan 上的 Android ANGLE 路线图

Android GPU API 即将发生的变更的路线图。

作为简化 GPU 堆栈的一部分,今后我们将在更多新设备上以 GL 系统驱动程序的形式提供 ANGLE,预计未来将只能通过 ANGLE 使用 OpenGL/ES。不过,我们计划在所有设备上继续支持 OpenGL ES

建议的后续措施

使用开发者选项选择适用于 OpenGL ES 的 ANGLE 驱动程序并测试您的应用。对于新项目,我们强烈建议您使用适用于 C/C++ 的 Vulkan。

Peningkatan untuk Canvas

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

  • 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, sementara clipOutShader menetapkan klip ke perbedaan klip saat ini dan shader, masing-masing memperlakukan shader sebagai masker alfa. Hal ini mendukung penggambaran bentuk yang kompleks secara efisien.

Performa dan baterai

Android akan melanjutkan fokusnya untuk membantu Anda meningkatkan performa dan kualitas aplikasi. Android 15 memperkenalkan API baru yang membantu membuat tugas di aplikasi Anda lebih efisien untuk dijalankan, mengoptimalkan performa aplikasi, dan mengumpulkan insight tentang aplikasi Anda.

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

API ApplicationStartInfo

Di versi Android sebelumnya, startup aplikasi menjadi sedikit misteri. Terkadang sulit untuk menentukan dalam aplikasi Anda apakah dimulai dari kondisi dingin, hangat, atau panas. Selain itu, sulit untuk mengetahui berapa lama waktu yang dihabiskan aplikasi Anda selama berbagai fase peluncuran: melakukan fork proses, memanggil onCreate, menggambar frame pertama, dan banyak lagi. Saat class Application dibuat instance, Anda tidak dapat mengetahui apakah aplikasi dimulai dari siaran, penyedia konten, tugas, pencadangan, booting selesai, alarm, atau Activity.

ApplicationStartInfo API di Android 15 menyediakan semua ini dan banyak lagi. 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 langsung mengoptimalkan startup aplikasi; misalnya, Anda dapat menghilangkan pembuatan instance library terkait UI yang mahal dalam class Application saat aplikasi dimulai karena siaran.

Detail informasi ukuran aplikasi

Sejak Android 8.0 (level API 26), Android telah menyertakan StorageStats.getAppBytes API yang merangkum ukuran aplikasi yang diinstal sebagai satu jumlah byte, yang merupakan jumlah ukuran APK, ukuran file yang diekstrak dari APK, dan file yang dihasilkan di perangkat seperti kode yang dikompilasi di awal (AOT). Jumlah ini tidak terlalu memiliki gambaran terkait cara aplikasi Anda menggunakan penyimpanan.

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

Pembuatan profil yang dikelola aplikasi

Android 15 menyertakan class ProfilingManager yang baru, yang memungkinkan Anda mengumpulkan informasi pembuatan profil dari dalam aplikasi. Kami berencana menggabungkan ini dengan Android Jetpack API yang akan menyederhanakan pembuatan permintaan pembuatan profil, tetapi API inti akan memungkinkan pengumpulan heap dump, profil heap, pengambilan sampel stack, dan lainnya. Fungsi ini memberikan callback ke aplikasi Anda dengan tag yang disediakan untuk mengidentifikasi file output, yang dikirim ke direktori file aplikasi. API melakukan pembatasan kapasitas untuk meminimalkan dampak performa.

Peningkatan database SQLite

Android 15 memperkenalkan SQLite API baru yang mengekspos fitur lanjutan dari mesin SQLite dasar yang menargetkan masalah performa tertentu yang dapat terjadi dalam aplikasi.

Developer harus mempelajari praktik terbaik untuk performa SQLite guna memaksimalkan database SQLite, terutama saat bekerja dengan database besar atau saat menjalankan kueri yang sensitif terhadap latensi.

  • Transaksi yang ditangguhkan dalam mode hanya baca: saat mengeluarkan transaksi yang bersifat hanya baca (jangan sertakan pernyataan tulis), gunakan beginTransactionReadOnly() dan beginTransactionWithListenerReadOnly(SQLiteTransactionListener) untuk menerbitkan transaksi DEFERRED hanya baca. Transaksi tersebut dapat berjalan bersamaan satu sama lain, dan jika database berada dalam mode WAL, transaksi dapat berjalan bersamaan dengan transaksi IMMEDIATE atau EXCLUSIVE.
  • Jumlah baris dan ID: API baru ditambahkan untuk mengambil jumlah baris yang diubah atau ID baris yang terakhir disisipkan tanpa mengeluarkan kueri tambahan. getLastChangedRowCount() menampilkan jumlah baris yang disisipkan, diperbarui, atau dihapus oleh pernyataan SQL terbaru dalam transaksi saat ini, sedangkan getTotalChangedRowCount() menampilkan jumlah pada koneksi saat ini. getLastInsertRowId() menampilkan rowid dari baris terakhir yang akan disisipkan pada koneksi saat ini.
  • Pernyataan mentah: mengeluarkan pernyataan SQlite mentah, dengan mengabaikan wrapper kemudahan dan overhead pemrosesan tambahan yang mungkin dikenakannya.

Update Android Dynamic Performance Framework

Android 15 melanjutkan investasi kami dalam Android Dynamic Performance Framework (ADPF), sekumpulan API yang memungkinkan game dan aplikasi dengan performa intensif untuk berinteraksi lebih langsung dengan sistem termal dan daya perangkat Android. Pada perangkat yang didukung, Android 15 akan menambahkan kemampuan ADPF baru:

  • Mode efisiensi daya untuk sesi petunjuk guna menunjukkan bahwa thread yang terkait lebih mengutamakan penghematan daya daripada performa, bagus untuk workload latar belakang yang berjalan lama.
  • Durasi kerja GPU dan CPU dapat dilaporkan dalam sesi petunjuk, sehingga sistem dapat menyesuaikan frekuensi CPU dan GPU secara bersamaan agar dapat memenuhi permintaan workload sebaik mungkin.
  • Batas headroom termal untuk menafsirkan kemungkinan status throttling termal berdasarkan prediksi headroom.

Untuk mempelajari lebih lanjut cara menggunakan ADPF di aplikasi dan game Anda, buka dokumentasinya.

Privasi

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

Deteksi perekaman layar

Android 15 menambahkan dukungan untuk aplikasi untuk mendeteksi bahwa aplikasi sedang direkam. Callback dipanggil setiap kali aplikasi bertransisi antara terlihat atau tidak terlihat dalam perekaman layar. Aplikasi dianggap terlihat jika aktivitas yang dimiliki oleh UID proses pendaftaran direkam. Dengan demikian, jika aplikasi menjalankan operasi sensitif, Anda dapat memberi tahu pengguna bahwa mereka sedang direkam.

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 构建了通过 UriRelativeFilterGroup 支持更精确的 Intent 解析,其中包含一组 UriRelativeFilter 对象,这些对象构成了一组必须满足的 Intent 匹配规则,其中包括网址查询参数、网址片段以及屏蔽或排除规则。

您可以使用新的 <uri-relative-filter-group> 标记在 AndroidManifest XML 文件中定义这些规则,也可以选择包含 android:allow 标记。这些标记可以包含使用现有数据标记属性以及新的 android:queryandroid:fragment 属性的 <data> 标记。

下面是 AndroidManifest 语法的示例:

<intent-filter>
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.BROWSABLE" />
  <data android:scheme="http" />
  <data android:scheme="https" />
  <data android:domain="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

Ruang pribadi dapat dibuka dan dikunci untuk menampilkan atau menyembunyikan aplikasi sensitif di perangkat.

Ruang pribadi memungkinkan pengguna membuat ruang terpisah di perangkat mereka tempat mereka dapat menjauhkan aplikasi sensitif dari pengintip, dengan lapisan autentikasi tambahan. Ruang pribadi menggunakan profil pengguna terpisah. Pengguna dapat memilih untuk menggunakan kunci perangkat atau faktor kunci terpisah untuk ruang pribadi.

Aplikasi di ruang pribadi akan muncul dalam penampung terpisah di peluncur dan disembunyikan dari tampilan terbaru, notifikasi, setelan, dan dari aplikasi lain saat ruang pribadi dikunci. Konten buatan pengguna dan yang didownload (seperti media atau file) dan akun dipisahkan antara ruang pribadi dan ruang utama. Sharesheet sistem dan pemilih foto dapat digunakan untuk memberi aplikasi akses ke konten di seluruh ruang saat ruang pribadi tidak terkunci.

Pengguna tidak dapat memindahkan aplikasi yang sudah ada beserta datanya ke ruang pribadi. Sebagai gantinya, pengguna memilih opsi penginstalan di ruang pribadi untuk menginstal aplikasi menggunakan app store mana pun yang mereka sukai. Aplikasi di ruang pribadi diinstal sebagai salinan terpisah dari aplikasi apa pun di ruang utama (salinan baru dari aplikasi yang sama).

Jika pengguna mengunci ruang pribadi, profil akan dihentikan. Saat profil dihentikan, aplikasi di ruang pribadi tidak akan lagi aktif dan tidak dapat menjalankan aktivitas latar depan atau latar belakang, termasuk menampilkan notifikasi.

Sebaiknya uji aplikasi Anda dengan ruang pribadi untuk memastikan aplikasi berfungsi seperti yang diharapkan, terutama jika aplikasi Anda termasuk dalam salah satu kategori berikut:

Buat kueri pilihan pengguna terbaru untuk Akses Foto yang Dipilih

现在,授予媒体权限的部分访问权限后,应用可以仅突出显示最近选择的照片和视频。此功能可以改善频繁请求访问照片和视频的应用的用户体验。如需在您的应用中使用此功能,请在通过 ContentResolver 查询 MediaStore 时启用 QUERY_ARG_LATEST_SELECTION_ONLY 参数。

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 menyertakan Privacy Sandbox di Android versi terbaru. Penambahan ini adalah bagian dari upaya kami untuk mengembangkan teknologi baru yang meningkatkan privasi pengguna dan memungkinkan pengalaman iklan yang dipersonalisasi dan efektif untuk aplikasi seluler. Halaman sandbox privasi kami memiliki informasi selengkapnya tentang Privacy Sandbox di pratinjau developer Android dan program beta untuk membantu Anda memulai.

Health Connect

Android 15 集成了围绕 Health Connect by Android 的最新扩展程序。Health Connect by Android 是一个安全的集中式平台,用于管理和分享应用收集的健康与健身数据。此更新增加了对健身营养、体表温度、训练计划等领域的新数据类型的支持。

借助体表温度跟踪功能,用户可以从穿戴式设备或其他跟踪设备存储和分享更准确的体温数据。

训练计划是结构化的锻炼计划,可帮助用户实现健身目标。训练计划支持包括各种完成目标和绩效目标:

如需详细了解 Android 中 Health Connect 的最新更新,请观看 Google I/O 大会的利用 Android Health 打造适应性体验演讲。

Berbagi layar sebagian

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

Pengalaman pengguna dan UI sistem

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

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

Pratinjau widget yang lebih beragam dengan Generated Previews API

Sebelum Android 15, satu-satunya cara untuk menyediakan pratinjau pemilih widget adalah dengan menentukan resource gambar atau tata letak statis. Pratinjau ini sering kali sangat berbeda dengan tampilan widget sebenarnya saat ditempatkan di layar utama. Selain itu, resource statis tidak dapat dibuat dengan Jetpack Glance, sehingga developer Sekilas harus mengambil screenshot widget mereka atau membuat tata letak XML agar dapat melakukan pratinjau widget.

Android 15 menambahkan dukungan untuk pratinjau yang dibuat. Hal ini berarti penyedia widget aplikasi dapat membuat RemoteViews untuk digunakan sebagai pratinjau alat pilih, bukan resource statis.

Aplikasi dapat memberikan Tampilan Jarak Jauh ke Alat Pilih Widget, sehingga dapat memperbarui konten pada alat pilih agar lebih mewakili tampilan yang akan dilihat pengguna.

API Push

Aplikasi dapat memberikan pratinjau yang dihasilkan melalui push API. Aplikasi dapat menyediakan pratinjau kapan saja dalam siklus prosesnya, dan tidak menerima permintaan eksplisit dari host untuk menyediakan pratinjau. Pratinjau disimpan di AppWidgetService, dan host dapat memintanya sesuai permintaan. Contoh berikut memuat resource tata letak widget XML dan menetapkannya sebagai pratinjau:

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

Alur yang diharapkan adalah:

  1. Kapan pun, penyedia widget akan memanggil setWidgetPreview. Pratinjau yang diberikan dipertahankan di AppWidgetService dengan info penyedia lainnya.
  2. setWidgetPreview memberi tahu host tentang pratinjau yang telah diperbarui melalui callback AppWidgetHost.onProvidersChanged. Sebagai respons, host widget memuat ulang semua informasi penyedianya.
  3. Saat menampilkan pratinjau widget, host akan memeriksa AppWidgetProviderInfo.generatedPreviewCategories, dan jika kategori yang dipilih tersedia, memanggil AppWidgetManager.getWidgetPreview untuk menampilkan pratinjau tersimpan untuk penyedia ini.

Waktu menelepon setWidgetPreview

Karena tidak ada callback untuk memberikan pratinjau, aplikasi dapat memilih untuk mengirim pratinjau kapan saja saat aplikasi berjalan. Frekuensi update pratinjau bergantung pada kasus penggunaan widget.

Daftar berikut menjelaskan dua kategori utama kasus penggunaan pratinjau:

  • Penyedia yang menampilkan data nyata dalam pratinjau widget mereka, seperti informasi yang dipersonalisasi atau informasi terbaru. Penyedia ini dapat menyetel pratinjau setelah pengguna login atau melakukan konfigurasi awal di aplikasinya. Setelah ini, mereka dapat menyiapkan tugas berkala untuk mengupdate pratinjau sesuai ritme yang mereka pilih. Contoh jenis widget ini dapat berupa foto, kalender, cuaca, atau widget berita.
  • Penyedia yang menampilkan informasi statis dalam pratinjau atau widget tindakan cepat yang tidak menampilkan data apa pun. Penyedia ini dapat menyetel pratinjau satu kali, saat aplikasi pertama kali diluncurkan. Contoh jenis widget ini mencakup widget tindakan cepat drive atau widget pintasan Chrome.

Beberapa penyedia mungkin menampilkan pratinjau statis pada alat pilih mode hub, tetapi informasi nyata pada alat pilih layar utama. Penyedia ini harus mengikuti panduan untuk kedua kasus penggunaan tersebut guna menetapkan pratinjau.

Picture-in-Picture

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

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

Dengan status UI baru ini, aplikasi yang menargetkan Android 15 akan mengamati callback Activity#onPictureInPictureUiStateChanged yang dipanggil dengan isTransitioningToPip() segera setelah animasi PiP dimulai. Ada banyak elemen UI yang tidak relevan untuk aplikasi saat berada dalam mode PiP, misalnya tampilan atau tata letak yang menyertakan informasi seperti saran, video yang akan datang, rating, dan judul. Saat aplikasi beralih ke mode PiP, gunakan callback onPictureInPictureUiStateChanged untuk menyembunyikan elemen UI ini. Saat aplikasi beralih ke mode layar penuh dari jendela PiP, gunakan callback onPictureInPictureModeChanged untuk memperlihatkan elemen ini, seperti yang ditunjukkan dalam 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 elemen UI yang tidak relevan ini (untuk jendela PiP) membantu memastikan animasi masuk PiP yang lebih halus dan bebas kedipan.

Peningkatan aturan Jangan Ganggu

AutomaticZenRule memungkinkan aplikasi menyesuaikan aturan Pengelolaan Perhatian (Jangan Ganggu) dan memutuskan kapan harus mengaktifkan atau menonaktifkannya. Android 15 meningkatkan aturan ini secara signifikan dengan tujuan meningkatkan pengalaman pengguna. Peningkatan berikut disertakan:

  • Menambahkan jenis ke AutomaticZenRule, sehingga sistem dapat menerapkan perlakuan khusus ke beberapa aturan.
  • Menambahkan ikon ke AutomaticZenRule agar mode menjadi lebih dikenali.
  • Menambahkan string triggerDescription ke AutomaticZenRule yang menjelaskan kondisi saat aturan akan menjadi aktif bagi pengguna.
  • Menambahkan ZenDeviceEffects ke AutomaticZenRule, yang memungkinkan aturan memicu hal-hal seperti tampilan skala abu-abu, mode malam, atau meredupkan wallpaper.

Menyetel VibrationEffect untuk saluran notifikasi

Android 15 mendukung penyetelan getaran yang kuat untuk notifikasi masuk melalui saluran menggunakan NotificationChannel.setVibrationEffect sehingga pengguna dapat membedakan berbagai jenis notifikasi tanpa harus melihat perangkatnya.

Perangkat layar besar dan faktor bentuk

Android 15 memberi aplikasi Anda dukungan untuk mengoptimalkan faktor bentuk Android, termasuk perangkat layar besar, perangkat foldable, dan perangkat foldable.

Peningkatan multitasking layar besar

Android 15 memberi pengguna cara yang lebih baik untuk melakukan multitasking di perangkat layar besar. Misalnya, pengguna dapat menyimpan kombinasi aplikasi layar terpisah favorit mereka untuk akses cepat dan menyematkan taskbar di layar untuk beralih antar-aplikasi dengan cepat. Artinya, memastikan aplikasi Anda adaptif kini menjadi makin penting.

Google I/O memiliki sesi tentang Membangun aplikasi Android adaptif dan Mem-build UI dengan library adaptif Material 3 yang dapat membantu, dan dokumentasi kami memiliki lebih banyak untuk membantu Anda dalam Mendesain untuk layar besar.

Dukungan layar sampul

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

Konektivitas

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

Dukungan satelit

Android 15 terus memperluas dukungan platform untuk konektivitas satelit dan menyertakan beberapa elemen UI untuk memastikan pengalaman pengguna yang konsisten di seluruh lanskap konektivitas satelit.

Aplikasi dapat menggunakan ServiceState.isUsingNonTerrestrialNetwork() untuk mendeteksi saat perangkat terhubung ke satelit, sehingga memberi aplikasi lebih banyak informasi mengapa layanan jaringan lengkap mungkin tidak tersedia. Selain itu, Android 15 menyediakan dukungan untuk aplikasi SMS dan MMS serta aplikasi RCS yang dimuat sebelumnya untuk menggunakan konektivitas satelit untuk mengirim dan menerima pesan.

Notifikasi akan muncul saat perangkat terhubung ke satelit.

Pengalaman NFC yang lebih lancar

Android 15 正努力让感应式付款体验更加顺畅和可靠,同时继续支持 Android 强大的 NFC 应用生态系统。在受支持的设备上,应用可以请求 NfcAdapter 进入观察模式,在该模式下,设备会监听 NFC 读取器,但不响应 NFC 读取器,同时发送应用的 NFC 服务 PollingFrame 对象进行处理。PollingFrame 对象可用于在首次与 NFC 读取器通信之前进行身份验证,在许多情况下可实现一键交易。

此外,应用现在可以在受支持的设备上注册指纹,以便接收轮询循环活动的相关通知,从而实现通过多个可感知 NFC 的应用顺畅执行的操作。

Peran Wallet

Android 15 memperkenalkan peran Wallet baru yang memungkinkan integrasi yang lebih erat dengan aplikasi dompet pilihan pengguna. Peran ini menggantikan setelan pembayaran tanpa kontak fisik default NFC. Pengguna dapat mengelola pemegang peran Wallet dengan membuka Setelan > Aplikasi > Aplikasi Default.

Peran Wallet digunakan saat merutekan ketukan NFC untuk AID yang terdaftar dalam kategori pembayaran. Ketukan selalu membuka pemegang peran Wallet, kecuali jika aplikasi lain yang terdaftar untuk AID yang sama berjalan di latar depan.

Peran ini juga digunakan untuk menentukan tempat kartu QuickAccess Wallet harus berada saat diaktifkan. Jika peran disetel ke "Tidak ada", kartu QuickAccess tidak akan tersedia dan ketukan NFC kategori pembayaran hanya akan dikirim ke aplikasi latar depan.

Keamanan

Android 15 membantu Anda meningkatkan keamanan aplikasi, melindungi data aplikasi, dan memberi pengguna transparansi dan kontrol yang lebih besar atas data mereka. Baca pembahasan Mengamankan keamanan pengguna di Android dari Google I/O untuk mengetahui lebih banyak hal yang kami lakukan untuk meningkatkan perlindungan pengguna dan melindungi aplikasi Anda dari ancaman baru.

Mengintegrasikan Pengelola Kredensial dengan isi otomatis

Starting with Android 15, developers can link specific views like username or password fields with Credential Manager requests, making it easier to provide a tailored user experience during the sign-in process. When the user focuses on one of these views, a corresponding request is sent to Credential Manager. The resulting credentials are aggregated across providers and displayed in autofill fallback UIs, such as inline suggestions or drop-down suggestions. The Jetpack androidx.credentials library is the preferred endpoint for developers to use and will soon be available to further enhance this feature in Android 15 and higher.

Integrasikan 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

Kami memperkenalkan E2eeContactKeysManager di Android 15, yang memfasilitasi enkripsi menyeluruh (E2EE) di aplikasi Android Anda dengan menyediakan API level OS untuk penyimpanan kunci publik kriptografis.

E2eeContactKeysManager dirancang untuk berintegrasi dengan aplikasi kontak platform guna memberi pengguna cara terpusat untuk mengelola dan memverifikasi kunci publik kontak mereka.

Pemeriksaan izin di URI konten

Android 15 memperkenalkan kumpulan API baru yang melakukan pemeriksaan izin pada URI konten:

Aksesibilitas

Android 15 menambahkan fitur yang meningkatkan aksesibilitas bagi pengguna.

Braille yang Lebih Baik

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

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

Internasionalisasi

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

Font variabel CJK

Mulai Android 15, file font untuk bahasa China, Jepang, dan Korea (CJK), NotoSansCJK, sekarang menjadi font variabel. {i>Font<i} variabel membuka kemungkinan baru untuk tipografi kreatif dalam bahasa CJK. Desainer dapat mempelajari berbagai gaya yang lebih luas dan membuat tata letak yang memukau secara visual yang sebelumnya sulit atau tidak mungkin dicapai.

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

Justifikasi antarkarakter

从 Android 15 开始,可以使用 JUSTIFICATION_MODE_INTER_CHARACTER 利用字母间距将文本两端对齐。Android 8.0(API 级别 26)中首次引入了字词间对齐,而字符间对齐可为使用空格字符进行分割的语言(例如中文、日语等)提供类似的功能。

使用 JUSTIFICATION_MODE_NONE 的日语文本布局。
使用 JUSTIFICATION_MODE_NONE 的英语文本布局。


使用 JUSTIFICATION_MODE_INTER_WORD 的日语文本布局。
使用 JUSTIFICATION_MODE_INTER_WORD 的英语文本布局。


使用新版 JUSTIFICATION_MODE_INTER_CHARACTER 的日语文本布局。
使用新版 JUSTIFICATION_MODE_INTER_CHARACTER 的英语文本布局。

Konfigurasi pemisah baris otomatis

Android 从 Android 13(API 级别 33)开始针对日语和韩语支持基于短语的换行符。不过,虽然基于短语的换行符可以提高短行文本的可读性,但不适用于较长的文本。在 Android 15 中,应用现在可以使用 LINE_BREAK_WORD_STYLE_AUTO 选项为短文本行应用基于短语的换行符。此选项用于选择最适合该文本的文字样式选项。

对于简短的文本行,使用基于短语的换行符,其功能与 LINE_BREAK_WORD_STYLE_PHRASE 相同,如下图所示:

对于简短的文本行,LINE_BREAK_WORD_STYLE_AUTO 会采用基于短语的换行符,以提高文本的可读性。 这与应用 LINE_BREAK_WORD_STYLE_PHRASE 相同。

对于较长的文本,LINE_BREAK_WORD_STYLE_AUTO 使用不换行的字词样式,其功能与 LINE_BREAK_WORD_STYLE_NONE 相同,如下图所示:

对于较长的文本,LINE_BREAK_WORD_STYLE_AUTO 不会应用换行字词样式,以提高文本的可读性。 这与应用 LINE_BREAK_WORD_STYLE_NONE 相同。

Font Hentaigana Jepang Baru

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

Gaya teks dan karakter untuk font Hentaigana Jepang.

Kerucut VideoLAN Hak Cipta (c) 1996-2010 VideoLAN. Logo ini atau versi yang dimodifikasi dapat digunakan atau diubah oleh siapa saja untuk merujuk ke project VideoLAN atau produk apa pun yang dikembangkan oleh tim VideoLAN, tetapi tidak menunjukkan dukungan dari project.

Vulkan dan logo Vulkan adalah merek dagang terdaftar dari Khronos Group Inc.

OpenGL adalah merek dagang terdaftar dan logo OpenGL ES adalah merek dagang dari Hewlett Packard Enterprise yang digunakan atas izin dari Khronos.