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.
在應用程式快取期間,註冊使用情境的廣播訊息會排入佇列
On Android 14, the system can place context-registered broadcasts in a queue while the app is in the cached state. This is similar to the queuing behavior that Android 12 (API level 31) introduced for async binder transactions. Manifest-declared broadcasts aren't queued, and apps are removed from the cached state for broadcast delivery.
When the app leaves the cached state, such as returning to the foreground, the system delivers any queued broadcasts. Multiple instances of certain broadcasts might be merged into one broadcast. Depending on other factors, such as system health, apps might be removed from the cached state, and any previously queued broadcasts are delivered.
應用程式只能終止自己的背景處理程序
自 Android 14 起,當應用程式呼叫 killBackgroundProcesses()
時,
API 只能終止您自有應用程式的背景處理程序。
如果傳入其他應用程式的套件名稱,此方法不會 ,而 Logcat 中會顯示以下訊息:
Invalid packageName: com.example.anotherapp
您的應用程式不應使用 killBackgroundProcesses()
API,或嘗試影響其他應用程式的處理程序生命週期,即使是在舊版 OS 上也是如此。Android 的設計是為了在背景作業中保留快取的應用程式,並且能夠在系統需要記憶體時自動終止這些應用程式。如果您的應用程式不小心關閉其他應用程式,可能會因為需要在稍後重新啟動這些應用程式 (比起恢復現有已快取的應用程式會耗用更多的資源),進而降低系統效能並增加電池用量。
針對要求 MTU 的第一個 GATT 用戶端,將 MTU 設為 517
Starting from Android 14, the Android Bluetooth stack more strictly adheres to
Version 5.2 of the Bluetooth Core Specification and requests
the BLE ATT MTU to 517 bytes when the first GATT client requests an MTU using
the BluetoothGatt#requestMtu(int)
API, and disregards all subsequent MTU
requests on that ACL connection.
To address this change and make your app more robust, consider the following options:
- Your peripheral device should respond to the Android device's MTU request
with a reasonable value that can be accommodated by the peripheral. The
final negotiated value will be a minimum of the Android requested value and
the remote provided value (for example,
min(517, remoteMtu)
)- Implementing this fix could require a firmware update for peripheral
- Alternatively, limit your GATT characteristic writes based on the minimum
between the known supported value of your peripheral and the received MTU
change
- A reminder that you should reduce 5 bytes from the supported size for the headers
- For example:
arrayMaxLength = min(SUPPORTED_MTU, GATT_MAX_ATTR_LEN(517)) - 5
應用程式可被置入受限制待命值區的新原因
Android 14 introduces a new reason an app can be placed into the restricted standby bucket.
The app's jobs trigger ANR errors multiple times due to onStartJob
,
onStopJob
, or onBind
method timeouts.
(See JobScheduler reinforces callback and network behavior for changes
to onStartJob
and onStopJob
.)
To track whether or not the app has entered the restricted standby bucket,
we recommend logging with the API UsageStatsManager.getAppStandbyBucket()
on job execution or UsageStatsManager.queryEventsForSelf()
on app startup.
mlock 限制為 64 KB
In Android 14 (API level 34) and higher, the platform reduces the maximum memory
that can be locked using mlock()
to 64 KB per process. In
previous versions, the limit was 64 MB per process. This restriction
promotes better memory management across apps and the system. To provide more
consistency across devices, Android 14 adds a new CTS test for the
new mlock()
limit on compatible devices.
系統會強制執行快取應用程式的資源使用情形
By design, an app's process is in a cached state when it's moved to the
background and no other app process components are running. Such an app process
is subject to being killed due to system memory pressure. Any work that
Activity
instances perform after the onStop()
method has been called and
returned, while in this state, is unreliable and strongly discouraged.
Android 14 introduces consistency and enforcement to this design. Shortly after an app process enters a cached state, background work is disallowed, until a process component re-enters an active state of the lifecycle.
Apps that use typical framework-supported lifecycle APIs – such as
services, JobScheduler
, and Jetpack WorkManager – shouldn't be
impacted by these changes.
使用者體驗
關於使用者無法關閉通知的變更
如果您的應用程式會向使用者顯示無法關閉的前景通知,則 Android 14 已變更允許使用者關閉此類通知的行為。
這項異動適用於防止使用者關閉前景的應用程式
將 Notification.FLAG_ONGOING_EVENT
設為
Notification.Builder#setOngoing(true)
或
NotificationCompat.Builder#setOngoing(true)
。當
FLAG_ONGOING_EVENT
已變更,以便讓這類通知確實存在
可由使用者關閉。
使用者無法在以下情況中關閉這些類型的通知 條件:
- 手機鎖定時
- 當使用者選取全部清除通知動作 (有助 意外關閉)
此外,這項新行為也不適用於 以下用途:
CallStyle
通知- 裝置政策控制器 (DPC) 與企業支援套件
- 媒體通知
- 預設搜尋選取器套件
以更清楚的方式顯示資料安全性資訊
To enhance user privacy, Android 14 increases the number of places where the system shows the information you have declared in the Play Console form. Currently, users can view this information in the Data safety section on your app's listing in Google Play.
We encourage you to review your app's location data sharing policies and take a moment to make any applicable updates to your app's Google Play Data safety section.
Learn more in the guide about how data safety information is more visible on Android 14.
無障礙設定
非線性字型縮放至 200%
自 Android 14 起,系統將支援高達 200% 的字型縮放倍數,為低視能使用者提供符合無障礙網頁內容規範 (WCAG)的額外無障礙選項。
如果您已使用經過調整像素 (sp) 的單位定義文字大小,則這項變更對應用程式不會造成太大影響。不過,您應該在啟用最大字型大小 (200%) 的情況下執行 UI 測試,確保應用程式能夠在不影響可用性的情況下,因應更大的字型。
安全性
可安裝的目標 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
媒體擁有者的套件名稱可能會被遮蓋
The media store supports queries for the OWNER_PACKAGE_NAME
column, which
indicates the app that stored a particular media file. Starting in Android
14, this value is redacted unless at least one of the following conditions is
true:
- The app that stored the media file has a package name that is always visible to other apps.
The app that queries the media store requests the
QUERY_ALL_PACKAGES
permission.
Learn more about how Android filters package visibility for privacy purposes.