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

Hãy làm theo hướng dẫn trên trang này để tích hợp Trình điều khiển hạn chế gỡ lỗi AAOS (DRC).

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

Kiến trúc

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

Hình 2. Cấu trúc DRC.

DRC là gì?

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

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

Đây là một 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à một hàm Firebase trên đám mây có thể triển khai (để tìm hiểu thêm, hãy xem phần Hàm trên đám mây cho Firebase).

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

Trước khi triển khai phương thức triển khai tham chiếu, hãy nhớ hoàn thành các nhiệm vụ sau.

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

Bên phát hành mã thông báo tạo Chữ ký web JSON (JWS) dưới dạng mã thông báo truy cập. Để đảm bảo khả năng tương thích tối ưu, trình phát hành tham chiếu chỉ hỗ trợ thuật toán RS256 (chữ ký RSA với SHA256). Để hỗ trợ tính năng xoay vòng khoá, 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. Một chuỗi chứng chỉ thông thường 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ó tiện ích Tên thay thế của đối tượng (SAN). Tiện ích SAN chứa giá trị nhận dạng (ví dụ: tên máy chủ) của tổ chức phát hành mã thông báo. Cuối cùng, bạn nên sử dụng chứng chỉ RSA thay vì chứng chỉ EC vì trình phát hành mã thông báo chỉ hỗ trợ RS256.

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

Thiết lập Firebase

Bên phát hành mã thông báo tham chiếu sử dụng Firebase AuthenticationHàm trên đám mây Firebase.

Cách thiết lập tài khoản Firebase:

  1. Để tạo dự án Firebase, hãy xem bài viết Thêm Firebase vào dự án Android.
  2. Để bật một số trình xác thực Firebase, hãy xem phần Tôi nên bắt đầu từ đâu với tính năng Xác thực Firebase?.
  3. Để thêm một hàm Firebase Cloud trống, hãy xem phần Bắt đầu.
  4. Nếu bạn chưa cài đặt, hãy cài đặt các công cụ Node.js, NPM và Firebase để biên dịch và triển khai trì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. Bạn có thể tạo ứng dụng được đóng gói trong AOSP bằng Soong hoặc không đóng gói bằng Gradle.

Bản dựng theo gói

Cách tạo ứng dụng theo gói:

  1. Sao chép applicationId, projectIdapiKey từ google-services.json vào packages/apps/Car/DebuggingRestrictionController/soong/FirebaseApplication.java. Việc này 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 có sử dụng chứng chỉ CA gốc tự ký hay không. Nếu được bật, ứng dụng DRC chỉ tin tưởng chứng chỉ CA gốc được mã hoá PEM được chỉ định trong ROOT_CA_CERT.
    • TOKEN_ISSUER_API_NAME là tên của hàm trên đám mây Firebase và phải khớp với hàm trên đám mây mà bạn đã tạo trước đó trong Bảng điều khiển của Firebase.
    • TOKEN_ISSUER_HOSTNAME phải khớp với Tên thay thế của 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 một tài khoản thử nghiệm không bắt buộc. Bạn có thể cấp trước thông tin này trong Firebase nếu đã bật tính năng Đăng nhập bằng email/Mật khẩu. Các phương thức này chỉ dùng cho kiểm thử đo lường.

Ứ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. Trên Android 9 trở lên, bạn phải thiết lập danh sách cho phép quyền đặ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 không theo gói

Các bản dựng DRC chưa được phân tách sử dụng Gradle để biên dịch ứng dụng.

Cách tạo bản dựng không theo gói:

  1. Xác nhận rằng bạn đã cài đặt SDK Android.
  2. Tạo một 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 sẽ 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. Cũng như với các bản dựng đi kèm, bạn phải chỉ định:
    • $TOKEN_USES_SELF_SIGNED_CA: đúng hoặc sai;
    • $ROOT_CA_CERT: đường dẫn đến chứng chỉ CA gốc được mã hoá PEM;
    • $TOKEN_ISSUER_API_NAME: tên của hàm Firebase Cloud;
    • $TOKEN_ISSUER_HOST_NAME: SAN trong chứng chỉ;
    • $DRC_TEST_EMAIL$DRC_TEST_EMAIL: thông tin xác thực cho tài khoản thử nghiệm, chỉ dành cho bản gỡ lỗi.
  6. Để tạo ứng dụng bằng Gradle, hãy chạy lệnh như sau:
    $ ./gradlew build

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

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

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

    Các chứng chỉ được sắp xếp theo thứ tự chứng chỉ thực thể cuối trước và chứng chỉ CA gốc ở cuối. Bạn có thể tuỳ chỉnh và đặt khoảng thời gian hết hạn lâu hơn nếu một mã thông báo đã phát hành cần một khoảng thời gian trước khi ứng dụng DRC có thể nhận và sử dụng mã thông báo đó. Chúng tôi không hỗ trợ việc thu hồi mã thông báo.

  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 hàm trên đám mây Firebase:
  5. $ firebase deploy --only functions
  6. Để quản lý và theo dõi trình phát hành mã thông báo, hãy xem phần Quản lý các tuỳ chọn triển khai và thời gian chạy của hàm.

Đặt các quy định hạn chế mặc định

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

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

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

Bạn có thể định cấu hình các hạn chế mặc định cho người dùng thông thường (ví dụ: tài xế và hành khách) và khách trong frameworks/base/core/res/res/xml/config_user_types.xml. Bạn có thể phủ các chuỗi này để đặt các quy định hạn chế mặc định cho từng loại người dù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>