WindowManager 擴充功能

Jetpack WindowManager 程式庫可讓應用程式開發人員支援新的裝置板型規格, 多視窗模式的自動化功能

WindowManager Extensions (擴充功能) 是選擇性加入的 Android 平台模組, 啟用各種 Jetpack WindowManager 功能這個模組已實作 (frameworks/base/libs/WindowManager/Jetpack 中的 Android 開放原始碼計畫) 並傳送到支援 WindowManager 功能的裝置。

擴充功能模組發布管道

擴充功能會編譯至 .jar 程式庫,並放在 system_ext 中 則會在裝置 makefile 中啟用擴充功能。

如要在裝置上啟用擴充功能,請將下列指令新增至產品裝置 makefile:

$(call inherit-product, $(SRC_TARGET_DIR)/product/window_extensions.mk)

這會啟用 androidx.window.extensionsandroidx.window.sidecar 並設定 persist.wm.extensions.enabled 屬性。 在 makefile 中加入這些套件後,也會在 etc/permissions/,以便提供給應用程式程序使用。正常情況下 模組皆載入並執行,做為應用程式程序的一部分: 也就是 Jetpack WindowManager 程式庫使用的執行階段 作業,與用戶端架構程式碼類似,如下所示 圖表:

圖 1. 已載入應用程式中的 WindowManager 擴充功能 類似於平台程式碼的程序

androidx.window.extensions 模組是「擴充功能」模組,位於以下位置: 積極開發應用程式androidx.window.sidecar 模組是舊版模組 包含以與最新版 Jetpack WindowManager 相容 但補充資訊已不再受到維護

下圖顯示判斷使用 androidx.window.extensionsandroidx.window.sidecar

圖 2. 存取決策樹 androidx.window.extensionsandroidx.window.sidecar

擴充功能模組

擴充功能可為折疊式大螢幕裝置提供視窗功能 支援在外接顯示器上開啟視窗功能的裝置。特色包括:

原始設備製造商 (OEM) 實作擴充功能後,可提供空值或含有 定義方法的預設或虛設常式實作 WindowExtensions敬上 介面 (表示裝置硬體不支援對應的功能) 時, 除非在 相容性定義說明文件 (CDD) 7.1.1.1

擴充功能和 Jetpack API

除了原有的 WindowManager 模組外,WindowManager 擴充功能也提供其專屬的 API 介面 公開平台 APIExtensions 模組是公開在 非開發人員適用的 androidx.window.extensions Jetpack 程式庫,因此 Jetpack WindowManager (androidx.window) 且能在編譯期間連結至該網址通常擴充功能 API 介面 並提供較低階 API

擴充功能提供的 API 必須由 Jetpack 使用 僅限 WindowManager 程式庫。Extensions API 不會 應用程式開發人員無法將擴充功能程式庫新增為 Gradle 建構檔案中應用程式的依附元件,確保正確無誤 功能。避免將擴充功能程式庫預先編譯到應用程式 directly;請依據執行階段載入,避免發生載入混合情形的情況 預先編譯和執行階段提供的 Extensions 類別所組成

Jetpack WindowManager (androidx.window) 預計會新增為應用程式 並提供向開發人員提供的公開 API,包括 ,瞭解 WindowManager 擴充功能有哪些功能WindowManager 程式庫會自動 將擴充功能載入應用程式程序,並納入 運用擴充功能 API 建構更高層次的抽象層 存取 APIWindowManager Jetpack API 符合現代標準 旨在提供簡便的 Android 應用程式開發介面 與其他 AndroidX 的程式碼集完美整合,進而實現互通性 程式庫

擴充功能版本和更新

擴充功能模組每年都會與 Android 平台一併更新,或是 每季更新每季更新可讓 Extensions API 級別 是隨著 Android 平台 API 更新增加的速率,能加快疊代速度並 讓原始設備製造商 (OEM) 有機會為新功能加入官方 API 存取權 會越來越接近硬體啟動

下表列出了以下項目的 androidx.window.extensions API 版本: 各種 Android 版本

Android 平台版本 WindowManager Extensions API 級別 androidx.window.extensions API 版本
Android 15 6 1.5.0 (即將推出)
Android 14 QPR3 5 1.4.0 (即將推出)
Android 14 QPR1 4 1.3.0
Android 14 3 1.2.0
Android 13 QPR3 2 1.1.0
Android 13 1 1.0.0
Android 12L 1 1.0.0

每次產生範本時,Extension API 級別 (中間欄) 就會增加 以及現有的穩定 API 介面 (右欄)。

回溯與前瞻相容性

Jetpack WindowManager 可處理常見 API 級別的問題 更新、快速 API 演進,以及回溯相容性。程式庫程式碼 會在應用程式程序中執行,程式庫會檢查宣告的 擴充功能 API 級別,並根據宣告 第二,自訂角色只能 套用至專案或機構

為避免應用程式在執行階段當機,WindowManager 也會執行 執行階段 Java 反射檢查 宣告的 Extensions API 級別如果不相符,WindowManager 可以 停用擴充功能 (部分或完全停用),並回報 功能,因為應用程式無法使用的功能。

WindowManager 擴充功能會實作為 system_ext 模組,該模組會使用 用來呼叫 WindowManager 核心的私人平台 API DeviceStateManager, 以及其他系統服務,藉此實作擴充功能功能。

擴充功能預先發布版可能無法維護相容性 。 最終版本如要查看 Extensions API 的完整記錄 可在版本分支中找到 window:extensions:extensions API 文字檔案

新版擴充功能必須繼續與舊版的 WindowManager 已編譯成應用程式,以便維持前瞻相容性。目的地: 確定,任何新版本的 Extensions API 都只會加入新的 API, 並不會移除較舊的檔案因此,具有舊版 WindowManager 的應用程式 版本仍可繼續使用應用程式編譯的舊版 Extensions API 下定決心

CTS 驗證可確保裝置上任何宣告的 Extensions API 版本 裝置,與該版本相關的所有 API 都會正常運作。

成效

根據預設,自 Android 14 (API 級別 34) 開始,擴充功能模組會在非 Bootclasspath 系統類別載入器中快取,因此不會因為在應用程式啟動時將模組載入記憶體而受到影響。在用戶端和伺服器之間執行其他處理序間通訊 (IPC) 呼叫時,使用個別模組功能可能會稍微影響應用程式的效能特性。

模組

活動嵌入

活動嵌入 元件提供一系列功能,可讓應用程式 父項應用程式邊界內的活動視窗呈現方式。這個 包括在「標籤」中並排顯示兩個活動 多窗格版面配置,有助於針對舊版舊版螢幕最佳化 應用程式。

只要裝置具備 大小等於或大於 sw600 dp 的內建顯示畫面。 支援外部螢幕的裝置也必須啟用活動嵌入功能 因為在外部存取應用程式時,應用程式可能會以較大尺寸顯示 螢幕都會在執行階段連線。

裝置設定

啟用擴充功能後,不需要進行特定裝置設定 如「擴充功能模組發布」中所述 專區。建議您在所有支援裝置上啟用擴充功能 多視窗模式。日後的 Android 版本可能會使用擴充功能 常見的手持裝置和大螢幕裝置設定步驟。

視窗版面配置資訊

視窗版面配置資訊元件會指出 轉軸跨應用程式視窗時,轉軸在折疊式裝置上。 視窗版面配置資訊可讓應用程式回應並顯示最佳化的資訊 折疊式裝置的桌面模式下的版面配置。詳情請見 讓應用程式適用摺疊式裝置

內含轉軸的摺疊式 Android 裝置,可分別連結不同或 連續顯示面板區域必須呈現轉軸相關資訊 提供給應用程式使用,期限為 WindowLayoutComponent

轉軸位置和邊界必須依據應用程式回報 由傳遞至 API 的 Context 識別的視窗。如果應用程式視窗 邊界不會與轉軸邊界 (轉軸) 重疊 DisplayFeature敬上 無法檢舉此外,如果不想回報顯示功能 可能不準確地回報位置,例如應用程式 使用者可在多視窗模式下自由移動視窗,或 。

對於折疊功能 當轉軸位置介於 穩定狀態根據預設,API 必須回報螢幕狀態, FoldingFeature.State.FLAT。 如果裝置硬體可處於半摺疊模式並保持穩定狀態, API 必須回報 FoldingFeature.State.HALF_OPENED。 API 中沒有關閉狀態,因為這種情況下應用程式視窗 可能無法顯示,或是無法跨出轉軸邊界。

裝置設定

如要支援摺疊功能實作,原始設備製造商 (OEM) 必須執行下列操作:

  • 設定 device_state_configuration.xml 中要使用的裝置狀態 DeviceStateManagerService。詳情請見 DeviceStateProviderImpl.java

    如果 DeviceStateProvider 的預設實作方式 或 DeviceStatePolicy 不適用於裝置,則可使用自訂實作。

  • 按照 擴充功能模組發布一節。

  • 指定 com.android.internal.R.string.config_display_features 中的顯示功能的位置 字串資源 (通常位於 frameworks/base/core/res/res/values/config.xml 中) 。

    字串的預期格式為:

    <type>-[<left>,<top>,<right>,<bottom>]

    type 可以是 foldhingelefttopright 的值 而 bottom 是顯示座標空間中的整數像素座標。 自然顯示方向設定字串可以包含多個 顯示以分號分隔的顯示功能

    例如:

    <!-- Jetpack WindowManager display features -->
    <string name="config_display_features" translatable="false">fold-[1000,0,1000,2000]</string>
    
  • 定義應用程式內部裝置狀態 ID 之間的對應關係 DeviceStateManager,以及傳送給開發人員的公開狀態常數 com.android.internal.R.array.config_device_state_postures

    每個項目的預期格式如下:

    <device_specific_state_identifier>:<Jetpack WindowManager state identifier>

    支援的狀態 ID 如下:

    • COMMON_STATE_NO_FOLDING_FEATURES = 1:狀態沒有折疊功能, 報表。比如一般摺疊式裝置的關閉狀態 主畫面顯示主畫面。
    • COMMON_STATE_HALF_OPENED = 2:折疊功能為一半開啟。
    • COMMON_STATE_FLAT = 3:折疊功能是平的。舉例來說,如果是一般摺疊式裝置的開啟狀態,則主畫面位於內側。
    • COMMON_STATE_USE_BASE_STATE = 1000:於 Android 14 (可用於模擬的值) 表示轉軸狀態是使用基本狀態衍生的狀態,如 CommonFoldingFeature.java

    詳情請參閱 DeviceStateManager.DeviceStateCallback#onBaseStateChanged(int)

    例如:

    <!-- Map of System DeviceState supplied by DeviceStateManager to WindowManager posture.-->
    <string-array name="config_device_state_postures" translatable="false">
        <item>0:1</item>    <!-- CLOSED       : COMMON_STATE_NO_FOLDING_FEATURES -->
        <item>1:2</item>    <!-- HALF_OPENED  : COMMON_STATE_HALF_OPENED -->
        <item>2:3</item>    <!-- OPENED       : COMMON_STATE_FLAT -->
        <item>3:1</item>    <!-- REAR_DISPLAY : COMMON_STATE_NO_FOLDING_FEATURES -->
        <item>4:1000</item> <!-- CONCURRENT   : COMMON_STATE_USE_BASE_STATE -->
    </string-array>
    

窗戶區域

視窗區域元件提供一組功能,可讓應用程式 在某些摺疊式裝置上存取更多螢幕和顯示區域 支援多螢幕裝置

後置顯示模式可讓應用程式 使用者可以使用摺疊式裝置的封面螢幕, 自拍和影片具備 Android 相容裝置 (根據 Android CDD 定義的屬性,如大小、密度和 可用的導航功能) 對齊後置裝置的封面螢幕 攝影機必須授予後置顯示模式的存取權。

在 Android 14 中,雙顯示模式可讓應用程式在折疊式裝置的內螢幕上執行,以顯示在螢幕上向其他使用者顯示額外內容;舉例來說,封面螢幕可以向拍攝對象顯示相機預覽畫面。

裝置設定

如要支援摺疊功能實作,原始設備製造商 (OEM) 必須執行下列操作:

  • 設定 device_state_configuration.xml 中要使用的裝置狀態 DeviceStateManagerService。詳情請見 DeviceStateProviderImpl.java敬上 瞭解詳情

    如果預設實作 DeviceStateProvider敬上 或 DeviceStatePolicy 不適用於裝置,則可使用自訂實作項目。

  • 如果是支援開啟或平面模式的摺疊式裝置,請指定相應的 狀態 ID (位於 com.android.internal.R.array.config_openDeviceStates 中)。

  • 如果是支援折疊狀態的折疊式裝置,請列出對應的 狀態 ID (位於 com.android.internal.R.array.config_foldedDeviceStates 中)。

  • 適用於支援半折疊狀態的折疊式裝置 (轉軸為半開式) 將對應的狀態列成 com.android.internal.R.array.config_halfFoldedDeviceStates

  • 若是支援後置顯示模式的裝置:

    • 列出 DeviceStateManagercom.android.internal.R.array.config_rearDisplayDeviceStates 中對應狀態。
    • 指定後置顯示器的實際顯示地址 (位於 com.android.internal.R.string.config_rearDisplayPhysicalAddress 中)。
    • com.android.internal.R.integer.config_deviceStateRearDisplay 中指定擴充功能要使用的狀態 ID。
    • com.android.internal.R.array.config_deviceStatesAvailableForAppRequests 中新增狀態 ID,以提供給應用程式。
  • 在 Android 14 中,如果是支援雙 (並行) 顯示模式的裝置:

    • com.android.internal.R.bool.config_supportsConcurrentInternalDisplays 設為 true
    • 指定後置顯示器的實際顯示地址 (位於 com.android.internal.R.config_deviceStateConcurrentRearDisplay 中)。
    • 如果 ID 的目的是供應用程式使用,請在 com.android.internal.R.integer.config_deviceStateConcurrentRearDisplay 中指定要讓擴充功能使用的狀態 ID。
    • com.android.internal.R.array.config_deviceStatesAvailableForAppRequests 中新增狀態 ID,以提供給應用程式。

驗證

原始設備製造商 (OEM) 必須驗證導入情況,確保預期的行為 情境使用 Jetpack WindowManager 的 CTS 測試和測試,可供原始設備製造商 (OEM) 使用 測試實作。

CTS 測試

如要執行 CTS 測試,請參閱「執行 CTS 測試」。康乃狄克州 Jetpack WindowManager 相關的測試位於 cts/tests/framework/base/windowmanager/jetpack/ 下。 測試模組名稱為 CtsWindowManagerJetpackTestCases

WindowManager 測試

如要下載 Jetpack WindowManager 測試,請按照 Android Jetpack 操作說明。 測試位於 window:window 模組的視窗程式庫中:window/window/src/androidTest/

如要透過指令列執行 window:window 模組的裝置測試,請執行 包括:

  1. 接上已啟用開發人員選項和 USB 偵錯功能的裝置。
  2. 允許電腦對裝置偵錯。
  3. 在 androidx 存放區的根目錄中開啟殼層。
  4. 將目錄變更為 framework/support
  5. 執行下列指令:./gradlew window:window:connectedAndroidTest
  6. 分析結果。

如要從 Android Studio 執行測試,請按照下列步驟操作:

  1. 開啟 Android Studio。
  2. 接上已啟用開發人員選項和 USB 偵錯功能的裝置。
  3. 允許電腦對裝置偵錯。
  4. 在視窗模組的視窗程式庫中前往測試。
  5. 開啟測試類別,然後使用右側的綠色箭頭執行測試 編輯

您也可以在 Android Studio 中建立設定來執行測試 或測試類別中的所有測試方法。

查看殼層的輸出內容,即可手動分析結果。只有部分通知 系統就會略過測試。搜尋結果為 儲存在標準位置中,分析人員就能編寫指令碼來自動執行 分析結果。