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 được thêm, hãy truy cập tài liệu tham khảo về API cho Android. Đối với Android 15, hãy tìm các API được thêm vào API cấp 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 15tấ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 cung cấp cho bạn quyền truy cập vào các công cụ và phần cứng để hỗ trợ nhà 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 về 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 nội dung nghe nhìn và camera hiện đại 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 bổ sung một tiện ích để kiểm soát tốt hơn phần cứng máy ảnh và các thuật toán của phần cứng đó trên các thiết bị được hỗ trợ:

  • Tính năng Điều chỉnh cường độ đèn flash nâng cao cho phép kiểm soát chính xác cường độ đèn flash ở cả chế độ SINGLETORCH trong khi chụp ảnh.

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

Android 15 chooses HDR headroom that is appropriate for the underlying device capabilities and bit-depth of the panel. For pages that have lots of SDR content, such as a messaging app displaying a single HDR thumbnail, this behavior can end up adversely influencing the perceived brightness of the SDR content. Android 15 lets you control the HDR headroom with setDesiredHdrHeadroom to strike a balance between SDR and HDR content.

The brightness of SDR UI elements on the left screen appears to be more uniform than the brightness on the right screen, which simulates possible headroom issues when HDR and SDR content are mixed. By adjusting the HDR headroom, you can achieve a better balance between the SDR and HDR content.

Kiểm soát độ lớn âm thanh

Android 15 hỗ trợ cho Tiêu chuẩn độ lớn CTA-2075 để trợ giúp bạn tránh sự không thống nhất về độ ồn của âm thanh và đảm bảo người dùng không phải liên tục điều chỉnh âm lượng khi chuyển đổi giữa các nội dung. Hệ thống tận dụng các đặc điểm đã biết của thiết bị đầu ra (tai nghe và loa) cùng với siêu dữ liệu về độ to trong nội dung âm thanh AAC để điều chỉnh độ to của âm thanh và mức độ nén phạm vi động một cách thông minh.

Để bật tính năng này, bạn cần đảm bảo siêu dữ liệu về độ to trong nội dung AAC và bật tính năng nền tảng trong ứng dụng. Để thực hiện việc này, bạn tạo bản sao của đối tượng LoudnessCodecController bằng cách gọi phương thức nhà máy create của đối tượng đó với mã phiên âm thanh từ AudioTrack được liên kết; thao tác này sẽ tự động bắt đầu áp dụng các bản cập nhật âm thanh. Bạn có thể truyền một OnLoudnessCodecUpdateListener để sửa đổi hoặc lọc các thông số âm lượng trước khi áp dụng các thông số đó trên 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 cũng sẽ được cập nhật để sử dụng Các API LoudnessCodecController để tích hợp liền mạch ứng dụng.

Thiết bị MIDI 2.0 ảo

Android 13 added support for connecting to MIDI 2.0 devices using USB, which communicate using Universal MIDI Packets (UMP). Android 15 extends UMP support to virtual MIDI apps, enabling composition apps to control synthesizer apps as a virtual MIDI 2.0 device just like they would with an USB MIDI 2.0 device.

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

Biểu trưng dav1d

dav1d, bộ giải mã phần mềm AV1 phổ biến của VideoLAN, có sẵn cho các thiết bị Android không hỗ trợ giải mã AV1 trong phần cứng. dav1d có hiệu suất cao hơn gấp 3 lần so với bộ giải mã phần mềm AV1 cũ, cho phép phát AV1 ở độ phân giải cao cho nhiều người dùng hơn, bao gồm cả một số thiết bị cấp thấp và trung bình.

Ứng dụng của bạn cần chọn sử dụng dav1d bằng cách gọi theo tên "c2.android.av1-dav1d.decoder". dav1d sẽ được đặt làm bộ giải mã phần mềm AV1 mặc định trong bản cập nhật tiếp theo. Tính năng hỗ trợ này được chuẩn hoá và điều chỉnh cho phiên bản cũ là các thiết bị Android 11 nhận được bản cập nhật hệ thống Google Play.

Năng suất và công cụ dành 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 xoay quanh các công cụ như Android Studio, Jetpack Compose và các 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 trên nền tảng này.

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

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

The following key features and improvements are included:

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

Cải thiện tệp 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 OpenType Variable Font API

Android 15 cải thiện khả năng hữu dụng của phông chữ biến đổi OpenType. Bạn có thể tạo thực thể FontFamily từ phông chữ có thể thay đổi mà không chỉ định các trục trọng số bằng API buildVariableFamily. Trình kết xuất văn bản ghi đè giá trị trên trục wght để khớp với văn bản đang hiển thị.

Việc sử dụng API giúp đơn giản hoá đáng kể mã để tạo 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();

Trước đây, để tạo cùng một Typeface, bạn cần nhiều mã hơn:

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

Dưới đây là ví dụ về cách một Typeface được tạo bằng cả API cũ và mới hiển thị:

Một ví dụ về sự khác biệt giữa quá trình kết xuất Phông chữ khi sử dụng kiểu kết xuất mới và cũ
API

Trong ví dụ này, Typeface được tạo bằng API cũ không có khả năng tạo độ đậm phông chữ chính xác cho các thực thể Font 350, 450, 550 và 650, vì vậy, trình kết xuất sẽ quay lại độ đậm gần nhất. Vì vậy, trong trường hợp này, 300 được kết xuất thay vì 350, 400 được kết xuất thay vì 450, v.v. Ngược lại, Typeface được tạo bằng các API mới sẽ tự động tạo thực thể Font cho một trọng số nhất định, do đó trọng số chính xác được hiển thị là 350, 450, 550 và 650.

Các chế độ 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 và Google Play đã công bố hỗ trợ tính năng lưu trữ ứng dụng vào năm ngoái, cho phép người dùng giải phóng dung lượng bằng cách xoá một phần các ứng dụng ít dùng trên thiết bị được phát hành bằng Android App Bundle trên Google Play. Android 15 hỗ trợ cấp hệ điều hành để lưu trữ và huỷ lưu trữ ứng dụng, giúp tất cả các cửa hàng ứng dụng dễ dàng triển khai tính năng này.

Các ứng dụng có quyền REQUEST_DELETE_PACKAGES có thể gọi PackageInstaller requestArchive để yêu cầu lưu trữ một đã cài đặt gói ứng dụng. Thao tác này sẽ xoá APK và mọi tệp đã lưu vào bộ nhớ đệm nhưng vẫn tồn tại dữ liệu người dùng. Các ứng dụng đã lưu trữ được trả về dưới dạng ứng dụng có thể hiển thị thông qua các API LauncherApps; người dùng sẽ thấy một cách xử lý giao diện người dùng để làm nổi bật rằng các ứng dụng đó đã được lưu trữ. Nếu người dùng nhấn vào một ứng dụng đã lưu trữ, trình cài đặt chịu trách nhiệm sẽ nhận được yêu cầu huỷ lưu trữ ứng dụng đó và quá trình khôi phục có thể được theo dõi bằng thông báo truyền tin ACTION_PACKAGE_ADDED.

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 điểm cải tiến mới nhất về đồ hoạ, bao gồm cả ANGLE và các điểm bổ sung cho hệ thống đồ hoạ Canvas.

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

Biểu trưng Vulkan

Phần cứng Android đã phát triển khá nhiều so với những ngày đầu khi hệ điều hành cốt lõi chạy trên một CPU và GPU được truy cập bằng các API dựa trên quy trình chức năng cố định. API đồ hoạ Vulkan® đã có trong NDK kể từ Android 7.0 (API cấp 24) với khả năng trừu tượng cấp thấp hơn phản ánh tốt hơn phần cứng GPU hiện đại, mở rộng tốt hơn để hỗ trợ nhiều nhân CPU và giảm hao tổn trình điều khiển CPU, nhờ đó cải thiện hiệu suất ứng dụng. Tất cả công cụ phát triển trò chơi hiện đại đều hỗ trợ Vulkan.

Vulkan là giao diện ưu tiên của Android cho GPU. Do đó, Android 15 bao gồm ANGLE dưới dạng một lớp không bắt buộc để chạy OpenGL® ES trên Vulkan. Việc chuyển sang ANGLE sẽ chuẩn hoá việc triển khai OpenGL của Android để cải thiện khả năng tương thích và trong một số trường hợp, cải thiện hiệu suất. Bạn có thể kiểm thử độ ổn định và hiệu suất của ứng dụng OpenGL ES bằng ANGLE bằng cách bật tuỳ chọn cho nhà phát triển trong phần Settings -> System -> Developer Options -> Experimental: Enable ANGLE (Cài đặt -> Hệ thống -> Tuỳ chọn cho nhà phát triển -> Thử nghiệm: Bật ANGLE) trên Android 15.

Lộ trình của Android ANGLE trên Vulkan

Lộ trình về những thay đổi sắp tới đối với API GPU Android.

Để đơn giản hoá ngăn xếp GPU, trong tương lai, chúng tôi sẽ phân phối ANGLE làm trình điều khiển hệ thống GL trên nhiều thiết bị mới hơn, với kỳ vọng rằng OpenGL/ES sẽ chỉ có sẵn thông qua ANGLE. Tuy nhiên, chúng tôi dự định tiếp tục hỗ trợ OpenGL ES trên tất cả thiết bị.

Các bước nên làm tiếp theo

Sử dụng tuỳ chọn dành cho nhà phát triển để chọn trình điều khiển ANGLE cho OpenGL ES và kiểm thử ứng dụng. Đối với các dự án mới, bạn nên sử dụng Vulkan cho C/C++.

Những điểm 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 ứng dụng và thu thập thông tin chi tiết về ứng dụng của bạn.

Để biết các phương pháp hay nhất giúp tiết kiệm pin, gỡ lỗi mức sử dụng mạng và điện năng, cũng như thông tin chi tiết về cách chúng tôi cải thiện hiệu suất sử dụng pin của hoạt động ở chế độ 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 sử dụng pin của hoạt động ở chế độ nền trên Android trong Google I/O.

ApplicationStartInfo API

Trong các phiên bản Android trước, việc khởi động ứng dụng có phần bí ẩn. Khó xác định trong ứng dụng của bạn liệu ứng dụng đó có bắt đầu từ trạng thái nguội, ấm hay nóng hay không. Bạn cũng khó biết ứng dụng của mình đã mất bao lâu trong các giai đoạn khởi chạy: phân nhánh quy trình, gọi onCreate, vẽ khung đầu tiên, v.v. Khi lớp Application được tạo bản sao, bạn không có cách nào để biết liệu ứng dụng có bắt đầu từ một thông báo truyền tin, nhà cung cấp nội dung, công việc, bản sao lưu, khởi động hoàn tất, chuông báo hay Activity hay không.

API ApplicationStartInfo trên Android 15 cung cấp tất cả những tính năng này và nhiều tính năng khác. Bạn thậm chí có thể chọn thêm dấu thời gian của riêng mình vào quy trình để thu thập dữ liệu thời gian ở một nơi. Ngoài việc thu thập các chỉ số, bạn có thể sử dụng ApplicationStartInfo để giúp trực tiếp tối ưu hoá quá trình khởi động ứng dụng; ví dụ: bạn có thể loại bỏ việc tạo bản sao tốn kém của các thư viện liên quan đến giao diện người dùng trong lớp Application khi ứng dụng khởi động do một thông báo truyền tin.

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

Kể từ Android 8.0 (API cấp 26), Android đã đưa API StorageStats.getAppBytes vào để tóm tắt kích thước đã cài đặt của một ứng dụng dưới dạng một số byte duy nhất, là tổng kích thước APK, kích thước của các tệp được trích xuất từ APK và các tệp được tạo trên thiết bị, chẳng hạn như mã được biên dịch trước (AOT). Con số này không phản ánh rõ ràng cách ứng dụng của bạn đang sử dụng bộ nhớ.

Android 15 bổ sung API StorageStats.getAppBytesByDataType([type]), cho phép bạn nắm được thông tin chi tiết về cách ứng dụng sử dụng tất cả không gian đó, bao gồm cả các phần phân tách tệp APK, mã liên quan đến AOT và tăng tốc, siêu dữ liệu dex, thư viện và hồ sơ được hướng dẫn.

Lập hồ sơ do ứng dụng quản lý

Android 15 bao gồm lớp ProfilingManager, cho phép bạn thu thập thông tin phân tích tài nguyên từ trong ứng dụng, chẳng hạn như tệp báo lỗi, hồ sơ vùng nhớ khối xếp, lấy mẫu ngăn xếp, v.v. Mã này cung cấp lệnh gọi lại cho ứng dụng kèm theo thẻ đã cung cấp để xác định tệp đầu ra. Tệp này được phân phối đến thư mục tệp của ứng dụng. API này giới hạn tốc độ để giảm thiểu tác động đến hiệu suất.

Để đơn giản hoá việc tạo các yêu cầu phân tích tài nguyên trong ứng dụng, bạn nên sử dụng API AndroidX Profiling tương ứng, có trong Core 1.15.0-rc01 trở lên.

Cải thiện 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.

Bản 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)
}

Các chức năng mở rộng của IntentFilter

Android 15 tích hợp tính năng hỗ trợ độ phân giải Intent chính xác hơn thông qua UriRelativeFilterGroup. Tính năng này chứa một tập hợp các đối tượng UriRelativeFilter tạo thành một tập hợp các quy tắc so khớp Intent mà mỗi quy tắc phải được đáp ứng, bao gồm cả các tham số truy vấn URL, phân đoạn URL và các quy tắc chặn hoặc loại trừ.

Bạn có thể xác định các quy tắc này trong tệp XML AndroidManifest bằng thẻ <uri-relative-filter-group>. Thẻ này có thể bao gồm thẻ android:allow (không bắt buộc). Các thẻ này có thể chứa thẻ <data> sử dụng các thuộc tính thẻ dữ liệu hiện có cũng như thuộc tính android:queryandroid:fragment.

Sau đây là ví dụ về cú pháp AndroidManifest:

<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ư

Bạn có thể mở khoá và khoá không gian riêng tư để hiển thị hoặc ẩn các ứng dụng nhạy cảm trên thiết bị.

Không gian riêng tư cho phép người dùng tạo một không gian riêng biệt trên thiết bị của họ, nơi họ có thể bảo vệ các ứng dụng nhạy cảm khỏi những ánh mắt tò mò, nhờ một lớp xác thực bổ sung. Không gian riêng tư sử dụng một hồ sơ người dùng riêng biệt. Người dùng có thể chọn sử dụng phương thức khoá thiết bị hoặc một phương thức khoá riêng biệt cho không gian riêng tư.

Các ứng dụng trong không gian riêng tư sẽ xuất hiện trong một vùng chứa riêng biệt trong trình chạy và bị ẩn khỏi chế độ xem gần đây, thông báo, phần cài đặt và các ứng dụng khác khi không gian riêng tư bị khoá. Nội dung do người dùng tạo và tải xuống (chẳng hạn như nội dung nghe nhìn hoặc tệp) và tài khoản được tách riêng giữa không gian riêng tư và không gian chính. Bạn có thể dùng trang chia sẻ nội dung của hệ thốngcông cụ chọn ảnh để cấp cho ứng dụng quyền truy cập vào nội dung trên các không gian khi không gian riêng tư được mở khoá.

Người dùng không thể di chuyển các ứng dụng hiện có và dữ liệu của ứng dụng vào không gian riêng tư. Thay vào đó, người dùng chọn một tuỳ chọn cài đặt trong không gian riêng tư để cài đặt ứng dụng bằng bất kỳ cửa hàng ứng dụng nào họ muốn. Các ứng dụng trong không gian riêng tư được cài đặt dưới dạng bản sao riêng biệt với mọi ứng dụng trong không gian chính (bản sao mới của cùng một ứng dụng).

Khi người dùng khoá không gian riêng tư, hồ sơ sẽ bị dừng. Khi hồ sơ bị dừng, các ứng dụng trong không gian riêng tư sẽ không còn hoạt động và không thể thực hiện các hoạt động trên nền trước hoặc trong nền, bao gồm cả việc hiển thị thông báo.

Bạn nên kiểm thử ứng dụng của mình trong không gian riêng tư để đảm bảo ứng dụng hoạt động như mong đợi, đặc biệt là nếu ứng dụng của bạn thuộc một trong các danh mục sau:

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

Apps can now highlight only the most-recently-selected photos and videos when partial access to media permissions is granted. This feature can improve the user experience for apps that frequently request access to photos and videos. To use this feature in your app, enable the QUERY_ARG_LATEST_SELECTION_ONLY argument when querying MediaStore through 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 mang đến cho nhà phát triển ứng dụng và người dùng nhiều quyền kiểm soát và tính linh hoạt hơn khi đị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 điểm 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 trong ứng dụng Android tại Google I/O.

Xem trước tiện ích phong phú hơn bằng Generated Previews API

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

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

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

Push API

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

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

The expected flow is:

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

When to call setWidgetPreview

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

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

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

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

Hình trong hình

Android 15 introduces changes in Picture-in-Picture (PiP) ensuring an even smoother transition when entering into PiP mode. This will be beneficial for apps having UI elements overlaid on top of their main UI, which goes into PiP.

Developers use the onPictureInPictureModeChanged callback to define logic that toggles the visibility of the overlaid UI elements. This callback is triggered when the PiP enter or exit animation is completed. Beginning in Android 15, the PictureInPictureUiState class includes another state.

With this UI state, apps targeting Android 15 (API level 35) will observe the Activity#onPictureInPictureUiStateChanged callback being invoked with isTransitioningToPip() as soon as the PiP animation starts. There are many UI elements that are not relevant for the app when it is in PiP mode, for example views or layout that include information such as suggestions, upcoming video, ratings, and titles. When the app goes to PiP mode, use the onPictureInPictureUiStateChanged callback to hide these UI elements. When the app goes to full screen mode from the PiP window, use onPictureInPictureModeChanged callback to unhide these elements, as shown in the following examples:

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

This quick visibility toggle of irrelevant UI elements (for a PiP window) helps ensure a smoother and flicker-free PiP enter animation.

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

AutomaticZenRule cho phép các ứng dụng tuỳ chỉnh các quy tắc Quản lý sự chú ý (Không làm phiền) và quyết định thời điểm kích hoạt hoặc huỷ kích hoạt các quy tắc đó. Android 15 cải thiện đáng kể các quy tắc này với mục tiêu cải thiện trải nghiệm người dùng. Các điểm cải tiến sau đây:

  • Thêm các loại vào AutomaticZenRule, cho phép hệ thống áp dụng các loại đặc biệt xử lý tín dụng đối với một số quy tắc.
  • Thêm một biểu tượng vào AutomaticZenRule, giúp cải thiện các chế độ có thể nhận ra.
  • Thêm một chuỗi triggerDescription vào AutomaticZenRule để mô tả các điều kiện mà quy tắc sẽ bắt đầu hoạt động cho người dùng.
  • Thêm ZenDeviceEffects vào AutomaticZenRule, cho phép các quy tắc kích hoạt những tính năng như hiển thị thang màu xám, chế độ ban đêm hoặc giảm độ sáng hình nền.

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

Android 15 hỗ trợ chế độ rung mạnh cho các thông báo đến bằng cách kênh của bạn bằng NotificationChannel.setVibrationEffect, vì vậy người dùng có thể phân biệt giữa các loại thông báo khác nhau mà không cần phải xem thiết bị của mình.

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

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

Khối thanh trạng thái để chia sẻ màn hình, truyền và ghi.

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

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

Cải thiện khả 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

Your app can declare a property that Android 15 uses to allow your Application or Activity to be presented on the small cover screens of supported flippable devices. These screens are too small to be considered as compatible targets for Android apps to run on, but your app can opt in to supporting them, making your app available in more places.

Khả năng kết nối

Android 15 cập nhật nền tảng để ứng dụng của bạn có thể sử dụng những tiến bộ mới nhất về 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ò trong Wallet

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 tính bảo mật cho ứng dụng, bảo vệ dữ liệu của ứng dụng và mang đến cho người dùng sự minh bạch cũng như quyền kiểm soát đối với dữ liệu của họ. Xem bài nói chuyện Bảo vệ tính bảo mật của 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

Kể từ Android 15, nhà phát triển có thể liên kết các thành phần hiển thị cụ thể như trường tên người dùng hoặc mật khẩu với các yêu cầu của Trình quản lý thông tin xác thực, giúp dễ dàng cung cấp trải nghiệm phù hợp cho người dùng trong quá trình đăng nhập. Khi người dùng tập trung vào một trong các chế độ xem này, một yêu cầu tương ứng sẽ được gửi đến Trình quản lý thông tin xác thực. Thông tin xác thực thu được được tổng hợp trên các trình cung cấp và hiển thị trong giao diện người dùng dự phòng tự động điền, chẳng hạn như đề xuất cùng dòng hoặc đề xuất thả xuống. Thư viện Jetpack androidx.credentials là điểm cuối ưu tiên mà nhà phát triển nên sử dụng và sẽ sớm ra mắt để nâng cao hơn nữa tính năng này trong Android 15 trở lên.

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 đối với 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.

Chữ nổi hiệu quả hơn

Trong Android 15, chúng tôi đã hỗ trợ TalkBack hỗ trợ màn hình chữ nổi đang sử dụng tiêu chuẩn HID qua cả USB và Bluetooth bảo mật.

Tiêu chuẩn này, giống như tiêu chuẩn mà chuột và bàn phím sử dụng, sẽ giúp Android hỗ trợ nhiều màn hình chữ nổi hơn theo thời gian.

Quốc tế hoá

Android 15 bổ sung các tính năng và chức năng bổ trợ cho trải nghiệm người dùng khi thiết bị được 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 chỉnh giữa các ký tự

Starting with Android 15, text can be justified utilizing letter spacing by using JUSTIFICATION_MODE_INTER_CHARACTER. Inter-word justification was first introduced in Android 8.0 (API level 26), and inter-character justification provides similar capabilities for languages that use the whitespace character for segmentation, such as Chinese, Japanese, and others.

Layout for Japanese text using JUSTIFICATION_MODE_NONE.
Layout for English text using JUSTIFICATION_MODE_NONE.


Layout for Japanese text using JUSTIFICATION_MODE_INTER_WORD.
Layout for English text using JUSTIFICATION_MODE_INTER_WORD.


Layout for Japanese text using the JUSTIFICATION_MODE_INTER_CHARACTER.
Layout for English text using the JUSTIFICATION_MODE_INTER_CHARACTER.

Cấu hình ngắt dòng tự độ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 tiếng Nhật bổ sung

In Android 15, a font file for old Japanese Hiragana (known as Hentaigana) is bundled by default. The unique shapes of Hentaigana characters can add a distinctive flair to artwork or design while also helping to preserve accurate transmission and understanding of ancient Japanese documents.

Character and text style for the Japanese Hentaigana font.

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.