行為變更:指定 Android 16 以上版本的應用程式

和先前版本一樣,Android 16 也包含可能會影響應用程式的行為變更。以下行為變更僅適用於指定 Android 16 以上版本的應用程式。如果您的應用程式指定 Android 16 以上版本,建議您視情況修改應用程式,以支援這些行為。

此外,無論應用程式的 targetSdkVersion 為何,請務必查看影響所有在 Android 16 上執行的應用程式行為變更清單。

使用者體驗和系統 UI

Android 16 (API 級別 36) 包含下列異動,旨在打造更一致、直觀的使用者體驗。

無邊框螢幕停用選項即將移除

Android 15 對以 Android 15 (API 級別 35) 為目標版本的應用程式強制執行無邊框設計,但您可以將 R.attr#windowOptOutEdgeToEdgeEnforcement 設為 true,選擇不採用這項設計。如果應用程式指定 Android 16 (API 級別 36) 為目標,系統會淘汰並停用 R.attr#windowOptOutEdgeToEdgeEnforcement,且應用程式無法選擇不採用無邊框設計。

  • 如果應用程式指定 Android 16 (API 級別 36) 版本為目標,且在 Android 15 裝置上執行,R.attr#windowOptOutEdgeToEdgeEnforcement 仍可正常運作。
  • 如果應用程式指定 Android 16 (API 級別 36),且在 Android 16 裝置上執行,系統會停用 R.attr#windowOptOutEdgeToEdgeEnforcement

如要在 Android 16 中進行測試,請確保應用程式支援無邊框設計,並移除所有 R.attr#windowOptOutEdgeToEdgeEnforcement 的使用情形,讓應用程式在 Android 15 裝置上也能支援無邊框設計。如要支援無邊框設計,請參閱 ComposeViews 指南。

必須遷移或停用預測返回手勢

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

如果您的应用会拦截返回事件,但您尚未迁移到预测性返回,请更新应用以使用受支持的返回导航 API,或者暂时选择停用,方法是在应用的 AndroidManifest.xml 文件的 <application><activity> 标记中将 android:enableOnBackInvokedCallback 属性设置为 false

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

優雅字型 API 已淘汰並停用

指定 Android 15 (API 級別 35) 的應用程式會預設將 elegantTextHeight TextView 屬性設為 true,以更易於閱讀的字型取代精簡字型。您可以將 elegantTextHeight 屬性設為 false,藉此覆寫這項設定。

Android 16 會淘汰 elegantTextHeight 屬性,應用程式指定 Android 16 後,系統就會忽略該屬性。這些 API 控制的「UI 字型」即將停用,因此請調整所有版面配置,確保阿拉伯文、寮文、緬甸文、泰米爾文、古吉拉特文、卡納達文、馬拉雅拉姆文、奧里亞文、泰盧固文或泰文的文字顯示方式一致,且日後不會出錯。

針對指定 Android 14 (API 級別 34) 以下版本的應用程式,或指定 Android 15 (API 級別 35) 但將 elegantTextHeight 屬性設為 false,藉此覆寫預設行為的應用程式,
elegantTextHeight 行為如下:
如果應用程式指定 Android 16 (API 級別 36),或指定 Android 15 (API 級別 35) 但未將 elegantTextHeight 屬性設為 false 來覆寫預設值,則會採用
elegantTextHeight 行為。

核心功能

Android 16 (API 級別 36) 包含下列變更,可修改或擴充 Android 系統的各種核心功能。

固定費率工作排程最佳化

Prior to targeting Android 16, when scheduleAtFixedRate missed a task execution due to being outside a valid process lifecycle, all missed executions immediately execute when the app returns to a valid lifecycle.

When targeting Android 16, at most one missed execution of scheduleAtFixedRate is immediately executed when the app returns to a valid lifecycle. This behavior change is expected to improve app performance. Test this behavior in your app to check if your app is impacted. You can also test by using the app compatibility framework and enabling the STPE_SKIP_MULTIPLE_MISSED_PERIODIC_TASKS compat flag.

裝置板型規格

在大型螢幕裝置上顯示應用程式時,Android 16 (API 級別 36) 會進行下列變更。

自動調整式版面配置

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>

健康與健身

Android 16 (API 級別 36) 包含下列與健康和健身資料相關的變更。

健康與健身權限

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

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

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

移动应用

迁移到使用 READ_HEART_RATE 和其他精细权限的移动应用还必须声明 activity 以显示应用的隐私权政策。此要求与健康数据共享的要求相同。

連線能力

Android 16 (API 級別 36) 的藍牙堆疊包含下列變更,可提升與周邊裝置的連線能力。

處理債券遺失和加密變更的新意圖

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.

移除藍牙配對的新方式

所有以 Android 16 為目標版本的應用程式,現在都能使用 CompanionDeviceManager 中的公開 API 解除配對藍牙裝置。如果隨附裝置是以 CDM 關聯方式管理,應用程式可以在關聯裝置上使用新的 removeBond(int) API 觸發藍牙連結移除作業。應用程式可以監控連結狀態變更,方法是監聽藍牙裝置廣播事件 ACTION_BOND_STATE_CHANGED

安全性

Android 16 (API 級別 36) 包含下列安全性異動。

MediaStore 版本鎖定

針對指定 Android 16 以上版本的應用程式,MediaStore#getVersion() 現已成為每個應用程式的專屬值。這麼做可移除版本字串中的識別屬性,以免遭到濫用,並防止用於指紋辨識技術。應用程式不應對此版本的格式做出任何假設。應用程式在使用此 API 時應已處理版本變更,且在大多數情況下,不必變更目前的行為,除非開發人員嘗試推斷超出此 API 預期範圍的其他資訊。

更安全的意圖

「更安全的意圖」功能是一項多階段安全措施,旨在提升 Android 意圖解析機制的安全性。目標是在意圖處理期間新增檢查,並篩除不符合特定條件的意圖,藉此保護應用程式免於惡意行為。

Android 15 中,這項功能著重於傳送應用程式,現在 Android 16 則將控制權轉移至接收應用程式,讓開發人員使用應用程式資訊清單選擇加入嚴格的 Intent 解析。

我們將實施兩項重大變更:

  1. 明確意圖必須與目標元件的意圖篩選器相符:如果意圖明確指定元件,就應與該元件的意圖篩選器相符。

  2. 沒有動作的意圖無法與任何意圖篩選器相符:如果意圖未指定動作,就不應解析至任何意圖篩選器。

這些變更只會在涉及多個應用程式時生效,不會影響單一應用程式內的意圖處理程序。

影響

由於這項功能採選擇啟用制,開發人員必須在應用程式資訊清單中明確啟用,才會生效。因此,這項功能只會影響開發人員符合下列條件的應用程式:

  • 瞭解 Safer Intents 功能及其優點。
  • 主動選擇在應用程式中採用更嚴格的意圖處理做法。

這種選擇加入的做法可將風險降到最低,避免現有應用程式因依賴目前安全性較低的意圖解析行為而無法運作。

雖然 Safer Intents 計畫在 Android 16 的初期影響可能有限,但這項計畫的發展藍圖涵蓋更廣泛的影響,未來將在 Android 版本中發揮作用。我們最終會將嚴格意圖解析設為預設行為。

Safer Intents 功能可讓惡意應用程式更難以利用 Intent 解析機制中的漏洞,因此有助於大幅提升 Android 生態系統的安全性。

不過,為解決現有應用程式的潛在相容性問題,我們必須謹慎管理選擇停用和強制執行的過渡期。

實作

開發人員必須在應用程式資訊清單中使用 intentMatchingFlags 屬性,明確啟用更嚴格的意圖比對。以下範例說明如何為整個應用程式啟用這項功能,但針對接收器停用/停用這項功能:

<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 對傳入的意圖強制執行更嚴格的比對作業
none 停用所有傳入意圖的特殊比對規則。指定多個旗標時,系統會優先採用「none」旗標,解決值衝突的問題
allowNullAction 放寬比對規則,允許比對沒有動作的意圖。這個旗標應與「enforceIntentFilter」搭配使用,以達成特定行為

測試與偵錯

強制執行功能啟用後,如果意圖呼叫端已正確填入意圖,應用程式應可正常運作。不過,遭封鎖的 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:")

隱私權

Android 16 (API 級別 36) 包含下列隱私權異動。

區域網路權限

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

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

发布计划

此变更将部署在两个版本(即 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 最差排行榜

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

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) 也被归类为本地网络地址。

應用程式擁有的相片

當指定 SDK 36 以上版本的應用程式在搭載 Android 16 以上版本的裝置上執行時,如果系統提示使用者授予相片和影片權限,選擇限制所選媒體存取權的使用者會在相片挑選器中看到應用程式預先選取的所有相片。使用者可以取消選取任何預先選取的項目,這樣一來,應用程式就無法存取這些相片和影片。