相容性架構異動 (Android 14)

圖 1. 開發人員選項中的「應用程式相容性變更」畫面會列出可切換的變更。

本頁說明在 Android 14 相容性架構中可切換的變更。當您準備好支援 Android 14 並指定其為目標版本時,請使用此清單搭配開發人員選項和 ADB 指令,為應用程式進行測試與偵錯。

您可以使用相容性架構工具進行下列操作:

  • 在不必實際變更應用程式 targetSdkVersion 的情況下,對鎖定的變更進行測試。您可以使用切換按鈕,強制啟用鎖定的特定行為變更,藉此評估該變更對現有應用程式的影響。
  • 僅對特定變更進行測試。如果在以指定版本為目標的變更中,您只想測試其中某些變更,則可使用切換按鈕停用不想測試的其他變更,不需要一次處理所有變更。
  • 透過 ADB 管理切換按鈕。您可以在自動化測試環境中使用 ADB 指令啟用及停用可切換的變更。
  • 使用標準變更 ID 加快偵錯速度。每個可切換的變更均有專屬的 ID 和名稱,可用於在記錄檔輸出中快速找出錯誤的起因。

如需此類用途的詳細工具使用說明,請參閱相容性架構工具一文。

相容性架構中的行為變更

本節中的清單說明 Android 14 相容性架構中包含的可切換變更。

您可以按預設狀態篩選變更清單。

Android 14 相容性架構中的可切換變更

ACCESS_SHARED_IDENTITY

變更 ID:259743961
預設狀態:已為所有應用程式啟用。

如果應用程式選擇透過 ActivityOptions 執行個體啟動此活動的方式分享 ID (其中 ActivityOptions.setShareIdentityEnabled(boolean) 會以 true 的值叫用),或者已啟動活動的 UID 和啟動中應用程式的識別號碼相同,則系統將授予存取啟動中應用程式 ID 的權限。啟用此變更且符合上述任一條件後,活動便可分別透過 Activity.getLaunchedFromUid()Activity.getLaunchedFromPackage() 存取啟動中應用程式的 UID 和套件名稱。

ALWAYS_SANDBOX_DISPLAY_APIS

變更 ID:185004937
預設狀態:已為所有應用程式停用。

啟用之後,無論視窗模式為何,系統均會將 Display API 沙箱機制套用至套件。Display API 一律會提供應用程式邊界。

如要進一步瞭解這項變更,請參閱 Android 12 行為變更頁面中的已淘汰的顯示方法

ANR_PRE_UDC_APIS_ON_SLOW_RESPONSES

變更 ID:258236856
預設狀態:已針對指定 Android 14 以上版本為目標的應用程式啟用。

啟用之後,當應用程式無法即時回應 Android 13 (API 級別 33) 以下版本的 API 和功能時,系統會觸發「應用程式無回應」(ANR) 訊息。

AUTHORITY_ACCESS_CHECK_CHANGE_ID

變更 ID:207133734
預設狀態:已針對指定 Android 14 以上版本為目標的應用程式啟用。

若為指定 Android 14 以上版本的應用程式,則在所有與同步處理相關的 API 上,啟用檢查呼叫 UID 的機構存取權功能。

CAMERA_MIC_INDICATORS_NOT_PRESENT

變更 ID:162547999
預設狀態:已為所有應用程式停用。

表示此裝置支援攝影機和麥克風指示燈。如果有的話,將會是 false,因為如果沒有變更 ID,CompatChanges#isChangeEnabled 方法會傳回 true

DEFAULT_RESCIND_BAL_FG_PRIVILEGES_BOUND_SERVICE

變更 ID:244637991
預設狀態:已針對指定 Android 14 以上版本為目標的應用程式啟用。

當應用程式使用 PendingIntent#send() 或類似方法傳送 PendingIntent 時,如果應用程式要自行授予背景活動啟動權限,以便啟動待處理意圖,則須在當前階段選擇加入。

如要進一步瞭解這項變更,請前往 Android 14 行為變更頁面參閱「從背景啟動活動的額外限制」一節。

DETACH_THROWS_ISE_ONLY

變更 ID:236825255
預設狀態:已針對指定 Android 14 以上版本為目標的應用程式啟用。

此標記用於限制由 #detachImage 擲回的正確例外狀況。

發生錯誤時,#detachImage 會記錄為擲回 IllegalStateException;如果在卸離 Image 時,途徑遭到棄置,便會為被擲回的 RuntimeException 套用此原生輔助程式方法。

先前未記錄的例外狀況行為會持續至 Android 13 (API 級別 33)。

在 Android 13 (API 級別 33) 之後,原生輔助程式方法只會依照說明文件擲回 IllegalStateExceptions

啟用這項變更之後,#detachImage 只有在卸離映像檔發生錯誤時,才會擲回 IllegalStateException。針對指定 Android 13 (API 級別 33) 以下版本為目標版本的應用程式,行為則維持不變。

DOWNSCALED

變更 ID:168419799
預設狀態:已為所有應用程式停用。

這項變更可為所有依應用程式緩衝區降階的變更把關。停用此變更將導致下列縮放比例係數無法運作:

為應用程式套件啟用這項變更後,應用程式就會強制將大小調整為已啟用的最高比例係數。舉例來說,如果同時啟用 80% 和 70%,系統就會使用 80%。

DOWNSCALE_30

變更 ID:189970040
預設狀態:已為所有應用程式停用。

此時如果也啟用了 DOWNSCALED,則此套件變更會使得應用程式假設當下運行螢幕的垂直和水平解析度為實際螢幕的 30%。

DOWNSCALE_35

變更 ID:189969749
預設狀態:已為所有應用程式停用。

此時如果也啟用了 DOWNSCALED,則此套件變更會使得應用程式假設當下運行螢幕的垂直和水平解析度為實際螢幕的 35%。

DOWNSCALE_40

變更 ID:189970038
預設狀態:已為所有應用程式停用。

此時如果也啟用了 DOWNSCALED,則此套件變更會使得應用程式假設當下運行螢幕的垂直和水平解析度為實際螢幕的 40%。

DOWNSCALE_45

變更 ID:189969782
預設狀態:已為所有應用程式停用。

此時如果也啟用了 DOWNSCALED,則此套件變更會使得應用程式假設當下運行螢幕的垂直和水平解析度為實際螢幕的 45%。

DOWNSCALE_50

變更 ID:176926741
預設狀態:已為所有應用程式停用。

此時如果也啟用了 DOWNSCALED,則此套件變更會使得應用程式假設當下運行螢幕的垂直和水平解析度為實際螢幕的 50%。

DOWNSCALE_55

變更 ID:189970036
預設狀態:已為所有應用程式停用。

此時如果也啟用了 DOWNSCALED,則此套件變更會使得應用程式假設當下運行螢幕的垂直和水平解析度為實際螢幕的 55%。

DOWNSCALE_60

變更 ID:176926771
預設狀態:已為所有應用程式停用。

此時如果也啟用了 DOWNSCALED,則此套件變更會使得應用程式假設當下運行螢幕的垂直和水平解析度為實際螢幕的 60%。

DOWNSCALE_65

變更 ID:189969744
預設狀態:已為所有應用程式停用。

此時如果也啟用了 DOWNSCALED,則此套件變更會使得應用程式假設當下運行螢幕的垂直和水平解析度為實際螢幕的 65%。

DOWNSCALE_70

變更 ID:176926829
預設狀態:已為所有應用程式停用。

此時如果也啟用了 DOWNSCALED,則此套件變更會使得應用程式假設當下運行螢幕的垂直和水平解析度為實際螢幕的 70%。

DOWNSCALE_75

變更 ID:189969779
預設狀態:已為所有應用程式停用。

此時如果也啟用了 DOWNSCALED,則此套件變更會使得應用程式假設當下運行螢幕的垂直和水平解析度為實際螢幕的 75%。

DOWNSCALE_80

變更 ID:176926753
預設狀態:已為所有應用程式停用。

此時如果也啟用了 DOWNSCALED,則此套件變更會使得應用程式假設當下運行螢幕的垂直和水平解析度為實際螢幕的 80%。

DOWNSCALE_85

變更 ID:189969734
預設狀態:已為所有應用程式停用。

此時如果也啟用了 DOWNSCALED,則此套件變更會使得應用程式假設當下運行螢幕的垂直和水平解析度為實際螢幕的 85%。

DOWNSCALE_90

變更 ID:182811243
預設狀態:已為所有應用程式停用。

此時如果也啟用了 DOWNSCALED,則此套件變更會使得應用程式假設當下運行螢幕的垂直和水平解析度為實際螢幕的 90%。

DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED

變更 ID:161145287
預設狀態:已為所有應用程式停用。

啟用之後,當應用程式要為未受保護的廣播訊息註冊接收端時,便必須明確設定 Context.RECEIVER_EXPORTEDContext.RECEIVER_NOT_EXPORTED

詳情請參閱「為已註冊使用情境的接收端提供更安全的匯出服務」一節。

ENABLE_PLATFORM_MDNS_BACKEND

變更 ID:270306772
預設狀態:已針對指定 Android 14 以上版本為目標的應用程式啟用。

指定 Android 14 以上版本為目標的應用程式會採用平台整合的 mDNS 實作做為後端,而指定舊版為目標的應用程式則會繼續使用舊版網路服務探索 (NSD) 後端 (使用舊版原生 Daemon 做為 NsdManager 後端)。

ENABLE_SELF_CERTIFIED_CAPABILITIES_DECLARATION

變更 ID:266524688
預設狀態:已針對指定 Android 14 以上版本為目標的應用程式啟用。

如果是指定 Android 14 以上版本為目標的應用程式,系統會啟用自主認證功能檢查。詳情請參閱 NetworkCapabilities

ENFORCE_PACKAGE_VISIBILITY_FILTERING

變更 ID:154726397
預設狀態:已針對指定 Android 14 以上版本為目標的應用程式啟用。

如為指定 Android 14 以上版本為目標的應用程式,必須在資訊清單中宣告套件瀏覽權限需求,才可存取 AccountManager API。

ENFORCE_READ_ONLY_JAVA_DCL

變更 ID:218865702
預設狀態:已針對指定 Android 14 以上版本為目標的應用程式啟用。

針對指定 Android 14 以上版本為目標版本的應用程式,所有動態載入的檔案都必須標示為唯讀。如此可以防止動態載入的檔案在毫無預警的情況下遭到惡意人士覆寫。

ENFORCE_STRICT_QUERY_BUILDER

變更 ID:143231523
預設狀態:已為所有應用程式停用。

啟用之後,SQLiteQueryBuilder 會針對惡意引數驗證所有 CalendarProvider2 查詢選取項目。

FGS_TYPE_CHECK_FOR_INSTANT_APPS

變更 ID:261055255
預設狀態:已針對指定 Android 14 以上版本為目標的應用程式啟用。

啟用之後,免安裝應用程式必須針對應用程式資訊清單檔案中宣告的所有服務,指定適當的前景服務類型。

如要進一步瞭解這項變更,請參閱這個說明前景服務類型變更的頁面。

FGS_TYPE_NONE_DEPRECATION_CHANGE_ID

變更 ID:255042465
預設狀態:已針對指定 Android 14 以上版本為目標的應用程式啟用。

啟用之後,如果應用程式指定 Android 14 以上版本為目標,且使用已淘汰的 FOREGROUND_SERVICE_TYPE_NONE 類型啟動前景服務,會導致記錄中顯示警告。

如要進一步瞭解這項變更,請參閱這個說明前景服務類型變更的頁面。

FGS_TYPE_NONE_DISABLED_CHANGE_ID

變更 ID:255038118
預設狀態:已針對指定 Android 14 以上版本為目標的應用程式啟用。

啟用之後,如果應用程式指定 Android 14 以上版本為目標,且使用已淘汰的 FOREGROUND_SERVICE_TYPE_NONE 類型啟動前景服務,就會發生例外狀況。

如要進一步瞭解這項變更,請參閱這個說明前景服務類型變更的頁面。

FGS_TYPE_PERMISSION_CHANGE_ID

變更 ID:254662522
預設狀態:已針對指定 Android 14 以上版本為目標的應用程式啟用。

啟用之後,如果應用程式指定 Android 14 以上版本為目標,且在缺乏與前景服務類型相關的必要權限時啟動前景服務,將會導致 SecurityException

如要進一步瞭解這項變更,請參閱這個說明前景服務類型變更的頁面。

FORCE_DISABLE_HEVC_SUPPORT

變更 ID:174227820
預設狀態:已為所有應用程式停用。

強制停用應用程式支援 HEVC 媒體功能。應用程式應該在其資訊清單中宣告支援的媒體功能,不過這個標記可用來強制禁止應用程式支援 HEVC,進而在存取以 HEVC 編碼的媒體時執行強制轉碼。設定此標記後,系統將會覆寫應用程式所有 OS 級別的預設值。此設定依預設為停用狀態,表示系統會優先採用 OS 預設值。若設定此標記但 FORCE_ENABLE_HEVC_SUPPORT 為未定義狀態,則 OS 將會一併忽略兩個標記。

FORCE_ENABLE_HEVC_SUPPORT

變更 ID:174228127
預設狀態:已為所有應用程式停用。

強制允許應用程式支援 HEVC 媒體功能 應用程式應該在其資訊清單中宣告支援的媒體功能,不過這個標記可用來強制要求應用程式支援 HEVC,進而避免在存取以 HEVC 編碼的媒體時進行轉碼。設定此標記後,系統將會覆寫應用程式所有 OS 級別的預設值。此設定依預設為停用狀態,表示系統會優先採用 OS 預設值。若設定此標記但 FORCE_DISABLE_HEVC_SUPPORT 為未定義狀態,則 OS 將會一併忽略兩個標記。

FORCE_NON_RESIZE_APP

變更 ID:181146395
預設狀態:已為所有應用程式停用。

強制要求已套用的套件禁止調整大小操作。

FORCE_RESIZE_APP

變更 ID:174042936
預設狀態:已為所有應用程式停用。

強制要求已套用的套件啟用調整大小操作。我們僅允許在全螢幕模式下調整視窗大小,不會強制要求應用程式套用可調整大小的多視窗模式。

GWP_ASAN

變更 ID:145634846
預設狀態:已為所有應用程式停用。

在應用程式中啟用取樣的原生記憶體錯誤偵測功能。

如要進一步瞭解如何使用 GWP-ASan,請參閱 GWP-ASan 指南

IMPLICIT_INTENTS_ONLY_MATCH_EXPORTED_COMPONENTS

變更 ID:229362273
預設狀態:已針對指定 Android 14 以上版本為目標版本的應用程式啟用。

如果應用程式指定以 Android 14 以上版本為目標版本,則必須先匯出元件,才可透過隱含意圖叫用這些元件。如果未匯出元件並叫用,該元件會自接收器清單中移除。此功能尤其適用於活動和廣播訊息。

KEYSTORE_OPERATION_CREATION_MAY_FAIL

變更 ID:169897160
預設狀態:已為所有應用程式停用。

啟用後,可能會因為新的裁舊剪策略而無法建立 KeyStore 作業。以往在建立加密作業一律成功的假設下,KeyStore 是可以正常運作的。不過,KeyMint 後端的運算單元數量有限。

為了將運算單元維持在「無限大」的景象,KeyStore Daemon 會在沒有可用運算單元的情況下,刪除最近使用過的運算。如此一來可能會導致正常運算提前終止。這會使得 AndroidKeystore 陷入阻斷服務 (DoS) 攻擊與非預期活結 (Livelock) 的風險之中。舉例來說,假設多個應用程式因電源管理最佳化調整而同時被喚醒,並試圖執行加密運算,那麼這些程序會開始終止彼此的運作,導致沒有任何進度產生,這就是活結的概念。

為了要中斷活結並避免蒙受 DoS 攻擊,我們已變更裁舊策略,使其以使用少量運算單元的客戶為優先。因此,依照裁舊策略,不會閒置超過 5 秒以上的單一運算幾乎一律不會受到中斷。有些與檔案系統加密相關的運算也會對這些運算進行裁舊,但此情況十分罕見。這項新的裁舊策略運算有一個連帶作用,如果用戶端的裁舊能力低於所有現有運算的裁舊能力,建立作業會立刻失敗。

裁舊策略:為了找出適當的候選對象,我們會計算呼叫端和每個現有作業的 Malus。Malus 即裁舊能力 (呼叫端) 的反義詞,又稱 (現有運算的) 裁舊阻力。呼叫端必須找到一個比自身 Malus 更高的運算,才能裁舊某項運算。如要進一步瞭解裁舊策略,請參閱 operation.rs 的實作方式。在 Android 11 (API 級別 30) 及更低版本中,KeyStore2 會輪詢 KeyStore Daemon 以取得可用的作業運算單元。針對指定 Android 11 (API 級別 30) 以下版本為目標版本的應用程式,此運算看起來仍像是加密作業,並一律會緊接著進行簽名物件初始化,但可能需要比較久的時間才能取得運算。所有 Android 版本均享有更公平的作業運算單元排程,同時提高順利完成運算的機率。

NATIVE_HEAP_ZERO_INIT

變更 ID:178038272
預設狀態:已為所有應用程式停用。

啟用原生堆積記憶體配置的自動零初始化功能。

NATIVE_MEMTAG_ASYNC

變更 ID:145772972
預設狀態:已為所有應用程式停用。

在此程序中啟用非同步 (ASYNC) 記憶體標記檢查。此標記只會影響支援 ARM Memory Tagging Extension (MTE) 的硬體。

NATIVE_MEMTAG_SYNC

變更 ID:177438394
預設狀態:已為所有應用程式停用。

在此程序中啟用同步 (SYNC) 記憶體標記檢查。此標記只會影響支援 ARM Memory Tagging Extension (MTE) 的硬體。若同時啟用 NATIVE_MEMTAG_ASYNC 和此選項,則會以此選項為優先,並在 SYNC 模式下啟用 MTE。

NEVER_SANDBOX_DISPLAY_APIS

變更 ID:184838306
預設狀態:已為所有應用程式停用。

啟用後,即可避免將 Display API 沙箱機制套用至上下黑邊或 SCM 活動。Display API 會持續提供 DisplayArea 界限。

如要進一步瞭解這項變更,請參閱 Android 12 行為變更頁面中的已淘汰的顯示方法一節。

OVERRIDE_CAMERA_RESIZABLE_AND_SDK_CHECK

變更 ID:191514214
預設狀態:已為所有應用程式停用。

啟用後,此變更 ID 會強制其套用的套件忽略 android:resizeableActivity 當前的值,並且鎖定與 M 相等或更低的 SDK,然後將活動視為無法調整大小。在此情況下,基於目前螢幕旋轉方向的考量,相機旋轉和裁剪的值將僅取決於所需的補償。

OVERRIDE_CAMERA_ROTATE_AND_CROP_DEFAULTS

變更 ID:189229956
預設狀態:已為所有應用程式停用。

啟用後,此變更 ID 會強制其套用的套件覆寫預設的相機旋轉和裁剪行為,並且一律會傳回 CaptureRequest.SCALER_ROTATE_AND_CROP_NONE。下表將討論預設行為以及所有可能的覆寫組合。

OVERRIDE_MIN_ASPECT_RATIO

變更 ID:174042980
預設狀態:已為所有應用程式停用。

這項變更負責為所有強制執行特定最小顯示比例的變更把關。啟用這項變更即可套用下列最小顯示比例:

為應用程式套件啟用此變更後,除非應用程式資訊清單中的值較大,否則應用程式資訊清單中指定的最小顯示比例將被覆寫為可啟用的最大顯示比例。

OVERRIDE_MIN_ASPECT_RATIO_LARGE

變更 ID:180326787
預設狀態:已為所有應用程式停用。

此時如果也啟用了 OVERRIDE_MIN_ASPECT_RATIO,則此套件變更會將活動的最小顯示比例設定為由 OVERRIDE_MIN_ASPECT_RATIO_LARGE_VALUE 所定義的較大值。

OVERRIDE_MIN_ASPECT_RATIO_MEDIUM

變更 ID:180326845
預設狀態:已為所有應用程式停用。

此時如果也啟用了 OVERRIDE_MIN_ASPECT_RATIO,則此套件變更會將活動的最小顯示比例設定為由 OVERRIDE_MIN_ASPECT_RATIO_MEDIUM_VALUE 所定義的中間值。

OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY

變更 ID:203647190
預設狀態:已為所有應用程式啟用。

此時如果也啟用了 OVERRIDE_MIN_ASPECT_RATIO,則此套件變更便會針對同樣具備直向螢幕方向的活動,限制其他任何強制將活動最小顯示比例設定為特定值的變更,例如 OVERRIDE_MIN_ASPECT_RATIO_LARGEOVERRIDE_MIN_ASPECT_RATIO_MEDIUM

RATE_LIMIT_TOASTS

變更 ID:174840628
預設狀態:您無法切換此變更。此變更僅可由相容性架構記錄。

Toast.show() 的呼叫次數啟用頻率限制,以免使用者在某段時間內收到大量浮動式訊息。若嘗試在特定時間範圍內顯示超過許可數量的浮動式訊息,系統將會捨棄浮動式訊息。

REJECT_NEGATIVE_NETWORK_ESTIMATES

變更 ID:253665015
預設狀態:已針對指定 Android 14 以上版本為目標的應用程式啟用。

啟用之後,預估網路位元組必須為正數。

REQUIRE_NETWORK_CONSTRAINT_FOR_NETWORK_JOB_WORK_ITEMS

變更 ID:241104082
預設狀態:已針對指定 Android 14 以上版本為目標的應用程式啟用。

如果應用程式指定以 Android 14 以上版本為目標,且其中所含的 JobWorkItem 會指示網路使用量,則託管作業必須指定網路限制。

REQUIRE_NETWORK_PERMISSIONS_FOR_CONNECTIVITY_JOBS

變更 ID:271850009
預設狀態:已針對指定 Android 14 以上版本為目標的應用程式啟用。

如果應用程式指定 Android 14 以上版本為目標,當安排設有連線限制的工作時,就必須同時指定 INTERNETACCESS_NETWORK_STATE

THROW_ON_INVALID_DATA_TRANSFER_IMPLEMENTATION

變更 ID:255371817
預設狀態:已針對指定 Android 14 以上版本為目標的應用程式啟用。

針對指定 Android 14 或以上版本為目標版本的應用程式,若應用程式未正確實作所有必要的資料移轉 API,則系統會擲回例外狀況。

USE_EXPERIMENTAL_COMPONENT_ALIAS

變更 ID:196254758
預設狀態:已為所有應用程式停用。

啟用後,系統將允許「android」套件使用元件別名。