實作系統 UI

Android Automotive 提供專為車輛開發的新系統 UI。系統 UI 的大部分元件都與架構服務緊密結合。「系統使用者介面」是指螢幕上顯示的任何元素,但不包含應用程式。汽車系統使用者介面 (位於 CarSystemUI 元素套件中) 是 Android 系統使用者介面 (位於系統使用者介面套件中) 的擴充功能,專為車輛進行客製化。

什麼是系統 UI?

汽車系統 UI 專屬元件包括:

元件 說明
鎖定螢幕 UI 使用者驗證特定使用者帳戶的畫面。
導覽列 系統資訊列可置於螢幕左側、底部或右側,並可加入面向不同應用程式的面向按鈕、切換通知面板,以及提供車輛控制項 (例如空調)。這與 Android 系統 UI 實作方式不同,後者提供返回、主畫面和應用程式堆疊按鈕。
狀態列 系統列會沿著螢幕排列,並充當導覽列。狀態列也提供以下功能:
  • 連線圖示。包括藍牙、Wi-Fi 和無線基地台/行動裝置連線。
  • 下拉式通知面板。例如從螢幕頂端向下滑動。
  • 抬頭通知 (HUN)。
系統 UI 指的是畫面上顯示的任何元素,但不包含應用程式。
使用者切換器 UI 使用者可選取其他使用者的畫面。
音量 UI 當駕駛者使用實體音量鍵調整裝置音量時,系統會顯示這個對話方塊。

系統 UI 的運作方式

系統 UI 是 Android 應用程式,會在裝置開機時執行。應用程式會透過 SystemServer 的反射啟動。以下列出系統 UI 中與使用者可見部分最相關的進入點。使用這些元件,為 Android 系統 UI 自訂汽車專屬功能。

  • config_statusBarComponent
  • config_systemUIFactoryComponent

CarSystemUI 是 System UI 套件的擴充功能,也就是說,CarSystemUI 套件可使用並覆寫 System UI 套件中的類別和資源。

自訂系統 UI

重疊說明

雖然您可以修改 Android 原始碼來自訂系統 UI,但這麼做會使日後套用 Android 更新變得更加困難和複雜。相反地,Android 支援使用疊加目錄,讓您不必修改原始碼就能取代資源檔。在 Android 建構系統中,覆蓋系統會以受控方式覆寫檔案。所有修改過的檔案都會清楚標示,無須遍歷整個 AOSP 原始碼樹狀結構。

覆蓋檔案必須放置在 PRODUCT_PACKAGE_OVERLAYS 目錄中,且必須與原始 AOSP 根結構的子資料夾完全相同。如果是 Android 10 以上版本,PRODUCT_PACKAGE_OVERLAYS 會設為:

PRODUCT_PACKAGE_OVERLAYS := packages/services/Car/car_product/overlay

Automotive System UI 會使用系統 UI CarSystemUI 套件的資源,也就是說,每個位置的資源都可以使用疊加層覆寫,以影響 Automotive System UI 的外觀和感受。

如要取代檔案,請在您指定的 /overlay 目錄中複製要取代的檔案目錄結構,然後在該目錄中加入取代檔案。例如,如要取代:

frameworks/base/packages/CarSystemUI/res/layout/super_status_bar.xml

新增替換 super_status_bar.xml 檔案,位於:

packages/services/Car/car_product/overlay/frameworks/base/packages/CarSystemUI/res/layout/

如要取代 frameworks/base/packages/SystemUI/res/values/config.xml (在系統 UI 中,不是 CarSystemUI),請將替換 config.xml 檔案新增至:

packages/services/Car/car_product/overlay/frameworks/base/packages/SystemUI/res/layout/

packages/services/Car/car_product/overlay/frameworks/base/packages/CarSystemUI/res/layout/

以下說明兩個主要自訂進入點。

汽車系統 UI 可在螢幕左側、底部和右側顯示三個導覽列。您可以使用下列設定切換各個系統列的顯示/隱藏狀態:

  • config_enableLeftSystemBar
  • config_enableBottomSystemBar
  • config_enableRightSystemBar

每個列都有已佈建和未佈建狀態,您可以透過重疊相應的版面配置檔案來自訂:

  • car_left_system_bar.xml
  • car_left_system_bar_unprovisioned.xml
  • car_system_bar.xml (底部導覽列的版面配置)
  • car_system_bar_unprovisioned.xml
  • car_right_system_bar.xml
  • car_right_system_bar_unprovisioned.xml

這些版面配置必須在頂層包含 com.android.systemui.car.systembar.CarSystemBarView,後者可納入任何必要的檢視畫面。您可以使用 com.android.systemui.car.systembar.CarSystemBarButton 加入導覽列內的按鈕。

如果裝置已為特定使用者正確佈建,這些檢視畫面就會在 CarSystemBar#createSystemBar 中展開。

狀態列

您可以將狀態列視為具有額外功能的導覽列。與導覽列不同,狀態列沒有用來停用的標記。您可以使用下列方式修改狀態列:

  • car_top_navigation_bar.xml
  • car_top_navigation_bar_unprovisioned.xml

這些版面配置必須在頂層包含 com.android.systemui.statusbar.car.CarNavigationBarView。狀態列包含狀態圖示。如要變更圖示大小,請使用縮放比例一律縮放圖示,而非指定特定大小。舉例來說,在覆疊檔案 /overlay/frameworks/base/packages/CarSystemUI/res/values/dimens.xml 中,新增下列尺寸,將圖示大小加倍:

<resources>
    <!-- The amount by which to scale up the status bar icons.-->
    <item name="status_bar_icon_scale_factor" format="float" type="dimen">2</item>
</resources>

狀態列位於特殊的視窗層,該層也包含通知面板、使用者切換器、抬頭通知 (HUN) 和鍵盤保護程式。super_status_bar.xml 包含這些元素的各種版面配置。

系統使用者介面原始碼變更

疊加層可能無法提供足夠的彈性,無法充分自訂系統 UI 行為。

警示。對 Android 原始碼所做的變更,在後續 Android 版本中難以更新。強烈建議您擴充 Automotive System UI 程式碼,而非直接修改程式碼。這樣一來,由於所有自訂項目都是透過已知的 API 途徑實作,因此可以透過最少的合併衝突升級基礎的 Automotive System UI 原始碼。

系統 UI 的大部分內容都可以透過以下兩個進入點自訂:

  • config_statusBarComponent
  • config_systemUIFactoryComponent

舉例來說,如果您建立名為 com.android.systemui.statusbar.car.custom.CustomCarStatusBar 的類別,並擴充 CarStatusBar,請將 config_statusBarComponent 更新為指向這個新元件。擴充這個類別可讓您自訂與系統列和通知邏輯相關的大部分元素。

同樣地,您可以建立 CustomCarSystemUIFactory 並放入 config_systemUIFactoryComponent。使用這個類別更新 VolumeUI 和鎖定畫面的功能。

自訂使用者切換和解鎖

以下說明如何自訂使用者切換體驗。

字詞 說明
鍵盤鎖 全螢幕對話方塊,可避免意外與前景應用程式互動。 在設定多位使用者時,可保護每位使用者的隱私。
載入對話方塊 切換使用者時顯示的載入畫面。
螢幕鎖定、bouncer 要求使用者輸入 PIN 碼、解鎖圖案或密碼的畫面。
使用者自訂 Android 使用者。
使用者挑選器 裝置啟動時顯示的使用者挑選畫面。
使用者切換器 從「快速設定」切換畫面時,會顯示使用者切換器。

自訂使用者切換

鍵盤鎖和 Bouncer

在 Android Automotive OS 中,只有在使用者點選鎖定畫面上的「取消」按鈕時,系統才會顯示含有使用者挑選器的 Keyguard 畫面。下圖為鎖定螢幕畫面。

鍵盤鎖畫面

圖 1. 鍵盤鎖螢幕

使用者選取用於解鎖裝置的隱私權類型後,系統會顯示含有 bouncer 的鎖定畫面,如以下所示。

螢幕鎖定畫面

圖 2. 螢幕鎖定畫面。

如果居家鎖設定為手動開啟或關閉電源,請按照下列操作說明操作:

adb shell input keyevent 26

使用者挑選器

當與車輛系統 UI 狀態列整合的裝置和地圖重新啟動時,系統會顯示使用者挑選畫面。詳情請參閱 FullscreenUserSwitcher

載入畫面

圖 3. 使用者挑選器畫面

您可以在 car_fullscreen_user_switcher.xml 中自訂這個畫面的版面配置。

載入畫面

無論進入點為何,只要使用者切換,系統就會顯示載入畫面。例如透過使用者挑選器或「設定」畫面。載入畫面是架構系統 UI 的必要元素,並對應至名為 CarUserSwitchingDialog 的公開類別。請參閱上圖 3 的範例。

您可以使用 Theme_DeviceDefault_Light_Dialog_Alert_UserSwitchingDialog 自訂主題。

如要設定 Android 使用者,初始設定精靈流程可讓駕駛員自行設定使用者名稱。如果駕駛人將 Android 使用者與 Google 帳戶建立關聯,系統會從該帳戶選取使用者名稱。不過,如果駕駛人指定名稱 (例如 DriverB),然後稍後將該使用者名稱與名為 Maddy 的 Google 帳戶建立關聯,系統就不會變更原本指派的名稱 (DriverB),因為該名稱已明確設定。駕駛員只能在「設定」選單中變更名稱。

您可以在 car_user_switching_dialog.xml. 中自訂版面配置

OEM 廠商可以使用名為 NoActionBar.Fullscreen 的主題隱藏狀態列和導覽列。(這是原始的系統 UI,已針對車輛參考 UI 進行更新)。詳情請參閱「自訂」。

雖然原始設備製造商 (OEM) 可以提供使用者介面切換使用者的進入點,但結果有時可能不如預期。發生這種情況時,請採取以下行動:

  1. OEM 會建立並顯示自訂的載入畫面 (或對話方塊)。
    • 針對使用者體驗,當使用者選取切換方式時,原始設備製造商會啟動自訂載入畫面,並在使用者切換完成時隱藏該畫面。
    • OEM 必須根據偏好設定優先順序視窗。例如優先順序較高的視窗類型。優先順序不得超過 Keyguard 的優先順序。
  2. config_customuserswitchui 所述,OEM 會在核心架構 config.xml 中設定 config_customUserSwitchUi=true。因此,架構「不會」顯示 CarUserSwitchingDialog

自訂螢幕鎖定畫面

螢幕鎖定畫面是系統 UI 的必要元素,可由原始設備製造商 (OEM) 自訂。如要自訂流程,請從 frameworks/base/packages/CarSystemUI/ 開始。

自訂首次使用者設定

設定精靈會執行首次使用者設定。這也是可自訂的項目。您可以使用 UserManager API 建立使用者。在某些情況下,您可以在背景中實作這項操作,藉此簡化設定精靈程序。