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ỉ tác động đến ứng dụng hướng đến Android 16 trở lên. Nếu ứng dụng của bạn hướng đế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 cho phù hợp (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 (cấp độ API 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.

Không còn lựa chọn không sử dụng tính năng tràn viền

Android 15 thực thi chế độ hiển thị tràn viền cho các ứng dụng nhắm đến Android 15 (API cấp 35), nhưng ứng dụng của bạn có thể chọn không sử dụng bằng cách đặt R.attr#windowOptOutEdgeToEdgeEnforcement thành true. Đối với các ứng dụng nhắm đến Android 16 (cấp độ API 36), R.attr#windowOptOutEdgeToEdgeEnforcement sẽ không được dùng nữa và bị vô hiệu hoá, đồng thời ứng dụng của bạn không thể chọn không hiển thị tràn viền.

  • Nếu ứng dụng của bạn nhắm đến Android 16 (API cấp 36) và đang chạy trên một thiết bị Android 15, thì R.attr#windowOptOutEdgeToEdgeEnforcement vẫn hoạt động.
  • Nếu ứng dụng của bạn nhắm đến Android 16 (cấp độ API 36) và đang chạy trên một thiết bị Android 16, thì R.attr#windowOptOutEdgeToEdgeEnforcement sẽ bị tắt.

Để kiểm thử trong Android 16, hãy đảm bảo ứng dụng của bạn hỗ trợ chế độ hiển thị tràn viền và xoá mọi cách sử dụng R.attr#windowOptOutEdgeToEdgeEnforcement để ứng dụng của bạn cũng hỗ trợ chế độ hiển thị tràn viền trên thiết bị Android 15. Để hỗ trợ chế độ hiển thị tràn viền, hãy xem hướng dẫn về ComposeKhung hiển thị.

Bắt buộc 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 动画。
预测性跨任务动画。

API phông chữ trang nhã không được dùng nữa và bị tắt

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ữ nhỏ gọn bằng một phông chữ dễ đọc hơn nhiều. Bạn có thể ghi đè điều 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à không bị ảnh hưởng trong tương lai bằng tiếng Ả Rập, tiếng Lào, tiếng Miến Điện, 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 đối với các ứng dụng nhắm đến Android 14 (API cấp 34) trở xuống hoặc đối với các ứng dụng nhắm đến Android 15 (API cấp 35) đã ghi đè giá trị mặc định bằng cách đặt thuộc tính elegantTextHeight thành false.
Hành vi
elegantTextHeight đối với các ứng dụng nhắm đến Android 16 (API cấp 36) hoặc đối với các ứng dụng nhắm đến Android 15 (API cấp 35) không ghi đè giá trị 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 (cấp độ API 36) có các thay đổi sau đây nhằm sửa đổi hoặc mở rộng nhiều khả 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 (cấp độ API 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)

Giờ đây, các ứng dụng Android chạy trên nhiều thiết bị (chẳng hạn như điện thoại, máy tính bảng, thiết bị có thể gập lại, máy tính, ô tô và TV) và các chế độ tạo cửa sổ trên màn hình lớn (chẳng hạn như chế độ chia đôi màn hình và chế độ cửa sổ kiểu máy tính), nhà phát triển nên tạo các ứng dụng Android thích ứng với mọi kích thước màn hình và cửa sổ, bất kể hướng thiết bị. Các mô hình như hạn chế hướng và khả năng đổi kích thước quá hạn chế trong thế giới đa thiết bị ngày nay.

Bỏ qua các quy định hạn chế về hướng, khả năng đổi kích thước và tỷ lệ khung hình

Đối với các ứng dụng nhắm đến Android 16 (cấp độ API 36), các quy tắc hạn chế về hướng, khả năng đổi kích thước và tỷ lệ khung hình sẽ không còn áp dụng trên những màn hình có chiều rộng nhỏ nhất >= 600 dp. Ứng dụng lấp đầy toàn bộ cửa sổ hiển thị, bất kể tỷ lệ khung hình hoặc hướng mà người dùng muốn và không sử dụng hiệu ứng hòm thư dọc.

Thay đổi này giới thiệu một hành vi tiêu chuẩn mới của nền tảng. Android đang hướng đến một mô hình mà các ứng dụng dự kiến sẽ thích ứng với nhiều hướng, kích thước màn hình và tỷ lệ khung hình. Các quy tắc hạn chế như hướng cố định hoặc khả năng đổi kích thước hạn chế sẽ cản trở khả năng thích ứng của ứng dụng. Điều chỉnh ứng dụng để mang đến trải nghiệm tốt nhất có thể cho người dùng.

Bạn cũng có thể kiểm thử hành vi này 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 UNIVERSAL_RESIZABLE_BY_DEFAULT.

Các thay đổi có thể gây lỗi thường gặp

Việc bỏ qua các hạn chế về hướng, khả năng thay đổi kích thước và tỷ lệ khung hình có thể ảnh hưởng đến giao diện người dùng của ứng dụng trên một số thiết bị, đặc biệt là những phần tử được thiết kế cho bố cục nhỏ ở chế độ dọc: ví dụ: các vấn đề như bố cục bị kéo giãn và các thành phần cũng như ảnh động ngoài màn hình. Mọi giả định về tỷ lệ khung hình hoặc hướng đều có thể gây ra vấn đề về hình ảnh cho ứng dụng của bạn. Tìm hiểu thêm về cách tránh những vấn đề này và cải thiện hành vi thích ứng của ứng dụng.

Việc cho phép xoay thiết bị sẽ dẫn đến việc tạo lại nhiều hoạt động hơn, điều này có thể dẫn đến mất trạng thái người dùng nếu không được duy trì đúng cách. Tìm hiểu cách lưu trạng thái giao diện người dùng một cách chính xác trong bài viết Lưu trạng thái giao diện người dùng.

Thông tin chi tiết về việc triển khai

Các thuộc tính tệp kê khai và API thời gian chạy sau đây sẽ bị bỏ qua trên các thiết bị màn hình lớn ở chế độ toàn màn hình và chế độ nhiều cửa sổ:

Các giá trị sau đây cho screenOrientation, setRequestedOrientation()getRequestedOrientation() sẽ bị bỏ qua:

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

Về khả năng thay đổi kích thước màn hình, android:resizeableActivity="false", android:minAspectRatioandroid:maxAspectRatio không có tác dụng.

Đối với các ứng dụng nhắm đến Android 16 (cấp độ API 36), theo mặc định, các quy tắc hạn chế về hướng, khả năng đổi kích thước và tỷ lệ khung hình của ứng dụng sẽ bị bỏ qua trên màn hình lớn, nhưng mọi ứng dụng chưa hoàn toàn sẵn sàng đều có thể tạm thời ghi đè hành vi này bằng cách chọn không sử dụng (dẫn đến hành vi trước đó là được đặt ở chế độ tương thích).

Ngoại lệ

Các hạn chế về hướng, khả năng đổi kích thước và tỷ lệ khung hình của Android 16 không áp dụng trong những trường hợp sau:

  • Trò chơi (dựa trên cờ android:appCategory)
  • Người dùng chọn sử dụng rõ ràng hành vi mặc định của ứng dụng trong phần cài đặt tỷ lệ khung hình của thiết bị
  • Màn hình có kích thước nhỏ hơn sw600dp

Tạm thời không nhận

Để chọn không tham gia một hoạt động cụ thể, hãy khai báo thuộc tính tệp kê khai PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY:

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

Nếu có quá nhiều phần trong ứng dụng của bạn chưa sẵn sàng cho Android 16, bạn có thể chọn không tham gia hoàn toàn bằng cách áp dụng cùng một thuộc tính ở cấp ứng dụng:

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

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

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

Quyền của ứng dụng sức khoẻ và thể chất

Đối với các ứng dụng nhắm đến Android 16 (API cấp 36) trở lên, BODY_SENSORS quyền sử dụng các quyền chi tiết hơn trong android.permissions.health. Health Connect cũng sử dụng các quyền này. Kể từ Android 16, mọi API trước đây yêu cầu quyền BODY_SENSORS hoặc BODY_SENSORS_BACKGROUND đều yêu cầu quyền tương ứng android.permissions.health. Điều này ảnh hưởng đến các loại dữ liệu, API và loại dịch vụ trên nền trước sau đây:

Nếu sử dụng các API này, ứng dụng của bạn nên yêu cầu các quyền chi tiết tương ứng:

Các quyền này giống như những quyền bảo vệ quyền truy cập để đọc dữ liệu từ Health Connect, kho lưu trữ dữ liệu Android cho dữ liệu về sức khoẻ, thể dục và thể chất.

Ứng dụng trên điện thoại di động

Các ứng dụng trên điện thoại di động di chuyển để sử dụng READ_HEART_RATE và các quyền chi tiết khác cũng phải khai báo một hoạt động để hiển thị chính sách quyền riêng tư của ứng dụng. Đây là yêu cầu giống như Health Connect.

Khả năng kết nối

Android 16 (cấp độ API 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 thiết bị ngoại vi.

Ý định mới để xử lý tình trạng mất liên kết và thay đổi mã hoá

Trong phần Cải thiện khả năng xử lý việc mất liên kết, Android 16 cũng giới thiệu 2 ý định mới để giúp ứng dụng nhận biết rõ hơn về việc mất liên kết và các thay đổi về mã hoá.

Ứng dụng nhắm đến Android 16 hiện có thể:

  • Nhận ý định ACTION_KEY_MISSING khi phát hiện mất liên kết từ xa, cho phép họ cung cấp ý kiến phản hồi chi tiết hơn cho người dùng và thực hiện các hành động thích hợp.
  • Nhận ý định ACTION_ENCRYPTION_CHANGE bất cứ khi nào trạng thái mã hoá của đường liên kết thay đổi. Điều này bao gồm thay đổi trạng thái mã hoá, thay đổi thuật toán mã hoá và thay đổi kích thước khoá mã hoá. Các ứng dụng phải xem xét việc khôi phục liên kết nếu đường liên kết được mã hoá thành công sau khi nhận được ý định ACTION_ENCRYPTION_CHANGE.

Điều chỉnh cho phù hợp với nhiều cách triển khai của nhà sản xuất thiết bị gốc (OEM)

Mặc dù Android 16 giới thiệu các ý định mới này, nhưng cách triển khai và truyền tin của các ý định này có thể khác nhau tuỳ theo nhà sản xuất thiết bị gốc (OEM). Để đảm bảo ứng dụng của bạn mang lại trải nghiệm nhất quán và đáng tin cậy trên tất cả thiết bị, nhà phát triển nên thiết kế cách xử lý việc mất liên kết để thích ứng linh hoạt với những biến thể tiềm ẩn này.

Bạn nên áp dụng các hành vi sau đây cho ứng dụng:

  • Nếu ý định ACTION_KEY_MISSING được truyền tin:

    Hệ thống sẽ ngắt kết nối liên kết ACL (Không có kết nối không đồng bộ), nhưng thông tin liên kết cho thiết bị sẽ được giữ lại (như mô tả tại đây).

    Ứng dụng của bạn nên sử dụng ý định này làm tín hiệu chính để phát hiện mất liên kết và hướng dẫn người dùng xác nhận thiết bị từ xa nằm trong phạm vi trước khi bắt đầu quên thiết bị hoặc ghép nối lại.

    Nếu một thiết bị ngắt kết nối sau khi nhận được ACTION_KEY_MISSING, thì ứng dụng của bạn nên thận trọng khi kết nối lại, vì thiết bị có thể không còn liên kết với hệ thống nữa.

  • Nếu ý định ACTION_KEY_MISSING KHÔNG được truyền tin:

    Đường liên kết ACL sẽ vẫn được kết nối và hệ thống sẽ xoá thông tin liên kết cho thiết bị, tương tự như hành vi trong Android 15.

    Trong trường hợp này, ứng dụng của bạn sẽ tiếp tục các cơ chế xử lý mất liên kết hiện có như trong các bản phát hành Android trước, để phát hiện và quản lý các sự kiện mất liên kết.

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 (cấp độ API 36) có các thay đổi sau đây về bảo mật.

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

“更安全的 intent”功能是一项多阶段安全计划,旨在提高 Android 的 intent 解析机制的安全性。其目标是在 intent 处理期间添加检查,并过滤不符合特定条件的 intent,从而保护应用免受恶意操作的影响。

Android 15 中,此功能侧重于发送应用,而现在在 Android 16 中,控制权转移到了接收应用,开发者可以使用应用清单选择启用严格的 intent 解析。

我们正在实施两项关键变更:

  1. 显式 intent 必须与目标组件的 intent 过滤器匹配:如果 intent 显式以某个组件为目标,则应与该组件的 intent 过滤器匹配。

  2. 没有操作的 intent 无法与任何 intent 过滤器匹配:未指定操作的 intent 不应解析为任何 intent 过滤器。

这些变更仅在涉及多个应用时适用,不会影响单个应用内的 intent 处理。

影响

由于此功能是选择启用,因此开发者必须在应用清单中明确启用此功能,才能使其生效。因此,此功能的影响将仅限于以下应用:

  • 了解“更安全的 intent”功能及其优势。
  • 主动选择将更严格的 intent 处理实践融入到其应用中。

这种选择启用方法可最大限度地降低破坏可能依赖于当前安全性较低的 intent 解析行为的现有应用的风险。

虽然在 Android 16 中的初始影响可能有限,但“更安全的 intent”计划制定了在未来的 Android 版本中扩大影响的路线图。 该计划最终将使严格的 intent 解析成为默认行为。

“更安全的 intent”功能通过使恶意应用更难利用 intent 解析机制中的漏洞,有可能显著增强 Android 生态系统的安全性。

不过,向选择退出和强制执行的过渡必须经过仔细管理,以解决与现有应用潜在的兼容性问题。

实现

开发者需要在应用清单中使用 intentMatchingFlags 属性明确启用更严格的 intent 匹配。 以下示例展示了如何为整个应用选择启用此功能,但在接收器上停用/选择停用此功能:

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

详细了解支持的标志:

标志名称 说明
enforceIntentFilter 对传入 intent 强制执行更严格的匹配
none 停用传入 intent 的所有特殊匹配规则。指定多个标志时,系统会优先使用“none”标志来解决冲突值
allowNullAction 放宽匹配规则,允许没有操作的 intent 进行匹配。此标志应与“enforceIntentFilter”结合使用,以实现特定行为

测试和调试

启用强制执行后,如果 intent 调用方已正确填充 intent,应用应能正常运行。 不过,被屏蔽的 intent 会触发警告日志消息,例如 "Intent does not match component's intent filter:""Access blocked:" ,并带有标记 "PackageManager." 。这表示可能存在影响应用的问题,需要引起 注意。

Logcat 过滤器:

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

Lọc lệnh gọi hệ thống GPU

为了加固 Mali GPU Surface,我们已在生产版本中屏蔽了已废弃或仅用于 GPU 开发的 Mali GPU IOCTL。 此外,用于 GPU 性能剖析的 IOCTL 已限制为 shell 进程或可调试的应用。如需详细了解平台级政策,请参阅 SAC 更新。

此项变更适用于使用 Mali GPU 的 Pixel 设备(Pixel 6-9)。Arm 已在其 r54p2 release 版本的 Documentation/ioctl-categories.rst 中提供了 IOCTL 的官方分类。此列表将在未来的驱动程序版本中继续维护。

此项变更不会影响受支持的图形 API(包括 Vulkan 和 OpenGL),预计也不会影响开发者或现有应用。 Streamline Performance Analyzer 和 Android GPU 检查器等 GPU 性能剖析工具不会受到影响。

测试

如果您看到类似以下内容的 SELinux 拒绝,则您的应用很可能受到了此项变更的影响:

06-30 10:47:18.617 20360 20360 W roidJUnitRunner: type=1400 audit(0.0:85): avc:  denied  { ioctl }
for  path="/dev/mali0" dev="tmpfs" ino=1188 ioctlcmd=0x8023
scontext=u:r:untrusted_app_25:s0:c512,c768 tcontext=u:object_r:gpu_device:s0 tclass=chr_file
permissive=0 app=com.google.android.selinux.pts

如果您的应用需要使用被屏蔽的 IOCTL,请提交 bug 并将其分配给 android-partner-security@google.com。

常见问题解答

  1. 此项政策变更是否适用于所有 OEM? 此项变更将采用选择启用模式,但任何想要使用此加固方法的原始设备制造商(OEM)都可以使用。如需了解如何实现此项变更,请参阅实现文档。

  2. 是否必须在 OEM 代码库中进行更改才能实现此项变更,还是默认随新的 AOSP 版本提供? 平台级变更将默认随新的 AOSP 版本提供。供应商可以选择在其代码库中启用此项变更,以便应用此项变更。

  3. SoC 是否负责让 IOCTL 列表保持最新状态?例如,如果我的设备使用 ARM Mali GPU,我是否需要就任何变更与 ARM 联系? 各个 SoC 必须在驱动程序发布后根据设备更新其 IOCTL 列表。 例如,ARM 会在驱动程序更新后更新其发布的 IOCTL 列表。 不过,OEM 应确保将更新纳入其 SEPolicy,并根据需要将任何选定的自定义 IOCTL 添加到列表中。

  4. 此项变更是否会自动应用于所有在售 Pixel 设备,还是需要用户执行操作来切换某些内容以应用此项变更? 此项变更适用于所有使用 Mali GPU 的在售 Pixel 设备(Pixel 6-9)。无需用户执行任何操作即可应用此项变更。

  5. 使用此政策是否会影响内核驱动程序的性能? 我们已使用 GFXBench 在 Mali GPU 上对此政策进行了测试,未观察到 GPU 性能发生任何可衡量的变化。

  6. IOCTL 列表是否需要与当前的用户空间和内核驱动程序版本保持一致?是,允许的 IOCTL 列表必须与用户空间和内核驱动程序支持的 IOCTL 同步。如果用户空间或内核驱动程序中的 IOCTL 发生更新,则必须更新 SEPolicy IOCTL 列表以进行匹配。

  7. ARM 已将 IOCTL 分类为“受限”/“检测”,但我们希望在生产用例中使用其中的一些 IOCTL,并/或拒绝其他 IOCTL。 各个 OEM/SoC 负责根据其用户空间 Mali 库的配置,决定如何对其使用的 IOCTL 进行分类。 ARM 的列表可用于帮助决定这些内容,但每个 OEM/SoC 的用例可能有所不同。

Quyền riêng tư

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

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

具有 INTERNET 权限的任何应用都可以访问局域网中的设备。 这使得应用可以轻松连接到本地设备,但也存在隐私方面的影响,例如形成用户指纹,以及成为位置信息的代理。

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

发布计划

这项变更将分别在 25Q2 和 26Q2 这两个版本之间部署。 开发者必须遵循 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 最差排行榜

使用以下命令关闭应用兼容性标志

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 thuộc sở hữu của ứng dụng

当面向 SDK 36 或更高版本的应用在搭载 Android 16 或更高版本的设备上提示用户授予照片和视频权限时,如果用户选择限制对所选媒体的访问权限,则会在照片选择器中看到该应用拥有的所有照片。用户可以取消选择任何这些预选项,这会撤消该应用对这些照片和视频的访问权限。