調試限制控制器整合指南

使用本頁上的說明整合 AAOS 調試限制控制器 (DRC)。

圖 1.DRC應用範例。

建築學

DRC 架構如圖 2 所示。紅色框出的元件(令牌頒發者和 DRC)具有您可以自訂的隨附參考實作。

圖 2.DRC架構。

什麼是剛果民主共和國?

汽車主機包括 DRC 應用程式(請參閱packages/apps/Car/DebuggingRestrictionController中的參考實作)。參考應用程式包括用於從令牌頒發者接收存取令牌、驗證令牌,然後應用令牌中指定的偵錯限制變更的邏輯。此邏輯包括汽車端的基本使用者體驗元素。

代幣發行者是什麼?

這是一個發出加密簽章存取權杖的 Web 服務(請參閱packages/apps/Car/DebuggingRestrictionController/server中的參考實作)。參考 Web 服務是可部署的 Firebase Cloud 函數(要了解更多信息,請參閱Firebase 的雲端函數)。

先決條件

在部署參考實作之前,請務必完成以下任務。

準備用於簽署存取令牌的證書

令牌頒發者產生 JSON Web 簽章 (JWS) 作為存取權杖。為了獲得最佳相容性,參考發行者僅支援 RS256 演算法(使用 SHA256 的 RSA 簽章)。為了促進密鑰輪換,請使用憑證鍊而不是單一憑證來簽署存取權杖。典型的憑證鏈應由根 CA 憑證、中間 CA 憑證和最終實體憑證組成。

簽署 JWS 令牌的終端實體憑證與標準 TLS 憑證沒有什麼不同。您可以從公共 CA(例如 DigiCert)購買證書,也可以使用自簽名根 CA 憑證或硬體安全模組來維護自己的憑證鏈。最終實體憑證應該是具有主題備用名稱 (SAN) 副檔名的 X509v3 憑證。 SAN 擴充包含令牌頒發者的識別碼(例如主機名稱)。最後,RSA 證書應優先於 EC 證書,因為令牌頒發者僅支援 RS256。

Google 在packages/apps/Car/DebuggingRestrictionController/server/genkey.sh中提供了用於產生自簽名憑證的 shell 腳本。

設定 Firebase

參考令牌頒發者使用Firebase 驗證Firebase Cloud Function

要設定您的 Firebase 帳戶:

  1. 若要建立 Firebase 項目,請參閱將 Firebase 新增至您的 Android 項目
  2. 若要啟用某些 Firebase 驗證器,請參閱從哪裡開始使用 Firebase 驗證?
  3. 若要新增空的 Firebase Cloud 函數,請參閱入門
  4. 如果尚未完成,請安裝Node.js 、 NPM 和 Firebase 工具來編譯和部署令牌頒發者。

整合 DRC 應用程式

參考 DRC 應用程式位於packages/apps/Car/DebuggingRestrictionController中。該應用程式可以在 AOSP 中與Soong捆綁在一起構建,也可以與Gradle分開構建

捆綁構建

要建立捆綁應用程式:

  1. applicationIdprojectIdapiKeygoogle-services.json複製到packages/apps/Car/DebuggingRestrictionController/soong/FirebaseApplication.java 。這樣做可以使 DRC 應用程式正確連接到 Firebase。
  2. 更新packages/apps/Car/DebuggingRestrictionController/soong/BuildConfig.java中的這些常數:
    • TOKEN_USES_SELF_SIGNED_CA指示是否使用自簽名根 CA 憑證。如果啟用,DRC 應用程式僅信任ROOT_CA_CERT中指定的 PEM 編碼的根 CA 憑證。
    • TOKEN_ISSUER_API_NAME是 Firebase 雲端函數的名稱,應與您先前在 Firebase 控制台中建立的雲端函數相符。
    • TOKEN_ISSUER_HOSTNAME應與將簽署存取權杖的最終實體憑證中的主題備用名稱相符。
    • DRC_TEST_EMAILDRC_TEST_PASSWORD是可選測試帳戶的憑證,如果您啟用了電子郵件/密碼登錄,則可以在 Firebase 中預先配置該帳戶。這些僅用於儀器測試。

該應用程式現已配置為使用您的 Firebase 帳戶和憑證。在 Android 9 及更高版本中,您必須設定特權權限 白名單。允許清單必須至少包含android.permission.MANAGE_USERS 。例如:

<permissions>
  <privapp-permissions package="com.android.car.debuggingrestrictioncontroller">
    <permission name="android.permission.INTERNET"/>
    <permission name="android.permission.MANAGE_USERS"/>
  </privapp-permissions>
</permissions>

非捆綁構建

未捆綁的 DRC 建置使用 Gradle 來編譯應用程式。

若要建立非捆綁版本:

  1. 確認您已安裝 Android SDK。
  2. 在應用程式的根目錄中建立一個名為local.properties的文字檔案。
  3. 設定Android SDK的位置:
     sdk.dir=path/to/android/sdk
    
  4. 要設定 Firebase,請將google-services.json複製到packages/apps/Car/DebuggingRestrictionController/app 。 Gradle 解析該檔案並自動設定其餘部分。
  5. 定義環境變數。與捆綁建置一樣,您必須指定:
    • $TOKEN_USES_SELF_SIGNED_CA :真或假;
    • $ROOT_CA_CERT :PEM 編碼的根 CA 憑證的路徑;
    • $TOKEN_ISSUER_API_NAME :Firebase 雲端函數的名稱;
    • $TOKEN_ISSUER_HOST_NAME :憑證中的 SAN;
    • $DRC_TEST_EMAIL$DRC_TEST_EMAI :測試帳戶的憑證,僅調試版本。
  6. 若要使用 Gradle 建置應用程序,請執行以下命令:
    $ ./gradlew build
    

整合代幣發行者

參考令牌頒發者是在Node.js中實作的 Firebase Cloud Function。該函數只能由經過身份驗證的使用者呼叫。在部署應用程式之前,您必須設定用於簽署 JWS 令牌的私鑰和憑證。

  1. 使用以下內容填入 JSON 檔案:
    {
        "key": "---BEGIN PRIVATE KEY---\nRSA_PRIVATE_KEY\n-----END PRIVATE KEY-----\n",
        "certificates.0": "-----BEGIN CERTIFICATE-----\nTOKEN_SIGNING_CERT\n-----END CERTIFICATE-----\n",
        "certificates.1": "-----BEGIN CERTIFICATE-----\nINTERMEDIATE_CA_CERT\n-----END CERTIFICATE-----\n",
        "certificates.2": "-----BEGIN CERTIFICATE-----\nROOT_CA_CERT\n-----END CERTIFICATE-----\n",
        "expiration": "30m",
        "issuer": "Debugging Access Token Issuer",
        "audience": "IHU"
    }
    

    憑證會依最終實體憑證在前、根 CA 憑證在後的順序排列。過期時間是可自訂的,如果頒發的令牌需要一段時間才能被 DRC 應用程式接收和使用,則可以將其設定為更長的持續時間。不支援令牌撤銷。

  2. 將配置上傳到 Firebase:
  3. $ firebase functions:config:set api_config="$(cat YOUR_CONFIG.json)"
    
  4. 部署Firebase雲端功能:
  5. $ firebase deploy --only functions
    
  6. 若要管理和監控您的令牌頒發者,請參閱管理函數部署和執行時間選項

設定預設限制

可以在首次啟動之前套用預設限制。使用靜態資源覆蓋來執行此操作以覆蓋 Android 框架中的預設設定。可以對不同類型的使用者分別進行限制。若要了解不同類型的用戶,請參閱多用戶支援

無頭系統使用者的預設限制可以使用frameworks/base/core/res/res/values/config.xml中的config_defaultFirstUserRestrictions字串陣列進行設定。設定此限制會自動停用 Android 調試橋 (ADB),直到限制被刪除,例如:

<string-array translatable="false" name="config_defaultFirstUserRestrictions">
  <item>no_debugging_features</item>
</string-array>

普通使用者(例如司機和乘客)和訪客的預設限制可以在frameworks/base/core/res/res/xml/config_user_types.xml中設定。您可以疊加這些字串來分別設定每種類型使用者的預設限制,例如:

<user-types>
  <full-type name="android.os.usertype.full.SECONDARY" >
    <default-restrictions no_debugging_features="true"/>
  </full-type>
  <full-type name="android.os.usertype.full.GUEST" >
    <default-restrictions no_debugging_features="true"/>
  </full-type>
</user-types>