Tổng quan về các tính năng và API

Android 15 mang đến cho nhà phát triển các tính năng và API mới hữu ích. Các phần sau đây tóm tắt những tính năng này để giúp bạn làm quen với các API liên quan.

Để biết danh sách chi tiết về các API đã thêm, sửa đổi và xoá, hãy đọc báo cáo điểm khác biệt về API. Để biết thông tin chi tiết về các API đã thêm, hãy truy cập vào tài liệu tham khảo API cho Android – đối với Android 15, hãy tìm các API đã thêm vào cấp độ API 35. Để tìm hiểu những thay đổi của nền tảng có thể tác động đến ứng dụng của bạn, hãy nhớ tham khảo các thay đổi về hành vi của Android 15 đối với ứng dụng nhắm đến Android 15 và tất cả ứng dụng.

Camera và nội dung nghe nhìn

Android 15 có nhiều tính năng giúp cải thiện trải nghiệm về camera và nội dung nghe nhìn, đồng thời cho phép bạn truy cập vào các công cụ và phần cứng để hỗ trợ người sáng tạo hiện thực hoá ý tưởng của họ trên Android.

Để biết thêm thông tin về các tính năng mới nhất và giải pháp dành cho nhà phát triển đối với nội dung nghe nhìn và camera trên Android, hãy xem bài nói chuyện Xây dựng trải nghiệm hiện đại về nội dung nghe nhìn và camera trên Android tại Google I/O.

Tăng cường ánh sáng yếu

Android 15 introduces Low Light Boost, an auto-exposure mode available to both Camera 2 and the night mode camera extension. Low Light Boost adjusts the exposure of the Preview stream in low-light conditions. This is different from how the night mode camera extension creates still images, because night mode combines a burst of photos to create a single, enhanced image. While night mode works very well for creating a still image, it can't create a continuous stream of frames, but Low Light Boost can. Thus, Low Light Boost enables camera capabilities, such as:

  • Providing an enhanced image preview, so users are better able to frame their low-light pictures
  • Scanning QR codes in low light

If you enable Low Light Boost, it automatically turns on when there's a low light level, and turns off when there's more light.

Apps can record off the Preview stream in low-light conditions to save a brightened video.

For more information, see Low Light Boost.

Các chế độ điều khiển camera trong ứng dụng

Android 15 adds an extension for more control over the camera hardware and its algorithms on supported devices:

  • Advanced flash strength adjustments enabling precise control of flash intensity in both SINGLE and TORCH modes while capturing images.

Kiểm soát khoảng không HDR

Android 15 chọn khoảng đầu vào HDR phù hợp với các tính năng cơ bản của thiết bị và độ sâu bit của bảng điều khiển. Đối với các trang có nhiều nội dung SDR, chẳng hạn như ứng dụng nhắn tin hiển thị một hình thu nhỏ HDR, hành vi này có thể ảnh hưởng bất lợi đến độ sáng được cảm nhận của nội dung SDR. Android 15 cho phép bạn kiểm soát khoảng đầu vào HDR bằng setDesiredHdrHeadroom để tạo ra sự cân bằng giữa nội dung SDR và HDR.

Độ sáng của các thành phần trên giao diện người dùng SDR ở màn hình bên trái có vẻ đồng nhất hơn so với độ sáng ở màn hình bên phải, mô phỏng các vấn đề về khoảng không đầu khi nội dung HDR và SDR được kết hợp. Bằng cách điều chỉnh khoảng đầu vào HDR, bạn có thể đạt được sự cân bằng tốt hơn giữa nội dung SDR và HDR.

Kiểm soát độ lớn

Android 15 introduces support for the CTA-2075 loudness standard to help you avoid audio loudness inconsistencies and ensure users don't have to constantly adjust volume when switching between content. The system leverages known characteristics of the output devices (headphones and speaker) along with loudness metadata available in AAC audio content to intelligently adjust the audio loudness and dynamic range compression levels.

To enable this feature, you need to ensure loudness metadata is available in your AAC content and enable the platform feature in your app. For this, you instantiate a LoudnessCodecController object by calling its create factory method with the audio session ID from the associated AudioTrack; this automatically starts applying audio updates. You can pass an OnLoudnessCodecUpdateListener to modify or filter loudness parameters before they are applied on the 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 will also be updated to use the LoudnessCodecController APIs for a seamless app integration.

Thiết bị MIDI 2.0 ảo

Android 13 đã bổ sung tính năng hỗ trợ kết nối với thiết bị MIDI 2.0 bằng USB. Các thiết bị này giao tiếp bằng Gói MIDI phổ quát (UMP). Android 15 mở rộng tính năng hỗ trợ UMP cho các ứng dụng MIDI ảo, cho phép các ứng dụng sáng tác điều khiển các ứng dụng tổng hợp dưới dạng thiết bị MIDI 2.0 ảo giống như khi sử dụng thiết bị USB MIDI 2.0.

Giải mã phần mềm AV1 hiệu quả hơn

dav1d logo

dav1d, the popular AV1 software decoder from VideoLAN is available for Android devices that don't support AV1 decode in hardware. dav1d is up to 3x more performant than the legacy AV1 software decoder, enabling HD AV1 playback for more users, including some low and mid tier devices.

Your app needs to opt-in to using dav1d by invoking it by name "c2.android.av1-dav1d.decoder". dav1d will be made the default AV1 software decoder in a subsequent update. This support is standardized and backported to Android 11 devices that receive Google Play system updates.

Nâng cao năng suất và công cụ cho nhà phát triển

Mặc dù hầu hết công việc của chúng tôi nhằm cải thiện năng suất của bạn đều tập trung vào các công cụ như Android Studio, Jetpack Compose và thư viện Android Jetpack , nhưng chúng tôi luôn tìm cách giúp bạn dễ dàng hiện thực hoá ý tưởng của mình hơn trong nền tảng.

Nội dung cập nhật OpenJDK 17

Android 15 tiếp tục công cuộc làm mới các thư viện cốt lõi của Android để phù hợp với các tính năng trong bản phát hành LTS OpenJDK mới nhất.

Bao gồm các tính năng và điểm cải tiến chính sau đây:

Các API này được cập nhật trên hơn một tỷ thiết bị chạy Android 12 (API cấp 31) trở lên thông qua bản cập nhật Hệ thống Google Play, nhờ đó, bạn có thể nhắm đến các tính năng lập trình mới nhất.

Cải tiến về PDF

Android 15 có các điểm cải tiến đáng kể đối với PdfRenderer API. Ứng dụng có thể kết hợp các tính năng nâng cao như hiển thị các tệp được bảo vệ bằng mật khẩu, chú thích, chỉnh sửa biểu mẫu, tìm kiếmlựa chọn bằng tính năng sao chép. PDF tuyến tính hóa các tính năng tối ưu hoá được hỗ trợ để tăng tốc độ xem tệp PDF cục bộ và giảm mức sử dụng tài nguyên. Thư viện PDF Jetpack sử dụng các API này để đơn giản hoá việc thêm các tính năng xem PDF vào ứng dụng.

Bản cập nhật mới nhất cho tính năng kết xuất đồ hoạ PDF bao gồm các tính năng như bằng cách tìm một tệp PDF nhúng.

PdfRenderer đã được chuyển sang một mô-đun có thể cập nhật bằng Google Các bản cập nhật hệ thống của Google Play độc lập với bản phát hành nền tảng, đồng thời chúng tôi hỗ trợ những thay đổi này trở lại Android 11 (API cấp 30) bằng cách tạo một phiên bản phiên bản trước Android 15 của nền tảng API, được gọi là PdfRendererPreV.

Tinh chỉnh tính năng tự động chuyển đổi ngôn ngữ

Android 14 added on-device, multi-language recognition in audio with automatic switching between languages, but this can cause words to get dropped, especially when languages switch with less of a pause between the two utterances. Android 15 adds additional controls to help apps tune this switching to their use case. EXTRA_LANGUAGE_SWITCH_INITIAL_ACTIVE_DURATION_TIME_MILLIS confines the automatic switching to the beginning of the audio session, while EXTRA_LANGUAGE_SWITCH_MATCH_SWITCHES deactivates the language switching after a defined number of switches. These options are particularly useful if you expect that there will be a single language spoken during the session that should be autodetected.

Cải thiện API Phông chữ biến đổi OpenType

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.

Kiểm soát chi tiết dấu ngắt dòng

Starting in Android 15, a TextView and the underlying line breaker can preserve the given portion of text in the same line to improve readability. You can take advantage of this line break customization by using the <nobreak> tag in string resources or createNoBreakSpan. Similarly, you can preserve words from hyphenation by using the <nohyphen> tag or createNoHyphenationSpan.

For example, the following string resource doesn't include a line break, and renders with the text "Pixel 8 Pro." breaking in an undesirable place:

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

In contrast, this string resource includes the <nobreak> tag, which wraps the phrase "Pixel 8 Pro." and prevents line breaks:

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

The difference in how these strings are rendered is shown in the following images:

Layout for a line of text where the phrase "Pixel 8 Pro." isn't wrapped using a <nobreak> tag.
Layout for the same line of text where the phrase "Pixel 8 Pro." is wrapped using a <nobreak> tag.

Lưu trữ ứng dụng

Android and Google Play announced support for app archiving last year, allowing users to free up space by partially removing infrequently used apps from the device that were published using Android App Bundle on Google Play. Android 15 includes OS level support for app archiving and unarchiving, making it easier for all app stores to implement it.

Apps with the REQUEST_DELETE_PACKAGES permission can call the PackageInstaller requestArchive method to request archiving an installed app package, which removes the APK and any cached files, but persists user data. Archived apps are returned as displayable apps through the LauncherApps APIs; users will see a UI treatment to highlight that those apps are archived. If a user taps on an archived app, the responsible installer will get a request to unarchive it, and the restoration process can be monitored by the ACTION_PACKAGE_ADDED broadcast.

Bật chế độ 16 KB trên thiết bị bằng cách sử dụng tuỳ chọn cho nhà phát triển

Bật/tắt lựa chọn cho nhà phát triển Khởi động với kích thước trang 16 KB để khởi động thiết bị ở chế độ 16 KB.

Trong các phiên bản QPR của Android 15, bạn có thể sử dụng tùy chọn cho nhà phát triển có trên một số thiết bị để khởi động thiết bị ở chế độ 16 KB và thực hiện kiểm thử trên thiết bị. Trước khi sử dụng tuỳ chọn cho nhà phát triển, hãy chuyển đến phần Cài đặt > Hệ thống > Bản cập nhật phần mềm rồi áp dụng mọi bản cập nhật hiện có.

Tuỳ chọn cho nhà phát triển này có trên các thiết bị sau:

  • Pixel 8 và 8 Pro (chạy Android 15 QPR1 trở lên)

  • Pixel 8a (chạy Android 15 QPR1 trở lên)

  • Pixel 9, 9 Pro và 9 Pro XL (chạy Android 15 QPR2 trở lên)

  • Pixel 9a (chạy Android 16 trở lên)

Đồ hoạ

Android 15 mang đến những cải tiến mới nhất về đồ hoạ, bao gồm ANGLE và các bổ sung cho hệ thống đồ hoạ Canvas.

Hiện đại hoá quyền truy cập GPU của Android

Vulkan logo

Android hardware has evolved quite a bit from the early days where the core OS would run on a single CPU and GPUs were accessed using APIs based on fixed-function pipelines. The Vulkan® graphics API has been available in the NDK since Android 7.0 (API level 24) with a lower-level abstraction that better reflects modern GPU hardware, scales better to support multiple CPU cores, and offers reduced CPU driver overhead — leading to improved app performance. Vulkan is supported by all modern game engines.

Vulkan is Android's preferred interface to the GPU. Therefore, Android 15 includes ANGLE as an optional layer for running OpenGL® ES on top of Vulkan. Moving to ANGLE will standardize the Android OpenGL implementation for improved compatibility, and, in some cases, improved performance. You can test out your OpenGL ES app stability and performance with ANGLE by enabling the developer option in Settings -> System -> Developer Options -> Experimental: Enable ANGLE on Android 15.

The Android ANGLE on Vulkan roadmap

Roadmap of upcoming changes to the Android GPU APIs.

As part of streamlining our GPU stack, going forward we will be shipping ANGLE as the GL system driver on more new devices, with the future expectation that OpenGL/ES will be only available through ANGLE. That being said, we plan to continue support for OpenGL ES on all devices.

Recommended next steps

Use the developer options to select the ANGLE driver for OpenGL ES and test your app. For new projects, we strongly encourage using Vulkan for C/C++.

Cải tiến cho Canvas

Android 15 tiếp tục hiện đại hoá hệ thống đồ hoạ Canvas của Android bằng các tính năng bổ sung:

  • Matrix44 cung cấp một ma trận 4x4 để biến đổi các toạ độ nên được sử dụng khi bạn muốn thao tác với canvas ở chế độ 3D.
  • clipShader giao nhau với đoạn cắt hiện tại bằng chương trình đổ bóng được chỉ định, trong khi clipOutShader đặt đoạn cắt thành hiệu số của đoạn cắt hiện tại và chương trình đổ bóng, mỗi đoạn cắt coi chương trình đổ bóng là một mặt nạ alpha. Điều này hỗ trợ việc vẽ các hình dạng phức tạp một cách hiệu quả.

Hiệu suất và pin

Android tiếp tục tập trung vào việc giúp bạn cải thiện hiệu suất và chất lượng của ứng dụng. Android 15 giới thiệu các API giúp thực hiện các tác vụ trong ứng dụng của bạn hiệu quả hơn, tối ưu hoá hiệu suất của ứng dụng và thu thập thông tin chi tiết về ứng dụng.

Để biết các phương pháp hay nhất giúp tiết kiệm pin, gỡ lỗi việc sử dụng mạng và nguồn điện, và thông tin chi tiết về cách chúng tôi cải thiện hiệu suất pin của công việc chạy nền trong Android 15 và các phiên bản Android gần đây, hãy xem bài nói chuyện Cải thiện hiệu suất pin của công việc chạy nền trên Android tại Google I/O.

ApplicationStartInfo API

In previous versions of Android, app startup has been a bit of a mystery. It was challenging to determine within your app whether it started from a cold, warm, or hot state. It was also difficult to know how long your app spent during the various launch phases: forking the process, calling onCreate, drawing the first frame, and more. When your Application class was instantiated, you had no way of knowing whether the app started from a broadcast, a content provider, a job, a backup, boot complete, an alarm, or an Activity.

The ApplicationStartInfo API on Android 15 provides all of this and more. You can even choose to add your own timestamps into the flow to help collect timing data in one place. In addition to collecting metrics, you can use ApplicationStartInfo to help directly optimize app startup; for example, you can eliminate the costly instantiation of UI-related libraries within your Application class when your app is starting up due to a broadcast.

Thông tin chi tiết về kích thước ứng dụng

Since Android 8.0 (API level 26), Android has included the StorageStats.getAppBytes API that summarizes the installed size of an app as a single number of bytes, which is a sum of the APK size, the size of files extracted from the APK, and files that were generated on the device such as ahead-of-time (AOT) compiled code. This number is not very insightful in terms of how your app is using storage.

Android 15 adds the StorageStats.getAppBytesByDataType([type]) API, which lets you get insight into how your app is using up all that space, including APK file splits, AOT and speedup related code, dex metadata, libraries, and guided profiles.

Phân tích hiệu suất do ứng dụng quản lý

Android 15 includes the ProfilingManager class, which lets you collect profiling information from within your app such as heap dumps, heap profiles, stack sampling, and more. It provides a callback to your app with a supplied tag to identify the output file, which is delivered to your app's files directory. The API does rate limiting to minimize the performance impact.

To simplify constructing profiling requests in your app, we recommend using the corresponding Profiling AndroidX API, available in Core 1.15.0-rc01 or higher.

Cải tiến về cơ sở dữ liệu SQLite

Android 15 introduces SQLite APIs that expose advanced features from the underlying SQLite engine that target specific performance issues that can manifest in apps. These APIs are included with the update of SQLite to version 3.44.3.

Developers should consult best practices for SQLite performance to get the most out of their SQLite database, especially when working with large databases or when running latency-sensitive queries.

  • Read-only deferred transactions: when issuing transactions that are read-only (don't include write statements), use beginTransactionReadOnly() and beginTransactionWithListenerReadOnly(SQLiteTransactionListener) to issue read-only DEFERRED transactions. Such transactions can run concurrently with each other, and if the database is in WAL mode, they can run concurrently with IMMEDIATE or EXCLUSIVE transactions.
  • Row counts and IDs: APIs were added to retrieve the count of changed rows or the last inserted row ID without issuing an additional query. getLastChangedRowCount() returns the number of rows that were inserted, updated, or deleted by the most recent SQL statement within the current transaction, while getTotalChangedRowCount() returns the count on the current connection. getLastInsertRowId() returns the rowid of the last row to be inserted on the current connection.
  • Raw statements: issue a raw SQlite statement, bypassing convenience wrappers and any additional processing overhead that they may incur.

Nội dung cập nhật Khung hiệu suất động Android

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.

Quyền riêng tư

Android 15 có nhiều tính năng giúp nhà phát triển ứng dụng bảo vệ quyền riêng tư của người dùng.

Phát hiện hoạt động ghi màn hình

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)
}

Mở rộng các tính năng của IntentFilter

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>

Không gian riêng tư

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:

Truy vấn lựa chọn gần đây nhất của người dùng đối với Quyền truy cập vào ảnh đã chọn

Giờ đây, các ứng dụng chỉ có thể làm nổi bật những ảnh và video được chọn gần đây nhất khi quyền truy cập một phần vào quyền đối với nội dung nghe nhìn đã được cấp. Tính năng này có thể cải thiện trải nghiệm người dùng cho những ứng dụng thường xuyên yêu cầu quyền truy cập vào ảnh và video. Để sử dụng tính năng này trong ứng dụng của bạn, hãy bật Đối số QUERY_ARG_LATEST_SELECTION_ONLY khi truy vấn MediaStore đến 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)
});

Hộp cát về quyền riêng tư trên Android

Android 15 bao gồm các tiện ích Dịch vụ quảng cáo Android mới nhất, tích hợp phiên bản mới nhất của Hộp cát về quyền riêng tư trên Android. Việc bổ sung này là một phần trong nỗ lực phát triển các công nghệ giúp cải thiện quyền riêng tư của người dùng và mang lại trải nghiệm quảng cáo được cá nhân hoá hiệu quả cho các ứng dụng di động. Trang về hộp cát về quyền riêng tư của chúng tôi có thêm thông tin về các chương trình beta và bản dùng thử cho nhà phát triển của Hộp cát về quyền riêng tư trên Android để giúp bạn bắt đầu.

Health Connect

Android 15 integrates the latest extensions around Health Connect by Android, a secure and centralized platform to manage and share app-collected health and fitness data. This update adds support for additional data types across fitness, nutrition, skin temperature, training plans, and more.

Skin temperature tracking allows users to store and share more accurate temperature data from a wearable or other tracking device.

Training plans are structured workout plans to help a user achieve their fitness goals. Training plans support includes a variety of completion and performance goals:

Learn more about the latest updates to Health Connect in Android in the Building adaptable experiences with Android Health talk from Google I/O.

Chia sẻ màn hình ứng dụng

Android 15 hỗ trợ tính năng chia sẻ màn hình ứng dụng để người dùng có thể chỉ chia sẻ hoặc ghi lại một cửa sổ ứng dụng thay vì toàn bộ màn hình thiết bị. Tính năng này được bật lần đầu trong Android 14 QPR2, bao gồm các lệnh gọi lại MediaProjection cho phép ứng dụng của bạn tuỳ chỉnh trải nghiệm chia sẻ màn hình ứng dụng. Xin lưu ý rằng đối với các ứng dụng nhắm đến Android 14 (API cấp 34) trở lên, bạn phải có sự đồng ý của người dùng đối với mỗi phiên chụp MediaProjection.

Trải nghiệm người dùng và giao diện người dùng hệ thống

Android 15 giúp nhà phát triển ứng dụng và người dùng có nhiều quyền kiểm soát và linh hoạt hơn trong việc định cấu hình thiết bị cho phù hợp với nhu cầu của họ.

Để tìm hiểu thêm về cách sử dụng những cải tiến mới nhất trong Android 15 nhằm cải thiện trải nghiệm người dùng của ứng dụng, hãy xem bài nói chuyện Cải thiện trải nghiệm người dùng của ứng dụng Android tại Google I/O.

Bản xem trước tiện ích phong phú hơn với API Bản xem trước được tạo

Trước Android 15, cách duy nhất để cung cấp bản xem trước bộ chọn tiện ích là chỉ định một hình ảnh hoặc tài nguyên bố cục tĩnh. Các bản xem trước này thường khác biệt đáng kể với giao diện của tiện ích thực tế khi được đặt trên màn hình chính. Ngoài ra, không thể tạo tài nguyên tĩnh bằng Jetpack Glance, vì vậy tính năng Glance nhà phát triển phải chụp ảnh màn hình tiện ích của họ hoặc tạo bố cục XML để có một bản xem trước tiện ích.

Android 15 bổ sung tính năng hỗ trợ cho bản xem trước đã tạo. Điều này có nghĩa là trình cung cấp tiện ích ứng dụng có thể tạo RemoteViews để dùng làm bản xem trước bộ chọn, thay vì tài nguyên tĩnh.

Các ứng dụng có thể cung cấp Chế độ xem từ xa cho Bộ chọn tiện ích để có thể cập nhật nội dung trong bộ chọn cho phù hợp hơn với nội dung mà người dùng sẽ thấy.

API Đẩy

Ứng dụng có thể cung cấp bản xem trước đã tạo thông qua API đẩy. Ứng dụng có thể cung cấp bản xem trước tại bất kỳ thời điểm nào trong vòng đời và không nhận được yêu cầu rõ ràng từ máy chủ lưu trữ để cung cấp bản xem trước. Bản xem trước được lưu trữ trong AppWidgetService và máy chủ lưu trữ có thể yêu cầu bản xem trước theo yêu cầu. Ví dụ sau đây tải tài nguyên bố cục tiện ích XML và đặt tài nguyên đó làm bản xem trước:

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

Quy trình dự kiến là:

  1. Nhà cung cấp tiện ích sẽ gọi setWidgetPreview bất cứ lúc nào. Các bản xem trước được cung cấp sẽ được lưu trữ trong AppWidgetService cùng với thông tin khác của nhà cung cấp.
  2. setWidgetPreview thông báo cho máy chủ lưu trữ về bản xem trước đã cập nhật thông qua lệnh gọi lại AppWidgetHost.onProvidersChanged. Để phản hồi, máy chủ của tiện ích sẽ tải lại tất cả thông tin của nhà cung cấp.
  3. Khi hiển thị bản xem trước của tiện ích, máy chủ lưu trữ sẽ kiểm tra AppWidgetProviderInfo.generatedPreviewCategories và nếu được chọn có sẵn danh mục, hãy gọi AppWidgetManager.getWidgetPreview tới trả về bản xem trước đã lưu cho ứng dụng nhà cung cấp này.

Thời điểm gọi setWidgetPreview

Do không có lệnh gọi lại để cung cấp bản xem trước, ứng dụng có thể chọn gửi bản xem trước bất kỳ lúc nào khi chúng đang chạy. Tần suất cập nhật bản xem trước phụ thuộc vào trường hợp sử dụng tiện ích.

Danh sách sau đây mô tả hai danh mục chính của trường hợp sử dụng bản xem trước:

  • Những nhà cung cấp cho thấy dữ liệu thực trong bản xem trước tiện ích, chẳng hạn như dữ liệu được cá nhân hoá hoặc thông tin gần đây. Các nhà cung cấp này có thể thiết lập bản xem trước sau khi người dùng đăng nhập hoặc đã định cấu hình ban đầu trong ứng dụng của họ. Sau đó, họ có thể thiết lập một tác vụ định kỳ để cập nhật bản xem trước theo tần suất mà họ chọn. Ví dụ về loại tiện ích này có thể là ảnh, lịch, thời tiết hoặc tin tức tiện ích.
  • Các trình cung cấp hiển thị thông tin tĩnh trong bản xem trước hoặc tiện ích thao tác nhanh mà không hiển thị bất kỳ dữ liệu nào. Các nhà cung cấp này có thể đặt bản xem trước một lần, khi khởi chạy ứng dụng lần đầu tiên. Ví dụ về loại tiện ích này bao gồm trình đơn nhanh tiện ích hành động hoặc tiện ích lối tắt Chrome.

Một số nhà cung cấp có thể hiển thị bản xem trước tĩnh trên bộ chọn chế độ thiết bị trung tâm, nhưng thực tế thông tin trên bộ chọn màn hình chính. Các nhà cung cấp này phải tuân theo hướng dẫn cho cả hai trường hợp sử dụng này để đặt bản xem trước.

Hình trong hình

Android 15 giới thiệu các thay đổi trong tính năng Hình trong hình (PiP) để đảm bảo quá trình chuyển đổi diễn ra suôn sẻ hơn khi chuyển sang chế độ PiP. Điều này sẽ có lợi cho các ứng dụng có thành phần giao diện người dùng phủ lên trên giao diện người dùng chính và chuyển sang chế độ Hình trong hình.

Nhà phát triển dùng lệnh gọi lại onPictureInPictureModeChanged để xác định logic bật/tắt chế độ hiển thị các phần tử ở lớp phủ trên giao diện người dùng. Lệnh gọi lại này là được kích hoạt khi hoàn tất quá trình nhập hoặc thoát ảnh động PiP. Bắt đầu vào Trên Android 15, lớp PictureInPictureUiState bao gồm một trạng thái khác.

Với trạng thái giao diện người dùng này, các ứng dụng nhắm đến Android 15 (API cấp 35) sẽ tuân thủ Lệnh gọi lại Activity#onPictureInPictureUiStateChanged đang được gọi bằng isTransitioningToPip() ngay khi ảnh động trong Hình trong hình bắt đầu. Có nhiều thành phần trên giao diện người dùng không liên quan đến ứng dụng khi ứng dụng ở chế độ PiP (Hình trong hình), đối với thành phần hiển thị hoặc bố cục mẫu bao gồm thông tin như nội dung đề xuất, video, mức phân loại và tiêu đề. Khi ứng dụng chuyển sang chế độ PiP, hãy sử dụng Lệnh gọi lại onPictureInPictureUiStateChanged để ẩn các thành phần này trên giao diện người dùng. Khi ứng dụng chuyển sang chế độ toàn màn hình từ cửa sổ PiP, hãy sử dụng lệnh gọi lại onPictureInPictureModeChanged để ẩn các phần tử này, như minh hoạ trong các ví dụ sau:

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

Nút bật/tắt chế độ hiển thị nhanh các thành phần không liên quan trên giao diện người dùng (đối với cửa sổ PiP) giúp đảm bảo ảnh động nhập PiP mượt mà và không nhấp nháy.

Cải thiện quy tắc Không làm phiền

AutomaticZenRule lets apps customize Attention Management (Do Not Disturb) rules and decide when to activate or deactivate them. Android 15 greatly enhances these rules with the goal of improving the user experience. The following enhancements are included:

  • Adding types to AutomaticZenRule, allowing the system to apply special treatment to some rules.
  • Adding an icon to AutomaticZenRule, helping to make the modes be more recognizable.
  • Adding a triggerDescription string to AutomaticZenRule that describes the conditions on which the rule should become active for the user.
  • Added ZenDeviceEffects to AutomaticZenRule, allowing rules to trigger things like grayscale display, night mode, or dimming the wallpaper.

Đặt VibrationEffect cho các kênh thông báo

Android 15 supports setting rich vibrations for incoming notifications by channel using NotificationChannel.setVibrationEffect, so your users can distinguish between different types of notifications without having to look at their device.

Chip trên thanh trạng thái và tính năng tự động dừng chiếu nội dung nghe nhìn

Tính năng chiếu nội dung nghe nhìn có thể tiết lộ thông tin riêng tư của người dùng. Một khối thanh trạng thái mới, nổi bật giúp người dùng biết được mọi hoạt động chiếu màn hình đang diễn ra. Người dùng có thể nhấn vào khối này để dừng truyền, chia sẻ hoặc ghi màn hình. Ngoài ra, để mang lại trải nghiệm người dùng trực quan hơn, mọi hoạt động chiếu màn hình đang diễn ra hiện sẽ tự động dừng khi màn hình thiết bị bị khoá.

Status bar chip for screen sharing, casting, and recording.

Màn hình lớn và kiểu dáng

Android 15 hỗ trợ ứng dụng của bạn tận dụng tối đa các kiểu dáng của Android, bao gồm màn hình lớn, thiết bị có thể gập lại và thiết bị có thể lật.

Cải thiện tính năng đa nhiệm trên màn hình lớn

Android 15 mang đến cho người dùng nhiều cách tốt hơn để làm nhiều việc cùng lúc trên các thiết bị có màn hình lớn. Để Ví dụ: người dùng có thể lưu các kiểu kết hợp ứng dụng mà họ yêu thích ở chế độ chia đôi màn hình để hãy truy cập và ghim thanh tác vụ trên màn hình để chuyển đổi nhanh giữa các ứng dụng. Điều này có nghĩa là việc đảm bảo ứng dụng của bạn có khả năng thích ứng là quan trọng hơn bao giờ hết.

Google I/O có các phiên về chủ đề Xây dựng Android thích ứng ứng dụngXây dựng giao diện người dùng bằng Material 3 thư viện thích ứng có thể hữu ích, và tài liệu của chúng tôi có nhiều tài liệu hơn để giúp bạn Thiết kế cho màn hình.

Hỗ trợ màn hình ngoài

Ứng dụng của bạn có thể khai báo một thuộc tính mà Android 15 sử dụng để cho phép Application hoặc Activity hiển thị trên màn hình nhỏ của các thiết bị có thể gập lại được hỗ trợ. Những màn hình này quá nhỏ để được coi là mục tiêu tương thích để chạy ứng dụng Android, nhưng ứng dụng của bạn có thể chọn hỗ trợ các màn hình này, giúp ứng dụng của bạn có mặt ở nhiều nơi hơn.

Khả năng kết nối

Android 15 cập nhật nền tảng để cấp cho ứng dụng của bạn quyền truy cập vào những tiến bộ mới nhất trong công nghệ truyền thông và không dây.

Hỗ trợ vệ tinh

Android 15 tiếp tục mở rộng khả năng hỗ trợ nền tảng cho khả năng kết nối vệ tinh và bao gồm một số thành phần trên giao diện người dùng để đảm bảo trải nghiệm người dùng nhất quán trên bối cảnh kết nối vệ tinh.

Các ứng dụng có thể dùng ServiceState.isUsingNonTerrestrialNetwork() để phát hiện thời điểm thiết bị được kết nối với vệ tinh, giúp thiết bị nhận biết rõ hơn về lý do tại sao dịch vụ mạng đầy đủ có thể không khả dụng. Ngoài ra, Android 15 còn hỗ trợ các ứng dụng SMS và MMS cũng như các ứng dụng RCS được tải sẵn để sử dụng kết nối vệ tinh nhằm gửi và nhận tin nhắn.

Thông báo sẽ xuất hiện khi thiết bị kết nối với vệ tinh.

Trải nghiệm NFC mượt mà hơn

Android 15 is working to make the tap to pay experience more seamless and reliable while continuing to support Android's robust NFC app ecosystem. On supported devices, apps can request the NfcAdapter to enter observe mode, where the device listens but doesn't respond to NFC readers, sending the app's NFC service PollingFrame objects to process. The PollingFrame objects can be used to auth ahead of the first communication to the NFC reader, allowing for a one tap transaction in many cases.

In addition, apps can register a filter on supported devices so they can be notified of polling loop activity, which allows for smooth operation with multiple NFC-aware applications.

Vai trò Ví

Android 15 ra mắt vai trò Wallet cho phép tích hợp chặt chẽ hơn với ứng dụng ví mà người dùng ưu tiên. Vai trò này thay thế chế độ cài đặt thanh toán không tiếp xúc mặc định bằng NFC. Người dùng có thể quản lý chủ sở hữu vai trò Wallet bằng cách chuyển đến phần Cài đặt > Ứng dụng > Ứng dụng mặc định.

Vai trò Wallet được dùng khi định tuyến các thao tác nhấn NFC cho AID được đăng ký trong danh mục thanh toán. Lượt nhấn luôn chuyển đến chủ sở hữu vai trò Wallet, trừ phi một ứng dụng khác đã đăng ký cho cùng một AID đang chạy ở nền trước.

Vai trò này cũng được dùng để xác định vị trí của ô Truy cập nhanh vào Wallet khi được kích hoạt. Khi vai trò được đặt thành "Không có", thẻ Quick Access (Quyền truy cập nhanh) sẽ không xuất hiện và các thao tác nhấn NFC thuộc danh mục thanh toán chỉ được phân phối đến ứng dụng trên nền trước.

Bảo mật

Android 15 giúp bạn tăng cường khả năng bảo mật của ứng dụng, bảo vệ dữ liệu của ứng dụng và giúp người dùng minh bạch hơn cũng như có nhiều quyền kiểm soát hơn đối với dữ liệu của họ. Hãy xem bài nói chuyện Đảm bảo an toàn cho người dùng trên Android tại Google I/O để biết thêm về những việc chúng tôi đang làm nhằm cải thiện các biện pháp bảo vệ người dùng và bảo vệ ứng dụng của bạn trước các mối đe doạ mới.

Tích hợp Trình quản lý thông tin xác thực với tính năng tự động điền

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.

Tích hợp tính năng đăng ký và đăng nhập bằng một lần nhấn với lời nhắc sinh trắc học

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.

Quản lý khoá để mã hoá hai đầu

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.

Kiểm tra quyền trên URI nội dung

Android 15 giới thiệu một bộ API thực hiện việc kiểm tra quyền trên URI nội dung:

  • Context.checkContentUriPermissionFull: Thao tác này thực hiện một quy trình kiểm tra quyền đầy đủ đối với URI nội dung.
  • Thuộc tính tệp kê khai Activity requireContentUriPermissionFromCaller: Thuộc tính này thực thi các quyền đã chỉ định trên URI nội dung được cung cấp khi khởi chạy hoạt động.
  • Lớp ComponentCaller cho phương thức gọi Activity: Lớp này đại diện cho ứng dụng đã khởi chạy hoạt động.

Hỗ trợ tiếp cận

Android 15 bổ sung các tính năng giúp cải thiện khả năng hỗ trợ tiếp cận cho người dùng.

Cải thiện chữ nổi

In Android 15, we've made it possible for TalkBack to support Braille displays that are using the HID standard over both USB and secure Bluetooth.

This standard, much like the one used by mice and keyboards, will help Android support a wider range of Braille displays over time.

Quốc tế hoá

Android 15 bổ sung các tính năng và khả năng bổ sung cho trải nghiệm người dùng khi một thiết bị được sử dụng bằng nhiều ngôn ngữ.

Phông chữ biến đổi CJK

Starting with Android 15, the font file for Chinese, Japanese, and Korean (CJK) languages, NotoSansCJK, is now a variable font. Variable fonts open up possibilities for creative typography in CJK languages. Designers can explore a broader range of styles and create visually striking layouts that were previously difficult or impossible to achieve.

How the variable font for Chinese, Japanese, and Korean (CJK) languages appears with different font widths.

Căn đều khoảng cách giữa các ký tự

Kể từ Android 15, bạn có thể căn chỉnh văn bản bằng cách sử dụng khoảng cách chữ cái bằng cách đang sử dụng JUSTIFICATION_MODE_INTER_CHARACTER. Lý do giữa các từ cũ là được ra mắt lần đầu trong Android 8.0 (API cấp 26) và liên ký tự Dịch vụ này cung cấp các khả năng tương tự cho các ngôn ngữ sử dụng ký tự khoảng trắng để phân đoạn, chẳng hạn như tiếng Trung, tiếng Nhật và các loại khác.

Bố cục cho văn bản tiếng Nhật bằng JUSTIFICATION_MODE_NONE.
Bố cục cho văn bản tiếng Anh bằng cách sử dụng JUSTIFICATION_MODE_NONE.


Bố cục cho văn bản tiếng Nhật bằng cách sử dụng JUSTIFICATION_MODE_INTER_WORD.
Bố cục cho văn bản tiếng Anh bằng cách sử dụng JUSTIFICATION_MODE_INTER_WORD.


Bố cục cho văn bản tiếng Nhật bằng cách sử dụng JUSTIFICATION_MODE_INTER_CHARACTER.
Bố cục cho văn bản tiếng Anh bằng cách sử dụng JUSTIFICATION_MODE_INTER_CHARACTER.

Tự động định cấu hình dấu ngắt dòng

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.

Phông chữ Hentaigana bổ sung của Nhật Bản

Trong Android 15, một tệp phông chữ dành cho chữ Hiragana tiếng Nhật cũ (còn gọi là Hentaigana) được nhóm theo mặc định. Hình dạng độc đáo của các nhân vật trong Hentaigana có thể khiến nét đặc trưng riêng cho hình minh hoạ hoặc thiết kế, đồng thời vẫn giúp đảm bảo tính chính xác sự truyền tải và hiểu biết của các tài liệu cổ của Nhật Bản.

Kiểu ký tự và văn bản của Hentaigana tiếng Nhật phông chữ.

VideoLAN cone Bản quyền (c) 1996-2010 VideoLAN. Bất kỳ ai cũng có thể sử dụng hoặc sửa đổi biểu trưng này hoặc phiên bản sửa đổi để tham chiếu đến dự án VideoLAN hoặc bất kỳ sản phẩm nào do nhóm VideoLAN phát triển, nhưng điều này không có nghĩa là dự án này chứng thực.

Vulkan và biểu trưng Vulkan là các nhãn hiệu đã đăng ký của Khronos Group Inc.

OpenGL là nhãn hiệu đã đăng ký và biểu trưng OpenGL ES là nhãn hiệu của Hewlett Packard Enterprise được sử dụng theo sự cho phép của Khronos.