Thay đổi về hành vi: Ứng dụng nhắm đến Android 16 trở lên

Giống như các bản phát hành trước, Android 16 có các thay đổi về hành vi có thể ảnh hưởng đến ứng dụng của bạn. Những thay đổi về hành vi sau đây chỉ áp dụng cho ứng dụng nhắm đến Android 16 trở lên. Nếu ứng dụng của bạn nhắm đến Android 16 trở lên, bạn nên điều chỉnh ứng dụng để hỗ trợ những hành vi này (nếu cần).

Ngoài ra, hãy nhớ tham khảo danh sách thay đổi về hành vi ảnh hưởng đến tất cả ứng dụng chạy trên Android 16 bất kể targetSdkVersion của ứng dụng.

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

Android 16 (API cấp 36) có các thay đổi sau đây nhằm tạo ra trải nghiệm người dùng nhất quán và trực quan hơn.

Xoá chế độ chọn không hiển thị tràn viền

Android 15 enforced edge-to-edge for apps targeting Android 15 (API level 35), but your app could opt-out by setting R.attr#windowOptOutEdgeToEdgeEnforcement to true. For apps targeting Android 16 (API level 36), R.attr#windowOptOutEdgeToEdgeEnforcement is deprecated and disabled, and your app can't opt-out of going edge-to-edge.

  • If your app targets Android 16 (API level 36) and is running on an Android 15 device, R.attr#windowOptOutEdgeToEdgeEnforcement continues to work.
  • If your app targets Android 16 (API level 36) and is running on an Android 16 device, R.attr#windowOptOutEdgeToEdgeEnforcement is disabled.

For testing in Android 16 Beta 3, ensure your app supports edge-to-edge and remove any use of R.attr#windowOptOutEdgeToEdgeEnforcement so that your app also supports edge-to-edge on an Android 15 device. To support edge-to-edge, see the Compose and Views guidance.

Bạn phải di chuyển hoặc chọn không sử dụng tính năng xem trước thao tác quay lại

对于以 Android 16(API 级别 36)或更高版本为目标平台且在 Android 16 或更高版本的设备上运行的应用,预测性返回系统动画(返回主屏幕、跨任务和跨 activity)默认处于启用状态。此外,系统不会调用 onBackPressed,也不会再调度 KeyEvent.KEYCODE_BACK

如果您的应用拦截了返回事件,并且您尚未迁移到预测性返回,请更新应用以使用受支持的返回导航 API;或者,在应用的 AndroidManifest.xml 文件的 <application><activity> 标记中将 android:enableOnBackInvokedCallback 属性设置为 false,以暂时停用此功能。

“返回主页”预测性返回动画。
预测性跨 activity 动画。
预测性跨任务动画。

Ngừng sử dụng và vô hiệu hoá API phông chữ thanh lịch

Các ứng dụng nhắm đến Android 15 (API cấp 35) có thuộc tính elegantTextHeight TextView được đặt thành true theo mặc định, thay thế phông chữ thu gọn bằng phông chữ dễ đọc hơn nhiều. Bạn có thể ghi đè hành vi này bằng cách đặt thuộc tính elegantTextHeight thành false.

Android 16 không dùng thuộc tính elegantTextHeight nữa và thuộc tính này sẽ bị bỏ qua khi ứng dụng của bạn nhắm đến Android 16. "Phông chữ giao diện người dùng" do các API này kiểm soát sẽ ngừng hoạt động, vì vậy, bạn nên điều chỉnh mọi bố cục để đảm bảo việc hiển thị văn bản nhất quán và phù hợp với tương lai bằng tiếng Ả Rập, tiếng Lào, tiếng Myanmar, tiếng Tamil, tiếng Gujarati, tiếng Kannada, tiếng Malayalam, tiếng Odia, tiếng Telugu hoặc tiếng Thái.

Hành vi
elegantTextHeight cho các ứng dụng nhắm đến Android 14 (API cấp 34) trở xuống hoặc cho các ứng dụng nhắm đến Android 15 (API cấp 35) đã ghi đè hành vi mặc định bằng cách đặt thuộc tính elegantTextHeight thành false.
elegantTextHeight hành vi cho các ứng dụng nhắm đến Android 16 hoặc cho các ứng dụng nhắm đến Android 15 (API cấp 35) không ghi đè mặc định bằng cách đặt thuộc tính elegantTextHeight thành false.

Chức năng cốt lõi

Android 16 (API cấp 36) bao gồm các thay đổi sau đây để sửa đổi hoặc mở rộng nhiều tính năng cốt lõi của hệ thống Android.

Tối ưu hoá việc lên lịch công việc theo tỷ lệ cố định

Trước khi nhắm đến Android 16, khi scheduleAtFixedRate bỏ lỡ một lần thực thi tác vụ do nằm ngoài vòng đời quy trình hợp lệ, tất cả các lần thực thi bị bỏ lỡ sẽ thực thi ngay khi ứng dụng quay lại một vòng đời hợp lệ.

Khi nhắm đến Android 16, tối đa một lần thực thi bị bỏ lỡ của scheduleAtFixedRate sẽ được thực thi ngay lập tức khi ứng dụng quay lại một vòng đời hợp lệ. Thay đổi về hành vi này dự kiến sẽ cải thiện hiệu suất của ứng dụng. Kiểm thử hành vi này trong ứng dụng để xem ứng dụng của bạn có bị ảnh hưởng hay không. Bạn cũng có thể kiểm thử bằng cách sử dụng khung tương thích của ứng dụng và bật cờ tương thích STPE_SKIP_MULTIPLE_MISSED_PERIODIC_TASKS.

Kiểu dáng thiết bị

Android 16 (API cấp 36) có các thay đổi sau đây đối với ứng dụng khi hiển thị trên thiết bị màn hình lớn.

Bố cục thích ứng (Adaptive Layouts)

With Android apps now running on a variety of devices (such as phones, tablets, foldables, desktops, cars, and TVs) and windowing modes on large screens (such as split screen and desktop windowing), developers should build Android apps that adapt to any screen and window size, regardless of device orientation. Paradigms like restricting orientation and resizability are too restrictive in today's multidevice world.

Ignore orientation, resizability, and aspect ratio restrictions

For apps targeting Android 16 (API level 36), Android 16 includes changes to how the system manages orientation, resizability, and aspect ratio restrictions. On displays with smallest width >= 600dp, the restrictions no longer apply. Apps also fill the entire display window, regardless of aspect ratio or a user's preferred orientation, and pillarboxing isn't used.

This change introduces a new standard platform behavior. Android is moving toward a model where apps are expected to adapt to various orientations, display sizes, and aspect ratios. Restrictions like fixed orientation or limited resizability hinder app adaptability, so we recommend making your app adaptive to deliver the best possible user experience.

You can also test this behavior by using the app compatibility framework and enabling the UNIVERSAL_RESIZABLE_BY_DEFAULT compat flag.

Common breaking changes

Ignoring orientation, resizability, and aspect ratio restrictions might impact your app's UI on some devices, especially elements that were designed for small layouts locked in portrait orientation: for example, issues like stretched layouts and off-screen animations and components. Any assumptions about aspect ratio or orientation can cause visual issues with your app. Learn more about how to avoid them and improve your app's adaptive behaviour.

Allowing device rotation results in more activity re-creation, which can result in losing user state if not properly preserved. Learn how to correctly save UI state in Save UI states.

Implementation details

The following manifest attributes and runtime APIs are ignored across large screen devices in full-screen and multi-window modes:

The following values for screenOrientation, setRequestedOrientation(), and getRequestedOrientation() are ignored:

  • portrait
  • reversePortrait
  • sensorPortrait
  • userPortrait
  • landscape
  • reverseLandscape
  • sensorLandscape
  • userLandscape

Regarding display resizability, android:resizeableActivity="false", android:minAspectRatio, and android:maxAspectRatio have no effect.

For apps targeting Android 16 (API level 36), app orientation, resizability, and aspect ratio constraints are ignored on large screens by default, but every app that isn't fully ready can temporarily override this behavior by opting out (which results in the previous behavior of being placed in compatibility mode).

Exceptions

The Android 16 orientation, resizability, and aspect ratio restrictions don't apply in the following situations:

  • Games (based on the android:appCategory flag)
  • Users explicitly opting in to the app's default behavior in aspect ratio settings of the device
  • Screens that are smaller than sw600dp

Opt out temporarily

To opt out a specific activity, declare the PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY manifest property:

<activity ...>
  <property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
  ...
</activity>

If too many parts of your app aren't ready for Android 16, you can opt out completely by applying the same property at the application level:

<application ...>
  <property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
</application>

Sức khoẻ và thể chất

Android 16 (API cấp 36) bao gồm các thay đổi sau đây liên quan đến dữ liệu sức khoẻ và thể chất.

Quyền đối với dữ liệu sức khoẻ và thể hình

对于以 Android 16(API 级别 36)或更高版本为目标平台的应用,BODY_SENSORS 权限会使用 android.permissions.health 下的更精细权限,Health Connect 也会使用这些权限。从 Android 16 开始,凡是以前需要具有 BODY_SENSORSBODY_SENSORS_BACKGROUND 权限的 API,现在都需要获取相应的 android.permissions.health 权限。这会影响以下数据类型、API 和前台服务类型:

如果您的应用使用这些 API,则应请求相应的精细权限:

这些权限与用于保护对 Health Connect(用于存储健康、健身和身心健康数据的 Android 数据存储区)读取数据的权限相同。

移动应用

迁移到使用 READ_HEART_RATE 和其他精细权限的移动应用还必须声明 activity 以显示应用的隐私权政策。这与 Health Connect 的要求相同。

Khả năng kết nối

Android 16 (API cấp 36) có các thay đổi sau đây trong ngăn xếp Bluetooth để cải thiện khả năng kết nối với các thiết bị ngoại vi.

Ý định mới để xử lý việc mất liên kết và thay đổi về mã hoá

As part of the Improved bond loss handling, Android 16 also introduces 2 new intents to provide apps with greater awareness of bond loss and encryption changes.

Apps targeting Android 16 can now:

  • Receive an ACTION_KEY_MISSING intent when remote bond loss is detected, allowing them to provide more informative user feedback and take appropriate actions.
  • Receive an ACTION_ENCRYPTION_CHANGE intent whenever encryption status of the link changes. This includes encryption status change, encryption algorithm change, and encryption key size change. Apps must consider the bond restored if the link is successfully encrypted upon receiving ACTION_ENCRYPTION_CHANGE intent later.

Adapting to varying OEM implementations

While Android 16 introduces these new intents, their implementation and broadcasting can vary across different device manufacturers (OEMs). To ensure your app provides a consistent and reliable experience across all devices, developers should design their bond loss handling to gracefully adapt to these potential variations.

We recommend the following app behaviors:

  • If the ACTION_KEY_MISSING intent is broadcast:

    The ACL (Asynchronous Connection-Less) link will be disconnected by the system, but the bond information for the device will be retained (as described here).

    Your app should use this intent as the primary signal for bond loss detection and guiding the user to confirm the remote device is in range before initiating device forgetting or re-pairing.

    If a device disconnects after ACTION_KEY_MISSING is received, your app should be cautious about reconnecting, as the device may no longer be bonded with the system.

  • If the ACTION_KEY_MISSING intent is NOT broadcast:

    The ACL link will remain connected, and the bond information for the device will be removed by the system, same to behavior in Android 15.

    In this scenario, your app should continue its existing bond loss handling mechanisms as in previous Android releases, to detect and manage bond loss events.

Cách mới để xoá liên kết Bluetooth

Giờ đây, tất cả ứng dụng nhắm đến Android 16 đều có thể huỷ ghép nối thiết bị Bluetooth bằng cách sử dụng API công khai trong CompanionDeviceManager. Nếu một thiết bị đồng hành đang được quản lý dưới dạng liên kết CDM, thì ứng dụng có thể kích hoạt việc xoá liên kết Bluetooth bằng cách sử dụng API removeBond(int) mới trên thiết bị được liên kết. Ứng dụng có thể theo dõi các thay đổi về trạng thái liên kết bằng cách nghe sự kiện truyền tin của thiết bị Bluetooth ACTION_BOND_STATE_CHANGED.

Bảo mật

Android 16 (API cấp 36) có các thay đổi về bảo mật sau.

Khoá phiên bản MediaStore

Đối với các ứng dụng nhắm đến Android 16 trở lên, MediaStore#getVersion() hiện sẽ là duy nhất cho mỗi ứng dụng. Điều này giúp loại bỏ các thuộc tính nhận dạng khỏi chuỗi phiên bản để ngăn chặn việc lợi dụng và sử dụng cho các kỹ thuật tạo vân tay số. Ứng dụng không được đưa ra bất kỳ giả định nào về định dạng của phiên bản này. Các ứng dụng phải xử lý các thay đổi về phiên bản khi sử dụng API này và trong hầu hết các trường hợp, không cần thay đổi hành vi hiện tại, trừ phi nhà phát triển đã cố gắng suy luận thêm thông tin nằm ngoài phạm vi dự kiến của API này.

Ý định an toàn hơn

Tính năng Ý định an toàn hơn là một sáng kiến bảo mật nhiều giai đoạn được thiết kế để cải thiện tính bảo mật của cơ chế phân giải ý định của Android. Mục tiêu là bảo vệ ứng dụng khỏi các hành động độc hại bằng cách thêm các bước kiểm tra trong quá trình xử lý ý định và lọc ra những ý định không đáp ứng các tiêu chí cụ thể.

Trong Android 15, tính năng này tập trung vào ứng dụng gửi, nhưng giờ đây với Android 16, tính năng này sẽ chuyển quyền kiểm soát sang ứng dụng nhận, cho phép nhà phát triển chọn sử dụng tính năng phân giải ý định nghiêm ngặt bằng tệp kê khai ứng dụng.

Chúng tôi đang triển khai hai thay đổi chính:

  1. Ý định tường minh phải khớp với bộ lọc ý định của thành phần mục tiêu: Nếu một ý định nhắm đến một thành phần một cách rõ ràng, thì ý định đó phải khớp với bộ lọc ý định của thành phần đó.

  2. Ý định không có hành động không thể khớp với bất kỳ bộ lọc ý định nào: Ý định không có hành động được chỉ định không được phân giải đến bất kỳ bộ lọc ý định nào.

Những thay đổi này chỉ áp dụng khi có nhiều ứng dụng liên quan và không ảnh hưởng đến việc xử lý ý định trong một ứng dụng.

Tác động

Tính chất chọn tham gia có nghĩa là nhà phát triển phải bật tính năng này một cách rõ ràng trong tệp kê khai ứng dụng để tính năng này có hiệu lực. Do đó, tác động của tính năng này sẽ chỉ giới hạn ở những ứng dụng mà nhà phát triển:

  • Biết về tính năng Ý định an toàn hơn và lợi ích của tính năng này.
  • Chủ động chọn tích hợp các phương pháp xử lý ý định nghiêm ngặt hơn vào ứng dụng của họ.

Phương pháp chọn tham gia này giúp giảm thiểu nguy cơ làm hỏng các ứng dụng hiện có có thể dựa vào hành vi phân giải ý định kém an toàn hiện tại.

Mặc dù tác động ban đầu trong Android 16 có thể bị hạn chế, nhưng sáng kiến Ý định an toàn hơn có lộ trình để tác động rộng rãi hơn trong các bản phát hành Android trong tương lai. Cuối cùng, chúng tôi dự định sẽ đặt độ phân giải ý định nghiêm ngặt làm hành vi mặc định.

Tính năng Ý định an toàn hơn có khả năng nâng cao đáng kể tính bảo mật của hệ sinh thái Android bằng cách khiến các ứng dụng độc hại khó khai thác các lỗ hổng trong cơ chế phân giải ý định hơn.

Tuy nhiên, bạn phải quản lý cẩn thận quá trình chuyển đổi sang chế độ chọn không sử dụng và thực thi bắt buộc để giải quyết các vấn đề có thể xảy ra về khả năng tương thích với các ứng dụng hiện có.

Triển khai

Nhà phát triển cần bật tính năng so khớp ý định nghiêm ngặt hơn một cách rõ ràng bằng cách sử dụng thuộc tính intentMatchingFlags trong tệp kê khai ứng dụng. Sau đây là ví dụ về trường hợp tính năng này là tuỳ chọn cho toàn bộ ứng dụng, nhưng bị tắt/không sử dụng trên một broadcast receiver:

<application android:intentMatchingFlags="enforceIntentFilter">
    <receiver android:name=".MyBroadcastReceiver" android:exported="true" android:intentMatchingFlags="none">
        <intent-filter>
            <action android:name="com.example.MY_CUSTOM_ACTION" />
        </intent-filter>
        <intent-filter>
            <action android:name="com.example.MY_ANOTHER_CUSTOM_ACTION" />
        </intent-filter>
    </receiver>
</application>

Thông tin thêm về các cờ được hỗ trợ:

Tên cờ Mô tả
enforceIntentFilter Thực thi tính năng so khớp nghiêm ngặt hơn cho các ý định sắp tới
none Tắt tất cả quy tắc so khớp đặc biệt cho ý định sắp tới. Khi chỉ định nhiều cờ, các giá trị xung đột sẽ được giải quyết bằng cách ưu tiên cờ "none"
allowNullAction Nới lỏng các quy tắc so khớp để cho phép các ý định không có hành động để so khớp. Cờ này được sử dụng cùng với "enforceIntentFilter" để đạt được một hành vi cụ thể

Kiểm thử và gỡ lỗi

Khi biện pháp thực thi đang hoạt động, các ứng dụng sẽ hoạt động chính xác nếu phương thức gọi ý định đã điền chính xác ý định. Tuy nhiên, các ý định bị chặn sẽ kích hoạt thông báo nhật ký cảnh báo như "Intent does not match component's intent filter:""Access blocked:" có thẻ "PackageManager.". Điều này cho thấy một vấn đề tiềm ẩn có thể ảnh hưởng đến ứng dụng và cần được chú ý.

Bộ lọc logcat:

tag=:PackageManager & (message:"Intent does not match component's intent filter:" | message: "Access blocked:")

Quyền riêng tư

Android 16 (API cấp 36) có các thay đổi về quyền riêng tư sau đây.

Quyền truy cập mạng cục bộ

具有 INTERNET 权限的任何应用都可以访问 LAN 上的设备。这样一来,应用便可以轻松连接到本地设备,但也存在隐私问题,例如形成用户的指纹,以及充当位置信息的代理。

本地网络保护项目旨在通过将对本地网络的访问权限置于新的运行时权限后面来保护用户的隐私。

发布计划

这项更改将在两个版本(分别为 25Q2 和 TBD)之间部署。开发者必须遵循 25Q2 的相关指南并分享反馈,因为这些保护措施将在较新的 Android 版本中强制执行。此外,他们需要按照以下指南更新依赖于隐式本地网络访问权限的场景,并为用户拒绝和撤消新权限做好准备。

影响

目前,LNP 是一项用户可选择启用的功能,这意味着只有选择启用该功能的应用会受到影响。选择启用阶段的目标是让应用开发者了解其应用的哪些部分依赖于隐式本地网络访问权限,以便他们为下一个版本做好权限保护准备。

如果应用使用以下方式访问用户的本地网络,则会受到影响:

  • 在本地网络地址上直接或通过库使用原始套接字(例如 mDNS 或 SSDP 服务发现协议)
  • 使用访问本地网络的框架级类(例如 NsdManager)

本地网络地址发送的流量需要本地网络访问权限。下表列出了一些常见用例:

应用低级网络操作 需要本地网络权限
建立出站 TCP 连接
接受传入的 TCP 连接
发送 UDP 单播、多播、广播
接收传入的 UDP 单播、多播、广播

这些限制在网络堆栈深处实现,因此适用于所有网络 API。这包括在原生代码或受管理代码中创建的套接字、Cronet 和 OkHttp 等网络库,以及在这些库之上实现的任何 API。尝试解析本地网络上的服务(即带有 .local 后缀的服务)需要本地网络权限。

上述规则的例外情况:

  • 如果设备的 DNS 服务器位于本地网络中,则向其发送或从其接收的流量(在端口 53 上)不需要本地网络访问权限。
  • 使用输出切换器作为应用内选择器的应用无需本地网络权限(更多指南将于 2025 年第 4 季度发布)。

开发者指南(用户选择启用)

如需选择启用本地网络限制,请执行以下操作:

  1. 将设备刷写为搭载 25Q2 Beta 版 3 或更高版本的 build。
  2. 安装要测试的应用。
  3. 在 adb 中切换 Appcompat 标志:

    adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>
    
  4. 重启设备

现在,您的应用对本地网络的访问权限受到限制,任何尝试访问本地网络的操作都会导致套接字错误。如果您使用的 API 在应用进程之外执行本地网络操作(例如 NsdManager),则在用户选择启用该功能期间,这些 API 不会受到影响。

如需恢复访问权限,您必须向应用授予 NEARBY_WIFI_DEVICES 权限。

  1. 确保应用在其清单中声明了 NEARBY_WIFI_DEVICES 权限。
  2. 依次前往设置 > 应用 > [应用名称] > 权限 > 附近的设备 > 允许

现在,您的应用对本地网络的访问权限应该已恢复,并且所有场景都应像在应用选择启用之前一样正常运行。

本地网络保护功能开始强制执行后,应用网络流量将受到以下影响。

权限 出站 LAN 请求 出站/入站互联网请求 入站 LAN 请求
已授予 Works Works Works
未授予 最差排行榜 Works 最差排行榜

使用以下命令关闭 App-Compat 标志

adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>

错误

每当调用套接字向本地网络地址调用 send 或 send 变体时,系统都会将因这些限制而产生的错误返回给调用套接字。

错误示例:

sendto failed: EPERM (Operation not permitted)

sendto failed: ECONNABORTED (Operation not permitted)

本地网络定义

本项目中的本地网络是指使用支持广播的网络接口(例如 Wi-Fi 或以太网)的 IP 网络,但不包括移动网络 (WWAN) 或 VPN 连接。

以下网络被视为本地网络:

IPv4

  • 169.254.0.0/16 // 链路本地
  • 100.64.0.0/10 // CGNAT
  • 10.0.0.0/8 // RFC1918
  • 172.16.0.0/12 // RFC1918
  • 192.168.0.0/16 // RFC1918

IPv6

  • 链路本地
  • 直接连接的路线
  • Thread 等桩网络
  • 多个子网(待定)

此外,多播地址 (224.0.0.0/4、ff00::/8) 和 IPv4 广播地址 (255.255.255.255) 都被归类为本地网络地址。

Ảnh do ứng dụng sở hữu

When prompted for photo and video permissions by an app targeting SDK 36 or higher on devices running Android 16 or higher, users who choose to limit access to selected media will see any photos owned by the app pre-selected in the photo picker. Users can deselect any of these pre-selected items, which will revoke the app's access to those photos and videos.