根據 Android 相容性定義說明文件,原始設備製造商必須提供啟用應用程式開發功能的方法。不過,在車輛中提供類似行動裝置的開發人員選項,會讓車輛容易受到攻擊。現在 OEM 可以使用經過驗證的加密權杖機制,控管開發人員選項的存取權。具體來說,OEM 可以:
- 請在首次啟動前指定預設限制。
- 安全地授權開發人員,並視需要使用加密權杖。
- 開發人員通過驗證和授權後,即可套用限制變更。
本頁說明參考實作項目,包括偵錯限制控制器應用程式和遠端權杖核發端點。
術語
除了術語,本頁面還會使用下列詞彙:
- RFC 7515 中定義的 JSON Web Signature (JWS)
- 國家標準暨技術研究院 (NIST)
設計
原始設備製造商 (OEM) 可以使用 JSON Web Signature (JWS) 權杖 (RFC7515) 授權開發人員。在參考實作中,存取權杖是由 OEM 核發,並由限制控制器應用程式使用。存取權杖的設計目的是為了防範重送攻擊和偽造權杖。

圖 1. 設計
整合與設定
原始設備製造商必須在首次啟動時指定預設限制。OEM 會使用多個靜態資源疊加層來覆寫 Android 開放原始碼計畫架構中的預設值。
無頭系統使用者的預設限制可透過 config_defaultFirstUserRestrictions 字串在 frameworks/base/core/res/res/values/config.xml 中設定,例如:
<!-- User restrictions set when the first user is created.
Note: Also update appropriate overlay files. -->
<string-array translatable="false" name="config_defaultFirstUserRestrictions">
<item>no_debugging_features</item>
<item>no_install_unknown_sources</item>
<item>no_install_unknown_sources_globally</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" no_install_unknown_sources="true"/> </full-type> <full-type name="android.os.usertype.full.GUEST" > <default-restrictions no_debugging_features="true" no_install_unknown_sources="true"/> </full-type> </user-types>
版本號碼偏好設定控制器
在 AAOS 中,使用者與「設定」中的「版本號碼」偏好設定列互動時,系統會透過 BuildNumberPreferenceController.java (位於 packages/apps/Car/Settings/src/com/android/car/settings/system/BuildNumberPreferenceController.java) 處理。
設定 no_debugging_features (UserManager.DISALLOW_DEBUGGING_FEATURES) 使用者限制後,輕觸 BuildNumberPreferenceController 會在正式版 (user) 建構作業中抑制開發人員倒數計時:
@Override protected boolean handlePreferenceClicked(Preference preference) { if (DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(getContext())) { return true; } // Enforce restriction on production (user) builds if (Build.IS_USER && mUserManager.hasUserRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES)) { showToast(R.string.dev_access_blocked_toast); return true; } mDevHitCountdown--; if (mDevHitCountdown == 0) { DevelopmentSettingsUtil.setDevelopmentSettingsEnabled(getContext(), true); showToast(R.string.show_dev_on); } return true; }
使用 Build.IS_USER 可確保正式版建構作業嚴格執行安全鎖定,而 userdebug 建構作業的內部工程團隊仍可使用 7 次輕觸手勢存取開發人員選項進行測試,不必手動覆寫指令列介面 (CLI)。
偵錯 Restriction Controller
AOSP 位於 packages/apps/Car/DebuggingRestrictionController,提供偵錯限制控制器 (DRC) 的參考實作。
OEM 可透過 DRC,為授權服務技術人員和開發人員,動態且暫時解除生產車輛的 no_debugging_features 限制。車內 DRC 應用程式會提示使用者向原始設備製造商 (OEM) 後端驗證,並提交以密碼編譯簽署的存取權杖,以啟用 adb 和「開發人員選項」,進行有限的診斷工作階段,不必永久開啟偵錯工具或重新刷寫韌體。
DRC 參考實作包含兩個核心元件:
- 車載 DRC 用戶端應用程式 (
app/):主機上的具備權限系統應用程式 (持有MANAGE_USERS權限),可驗證開發人員、驗證傳入 JWS 權杖的 X.509 憑證簽章、主機名稱、隨機數和到期時間,並使用UserManager動態切換no_debugging_features限制。 - 雲端權杖簽發者 (
server/):後端網路服務 (可部署為 Firebase Cloud Functions),用於驗證開發人員憑證,並簽發具有有限效期且經過加密簽署的 RS256 JWS 存取權杖。
如需完整的設定說明、憑證產生工具和部署步驟,請參閱「Debugging Restriction Controller integration guide」。
測試
Google 建議原始設備製造商從參考實作開始,再逐步擴充。
- 在疊加檔案中設定限制後,請編譯 AAOS 並驗證定義的流程。使用參考應用程式和支援 JWS 的本機服務,驗證存取設定。
- 選用:設定系統,使用啟用 JWS 的雲端服務。確認後端服務是否按照預期流程運作。