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
,以暂时停用此功能。
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.

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:
screenOrientation
resizableActivity
minAspectRatio
maxAspectRatio
setRequestedOrientation()
getRequestedOrientation()
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_SENSORS
或 BODY_SENSORS_BACKGROUND
权限的 API,现在都需要获取相应的 android.permissions.health
权限。这会影响以下数据类型、API 和前台服务类型:
- Wear OS 上的健康服务中的
HEART_RATE_BPM
- Android Sensor Manager 中的
Sensor.TYPE_HEART_RATE
- Wear OS 上
ProtoLayout
中的heartRateAccuracy
和heartRateBpm
FOREGROUND_SERVICE_TYPE_HEALTH
,其中需要使用相应的android.permission.health
权限来替代BODY_SENSORS
如果您的应用使用这些 API,则应请求相应的精细权限:
- 如需在使用期间监测心率、血氧饱和度或体表温度:请在
android.permissions.health
下请求精细权限,例如READ_HEART_RATE
,而不是BODY_SENSORS
。 - 对于后台传感器访问权限:请求
READ_HEALTH_DATA_IN_BACKGROUND
,而不是BODY_SENSORS_BACKGROUND
。
这些权限与用于保护对 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 receivingACTION_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:
Ý đị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 đó.
Ý đị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:"
và "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 季度发布)。
开发者指南(用户选择启用)
如需选择启用本地网络限制,请执行以下操作:
- 将设备刷写为搭载 25Q2 Beta 版 3 或更高版本的 build。
- 安装要测试的应用。
在 adb 中切换 Appcompat 标志:
adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>
重启设备
现在,您的应用对本地网络的访问权限受到限制,任何尝试访问本地网络的操作都会导致套接字错误。如果您使用的 API 在应用进程之外执行本地网络操作(例如 NsdManager),则在用户选择启用该功能期间,这些 API 不会受到影响。
如需恢复访问权限,您必须向应用授予 NEARBY_WIFI_DEVICES
权限。
- 确保应用在其清单中声明了
NEARBY_WIFI_DEVICES
权限。 - 依次前往设置 > 应用 > [应用名称] > 权限 > 附近的设备 > 允许。
现在,您的应用对本地网络的访问权限应该已恢复,并且所有场景都应像在应用选择启用之前一样正常运行。
本地网络保护功能开始强制执行后,应用网络流量将受到以下影响。
权限 | 出站 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.