Android 14 平台包含可能對應用程式造成影響的行為變更。無論 targetSdkVersion
為何,當應用程式在 Android 14 上執行時,下列行為變更將會套用至所有應用程式。您應測試應用程式,並視需要修改,以便在適當情況下支援新版本功能。
另請務必查看僅對指定 Android 14 為目標版本的應用程式造成影響的行為變更。
核心功能
根據預設,系統會拒絕排定精確鬧鐘
Exact alarms are meant for user-intentioned notifications, or for actions that
need to happen at a precise time. Starting in Android 14, the
SCHEDULE_EXACT_ALARM
permission is no longer being pre-granted to most newly installed apps
targeting Android 13 and higher—the permission is denied by default.
Learn more about the changes to the permission for scheduling exact alarms.
在應用程式快取期間,註冊使用情境的廣播訊息會排入佇列
在 Android 14 中,當應用程式處於快取狀態時,系統可以將已註冊使用情境的廣播訊息排入佇列。這類似於佇列 Android 12 (API 級別 31) 為非同步繫結器引入的行為 交易系統不會將宣告資訊清單的廣播訊息排入佇列,而且應用程式會遭到移除 以便進行廣播傳遞
當應用程式結束快取狀態 (例如返回前景時), 系統會傳送所有排入佇列的廣播訊息某些廣播訊息的多個執行個體可以合併為單一廣播訊息。根據其他因素,例如系統 健康狀態、應用程式可能會從快取狀態中移除, 廣播訊息
應用程式只能終止自己的背景處理程序
自 Android 14 起,當應用程式呼叫 killBackgroundProcesses()
時,
API 只能終止您自有應用程式的背景處理程序。
如果傳入其他應用程式的套件名稱,此方法不會 ,而 Logcat 中會顯示以下訊息:
Invalid packageName: com.example.anotherapp
您的應用程式不應使用 killBackgroundProcesses()
API,或嘗試影響其他應用程式的處理程序生命週期,即使是在舊版 OS 上也是如此。Android 的設計是為了在背景作業中保留快取的應用程式,並且能夠在系統需要記憶體時自動終止這些應用程式。如果您的應用程式不小心關閉其他應用程式,可能會因為需要在稍後重新啟動這些應用程式 (比起恢復現有已快取的應用程式會耗用更多的資源),進而降低系統效能並增加電池用量。
針對要求 MTU 的第一個 GATT 用戶端,將 MTU 設為 517
从 Android 14 开始,Android 蓝牙堆栈会更严格地遵循 蓝牙核心规范 5.2 版,并在第一个 GATT 客户端使用 BluetoothGatt#requestMtu(int)
API 请求 MTU 时将 BLE ATT MTU 请求设为 517 字节,并忽略该 ACL 连接上的所有后续 MTU 请求。
如需解决此更改并使您的应用更为稳健,请考虑以下选项:
- 您的外围设备应使用外围设备可以容纳的合理值来响应 Android 设备的 MTU 请求。最终协商的值将是 Android 请求的值和远程提供的值(例如
min(517, remoteMtu)
)的较小值- 实现此修复程序可能需要更新外围设备的固件
- 或者,您也可以根据外围设备的已知支持值与收到的 MTU 更改值之间的最小值来限制 GATT 特征写入
- 提醒您,应将标头的支持大小减小 5 个字节
- 例如:
arrayMaxLength = min(SUPPORTED_MTU, GATT_MAX_ATTR_LEN(517)) - 5
應用程式可被置入受限制待命值區的新原因
Android 14 推出了應用程式可放入受限制待命值區的新原因。應用程式的工作因 onStartJob
、onStopJob
或 onBind
方法逾時而多次觸發 ANR 錯誤。(如要瞭解 onStartJob
和 onStopJob
的變更,請參閱「JobScheduler 強化回呼和網路行為」)。
如要追蹤應用程式是否已進入受限制的待機區塊,建議您在工作執行時使用 API UsageStatsManager.getAppStandbyBucket()
進行記錄,或在應用程式啟動時使用 UsageStatsManager.queryEventsForSelf()
。
mlock 限制為 64 KB
在 Android 14 (API 級別 34) 以上版本中,平台會將可使用 mlock()
鎖定的最大記憶體量,從每個程序 64 KB 降至 64 KB。在先前版本中,每個程序的限制為 64 MB。這項限制可促進應用程式和系統的記憶體管理。為在各裝置上提供更一致的體驗,Android 14 新增了新的 CTS 測試,針對相容裝置的新 mlock()
限制進行測試。
系統會強制執行快取應用程式的資源使用情形
从设计上讲,当应用的进程移至后台且没有任何其他应用进程组件在运行时,应用进程将处于缓存状态。此类应用进程可能会因系统内存压力而终止。在此状态下,Activity
实例在调用并返回 onStop()
方法后执行的任何工作均不可靠,强烈建议不要这样做。
Android 14 对此设计引入了一致性和强制执行要求。在应用进程进入缓存状态后不久,系统会禁止后台工作,直到进程组件重新进入生命周期的活跃状态。
使用框架支持的典型生命周期 API(例如服务、JobScheduler
和 Jetpack WorkManager)的应用应该不受这些变化的影响。
使用者體驗
關於使用者無法關閉通知的變更
如果您的应用向用户显示不可关闭的前台通知,请注意:Android 14 已更改此行为,允许用户关闭此类通知。
这项变更适用于阻止用户关闭前台的应用
将 Notification.FLAG_ONGOING_EVENT
设置为
Notification.Builder#setOngoing(true)
或
NotificationCompat.Builder#setOngoing(true)
。FLAG_ONGOING_EVENT
的行为已发生变化,使用户实际上能够关闭此类通知。
在以下情况下,此类通知仍不可关闭:
- 当手机处于锁定状态时
- 如果用户选择全部清除通知操作(有助于防止意外关闭)
此外,这一新行为不适用于以下用例中的通知:
CallStyle
条通知- 企业设备政策控制器 (DPC) 和支持软件包
- 媒体通知
- 默认的搜索选择器软件包
以更清楚的方式顯示資料安全性資訊
為了加強使用者隱私,Android 14 會增加系統顯示您在 Play 管理中心表單中宣告的資訊地點數量。目前,使用者可以在 Google Play 應用程式商店資訊的「資料安全性」專區中查看這項資訊。
建議您查看應用程式的位置資料分享政策,並撥冗為應用程式的 Google Play 資料安全性專區進行適用的更新。
詳情請參閱這份指南,瞭解 Android 14 如何以更清楚的方式顯示資料安全性資訊。
無障礙設定
非線性字型縮放至 200%
从 Android 14 开始,系统支持字体放大高达 200%,为弱视用户提供了符合网络内容无障碍指南 (WCAG) 的其他无障碍功能选项。
如果您已使用放大像素 (sp) 单位来定义文本大小,这项更改可能不会对您的应用产生太大影响。不过,您应在启用最大字号 (200%) 的情况下执行界面测试,确保应用能够在不影响易用性的情况下适应较大的字号。
安全性
可安裝的目標 API 級別下限
自 Android 14 起,搭載
比 23 低 targetSdkVersion
。要求應用程式符合這些最低目標 API 級別
這些需求能進一步保障使用者的安全和隱私權。
為了規避 Android 較新版本的安全性和隱私權保護措施,惡意軟體通常會鎖定舊版 API 級別。舉例來說,某些惡意軟體應用程式會使用 22 的 targetSdkVersion
,以避免受到 Android 6.0 Marshmallow (API 級別 23) 在 2015 年推出的執行階段權限模型。這項 Android 14 變更讓惡意軟體更難躲過安全防護
並改善隱私權
如果要安裝以較低 API 級別為目標的應用程式,
安裝失敗,Logcat 也會顯示以下訊息:
INSTALL_FAILED_DEPRECATED_SDK_VERSION: App package must target at least SDK version 23, but found 7
在升級至 Android 14 的裝置上,targetSdkVersion
較低的所有應用程式
仍會保留安裝版本。
如要測試以舊版 API 級別為目標的應用程式,請使用下列 ADB 指令:
adb install --bypass-low-target-sdk-block FILENAME.apk
媒體擁有者的套件名稱可能會被遮蓋
您可以使用媒體儲存區查詢列有儲存特定媒體檔案應用程式的 OWNER_PACKAGE_NAME
資料欄。自 Android 14 版本起,除非符合下列至少一項條件,否則系統將遮蓋此值:
- 儲存媒體檔案的應用程式會具備一律可由其他應用程式瀏覽的套件名稱。
查詢媒體儲存區的應用程式會要求
QUERY_ALL_PACKAGES
權限。
進一步瞭解 Android 如何篩選套件的瀏覽權限,以保護隱私權。