Hướng dẫn tích hợp Bộ điều khiển hạn chế gỡ lỗi

Sử dụng hướng dẫn trên trang này để tích hợp Bộ điều khiển hạn chế gỡ lỗi AAOS (DRC).

Hình 1. Ví dụ về ứng dụng DRC.

Ngành kiến ​​​​trúc

Kiến trúc DRC được minh họa trong Hình 2. Các thành phần được viền màu đỏ (nhà phát hành mã thông báo và DRC) có các triển khai tham chiếu đi kèm mà bạn có thể tùy chỉnh.

Hình 2. Kiến trúc DRC.

DRC là gì?

Bộ phận điều khiển ô tô bao gồm ứng dụng DRC (xem phần triển khai tham khảo trong packages/apps/Car/DebuggingRestrictionController ). Ứng dụng tham chiếu bao gồm logic để nhận mã thông báo truy cập từ nhà phát hành mã thông báo, xác thực mã thông báo và sau đó áp dụng các thay đổi hạn chế gỡ lỗi như được chỉ định trong mã thông báo. Logic bao gồm các phần tử UX cơ bản ở phía ô tô.

Nhà phát hành mã thông báo là gì?

Đây là dịch vụ web phát hành mã thông báo truy cập được ký bằng mật mã (xem cách triển khai tham chiếu trong packages/apps/Car/DebuggingRestrictionController/server ). Dịch vụ web tham chiếu là chức năng Đám mây Firebase có thể triển khai (để tìm hiểu thêm, hãy xem Chức năng đám mây cho Firebase ).

Điều kiện tiên quyết

Trước khi bạn triển khai triển khai tham chiếu, hãy đảm bảo hoàn thành các tác vụ sau.

Chuẩn bị chứng chỉ để ký mã thông báo truy cập

Nhà phát hành mã thông báo tạo Chữ ký web JSON (JWS) làm mã thông báo truy cập. Để có khả năng tương thích tối ưu, nhà phát hành tham chiếu chỉ hỗ trợ thuật toán RS256 (chữ ký RSA với SHA256). Để tạo điều kiện thuận lợi cho việc xoay vòng khóa, hãy sử dụng chuỗi chứng chỉ thay vì một chứng chỉ duy nhất để ký mã thông báo truy cập. Chuỗi chứng chỉ điển hình phải bao gồm chứng chỉ CA gốc, chứng chỉ CA trung gian và chứng chỉ thực thể cuối.

Chứng chỉ thực thể cuối ký mã thông báo JWS không khác gì chứng chỉ TLS tiêu chuẩn. Bạn có thể mua chứng chỉ từ các CA công khai như DigiCert hoặc duy trì chuỗi chứng chỉ của riêng mình bằng cách sử dụng chứng chỉ CA gốc tự ký hoặc Mô-đun bảo mật phần cứng. Chứng chỉ thực thể cuối phải là chứng chỉ X509v3 có phần mở rộng Tên thay thế chủ đề (SAN). Tiện ích mở rộng SAN chứa mã định danh (ví dụ: tên máy chủ) của nhà phát hành mã thông báo. Cuối cùng, chứng chỉ RSA nên được ưu tiên hơn chứng chỉ EC vì nhà phát hành mã thông báo chỉ hỗ trợ RS256.

Google cung cấp tập lệnh shell để tạo chứng chỉ tự ký trong packages/apps/Car/DebuggingRestrictionController/server/genkey.sh .

Thiết lập căn cứ hỏa lực

Nhà phát hành mã thông báo tham chiếu sử dụng Xác thực FirebaseChức năng đám mây Firebase .

Để thiết lập tài khoản Firebase của bạn:

  1. Để tạo dự án Firebase, hãy xem Thêm Firebase vào dự án Android của bạn .
  2. Để bật một số trình xác thực Firebase, hãy xem Tôi phải bắt đầu từ đâu với Xác thực Firebase? .
  3. Để thêm chức năng Firebase Cloud trống, hãy xem Bắt đầu .
  4. Nếu chưa thực hiện, hãy cài đặt các công cụ Node.js , NPM và Firebase để biên dịch và triển khai nhà phát hành mã thông báo.

Tích hợp ứng dụng DRC

Ứng dụng DRC tham chiếu nằm trong packages/apps/Car/DebuggingRestrictionController . Ứng dụng có thể được xây dựng theo gói trong AOSP với Soong hoặc tách rời với Gradle .

Bản dựng đi kèm

Để xây dựng một ứng dụng đi kèm:

  1. Sao chép applicationId , projectIdapiKey từ google-services.json vào packages/apps/Car/DebuggingRestrictionController/soong/FirebaseApplication.java . Làm như vậy sẽ cho phép ứng dụng DRC kết nối chính xác với Firebase.
  2. Cập nhật các hằng số này trong packages/apps/Car/DebuggingRestrictionController/soong/BuildConfig.java :
    • TOKEN_USES_SELF_SIGNED_CA cho biết liệu chứng chỉ CA gốc tự ký có được sử dụng hay không. Nếu được bật, ứng dụng DRC chỉ tin cậy chứng chỉ CA gốc được mã hóa PEM được chỉ định trong ROOT_CA_CERT .
    • TOKEN_ISSUER_API_NAME là tên của chức năng Đám mây Firebase và phải khớp với chức năng Đám mây mà bạn đã tạo trước đó trong Bảng điều khiển Firebase.
    • TOKEN_ISSUER_HOSTNAME phải khớp với Tên thay thế chủ đề trong chứng chỉ thực thể cuối sẽ ký mã thông báo truy cập.
    • DRC_TEST_EMAILDRC_TEST_PASSWORD là thông tin xác thực cho tài khoản thử nghiệm tùy chọn, có thể được cung cấp trước trong Firebase nếu bạn đã bật đăng nhập Email/Mật khẩu. Chúng chỉ được sử dụng cho các bài kiểm tra thiết bị.

Ứng dụng hiện được định cấu hình để sử dụng tài khoản Firebase và chứng chỉ của bạn. Trong Android 9 trở lên, bạn phải thiết lập danh sách cấp phép đặc quyền . Danh sách cho phép phải chứa ít nhất android.permission.MANAGE_USERS . Ví dụ:

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

Bản dựng chưa được nhóm

Các bản dựng DRC chưa được nhóm sẽ sử dụng Gradle để biên dịch ứng dụng.

Để tạo bản dựng chưa được nhóm:

  1. Xác nhận bạn đã cài đặt SDK Android.
  2. Tạo tệp văn bản có tên local.properties trong thư mục gốc của ứng dụng.
  3. Đặt vị trí của SDK Android:
     sdk.dir=path/to/android/sdk
    
  4. Để thiết lập Firebase, hãy sao chép google-services.json vào packages/apps/Car/DebuggingRestrictionController/app . Gradle phân tích cú pháp tệp và tự động thiết lập phần còn lại.
  5. Xác định các biến môi trường. Giống như các bản dựng đi kèm, bạn phải chỉ định:
    • $TOKEN_USES_SELF_SIGNED_CA : đúng hay sai;
    • $ROOT_CA_CERT : đường dẫn đến chứng chỉ CA gốc được mã hóa PEM;
    • $TOKEN_ISSUER_API_NAME : tên của chức năng Đám mây Firebase;
    • $TOKEN_ISSUER_HOST_NAME : SAN trong chứng chỉ;
    • $DRC_TEST_EMAIL$DRC_TEST_EMAI L: thông tin xác thực cho tài khoản thử nghiệm, chỉ các bản dựng gỡ lỗi.
  6. Để xây dựng ứng dụng bằng Gradle, hãy chạy lệnh như sau:
    $ ./gradlew build
    

Tích hợp nhà phát hành mã thông báo

Nhà phát hành mã thông báo tham chiếu là Chức năng đám mây Firebase được triển khai trong Node.js Chức năng này chỉ có thể được gọi bởi người dùng được xác thực. Trước khi triển khai ứng dụng, bạn phải thiết lập khóa riêng và chứng chỉ dùng để ký mã thông báo JWS.

  1. Điền vào tệp JSON có nội dung sau:
    {
        "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"
    }
    

    Chứng chỉ được sắp xếp với chứng chỉ thực thể cuối trước và chứng chỉ CA gốc ở cuối. Thời hạn hết hạn có thể tùy chỉnh và có thể được đặt thành thời lượng dài hơn nếu mã thông báo được phát hành mất một thời gian trước khi ứng dụng DRC có thể nhận và sử dụng mã thông báo đó. Việc thu hồi mã thông báo không được hỗ trợ.

  2. Tải cấu hình lên Firebase:
  3. $ firebase functions:config:set api_config="$(cat YOUR_CONFIG.json)"
    
  4. Triển khai chức năng Đám mây Firebase:
  5. $ firebase deploy --only functions
    
  6. Để quản lý và giám sát nhà phát hành mã thông báo của bạn, hãy xem Quản lý các tùy chọn thời gian chạy và triển khai chức năng .

Đặt giới hạn mặc định

Các hạn chế mặc định có thể được áp dụng trước lần khởi động đầu tiên. Thực hiện việc này với lớp phủ tài nguyên tĩnh để ghi đè các giá trị mặc định trong khung Android. Các hạn chế có thể được áp dụng tương ứng cho các loại người dùng khác nhau. Để tìm hiểu về các loại người dùng khác nhau, hãy xem Hỗ trợ nhiều người dùng .

Hạn chế mặc định cho người dùng hệ thống không có giao diện người dùng có thể được định cấu hình bằng mảng chuỗi config_defaultFirstUserRestrictions trong frameworks/base/core/res/res/values/config.xml . Việc đặt hạn chế này sẽ tự động tắt Cầu gỡ lỗi Android (ADB) cho đến khi hạn chế được xóa, ví dụ:

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

Các hạn chế mặc định đối với người dùng thông thường (ví dụ: tài xế và hành khách) và khách có thể được định cấu hình trong frameworks/base/core/res/res/xml/config_user_types.xml . Bạn có thể chồng các chuỗi này để đặt giới hạn mặc định cho từng loại người dùng tương ứng, ví dụ:

<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>