คู่มือการผสานรวมตัวควบคุมการดีบัก

ใช้คำแนะนำต่อไปนี้เพื่อรวม AAOS Debugging Restriction Controller (DRC)

รูปที่ 1. ตัวอย่างแอพ DRC

สถาปัตยกรรม

สถาปัตยกรรม DRC มีภาพประกอบด้านล่าง ส่วนประกอบที่แสดงเป็นสีแดง (ผู้ออกโทเค็นและตัวควบคุมการจำกัดการเปิดตัว) มีการใช้งานอ้างอิงที่คุณปรับแต่งได้

รูปที่ 2 สถาปัตยกรรม DRC

DRC คืออะไร?

ส่วนหัวของรถมีแอป DRC (ดูการใช้งานอ้างอิงใน packages/apps/Car/DebuggingRestrictionController ) แอปอ้างอิงประกอบด้วยตรรกะในการรับโทเค็นเพื่อการเข้าถึงจากผู้ออกโทเค็น ตรวจสอบความถูกต้องของโทเค็น จากนั้นใช้การเปลี่ยนแปลงข้อจำกัดการดีบักตามที่ระบุในโทเค็น ตรรกะประกอบด้วยองค์ประกอบ UX พื้นฐานที่ด้านข้างรถ

ผู้ออกโทเค็นคืออะไร?

นี่คือบริการเว็บที่ออกโทเค็นเพื่อการเข้าถึงที่เข้ารหัสด้วยการเข้ารหัส (ดูการใช้งานอ้างอิงใน packages/apps/Car/DebuggingRestrictionController/server ) บริการเว็บอ้างอิงเป็นฟังก์ชัน Firebase Cloud ที่ปรับใช้ได้ (หากต้องการเรียนรู้เพิ่มเติม โปรดดูที่ Cloud Functions for Firebase )

ข้อกำหนดเบื้องต้น

ก่อนที่คุณจะปรับใช้การอ้างอิง ตรวจสอบให้แน่ใจว่าได้ทำงานต่อไปนี้ให้เสร็จสิ้น

การเตรียมใบรับรองสำหรับการลงนามโทเค็นการเข้าถึง

ผู้ออกโทเค็นสร้าง JSON Web Signatures (JWS) เป็นโทเค็นการเข้าถึง เพื่อความเข้ากันได้ที่ดีที่สุด ผู้ออกเอกสารอ้างอิงจะสนับสนุนเฉพาะอัลกอริธึม RS256 (ลายเซ็น RSA ที่มี SHA256) เพื่ออำนวยความสะดวกในการหมุนเวียนคีย์ ให้ใช้สายใบรับรองแทนใบรับรองเดียวเพื่อลงนามในโทเค็นการเข้าถึง สายใบรับรองทั่วไปควรประกอบด้วยใบรับรอง CA รูท ใบรับรอง CA ระดับกลาง และใบรับรองเอนทิตีปลายทาง

ใบรับรองเอนทิตีปลายทางที่ลงนามในโทเค็น JWS นั้นไม่แตกต่างจากใบรับรอง TLS มาตรฐาน คุณสามารถซื้อใบรับรองจาก CA สาธารณะ เช่น DigiCert หรือดูแลห่วงโซ่ใบรับรองของคุณเองโดยใช้ใบรับรองรูท CA ที่ลงนามเองหรือโมดูลความปลอดภัยของฮาร์ดแวร์ ใบรับรองเอนทิตีปลายทางควรเป็นใบรับรอง X509v3 ที่มีส่วนขยาย Subject Alternative Name (SAN) ส่วนขยาย SAN มีตัวระบุ (เช่น ชื่อโฮสต์) ของผู้ออกโทเค็น สุดท้ายนี้ ควรเลือกใช้ใบรับรอง RSA มากกว่าใบรับรอง EC เนื่องจากผู้ออกโทเค็นรองรับเฉพาะ RS256 เท่านั้น

Google มีเชลล์สคริปต์สำหรับสร้างใบรับรองที่ลงนามเองใน packages/apps/Car/DebuggingRestrictionController/server/genkey.sh

การตั้งค่า Firebase

Token Issuer อ้างอิงใช้ Firebase Authentication และ Firebase Cloud Function

ในการตั้งค่าบัญชี Firebase ของคุณ:

  1. ในการสร้างโปรเจ็กต์ Firebase โปรดดูที่ เพิ่ม Firebase ให้กับโปรเจ็กต์ Android ของคุณ
  2. หากต้องการเปิดใช้งานตัวตรวจสอบความถูกต้องของ Firebase โปรดดู ที่ ฉันจะเริ่มต้นด้วยการตรวจสอบสิทธิ์ Firebase ที่ไหน .
  3. หากต้องการเพิ่มฟังก์ชัน Firebase Cloud ที่ว่างเปล่า โปรดดูที่ Get Started
  4. หากยังไม่ได้ดำเนินการ ให้ติดตั้ง Node.js, NPM และ Firebase Tools เพื่อคอมไพล์และปรับใช้ Token Issuer

การรวมแอพ DRC

แอป DRC อ้างอิงอยู่ใน packages/apps/Car/DebuggingRestrictionController แอปสามารถสร้าง รวม ใน AOSP กับ Soong หรือ เลิก รวมกลุ่มกับ Gradle

ชุดบิลด์

ในการสร้างแอพรวม:

  1. คัดลอก applicationId , projectId และ apiKey จาก google-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 จะเชื่อถือเฉพาะใบรับรองรูท CA ที่เข้ารหัส PEM ที่ระบุใน ROOT_CA_CERT
    • TOKEN_ISSUER_API_NAME เป็นชื่อของฟังก์ชัน Firebase Cloud และควรตรงกับฟังก์ชัน Cloud ที่คุณสร้างไว้ก่อนหน้าในคอนโซล Firebase
    • TOKEN_ISSUER_HOSTNAME ควรตรงกับชื่อทางเลือกของหัวเรื่องในใบรับรองเอนทิตีปลายทางที่จะลงนามในโทเค็นการเข้าถึง
    • DRC_TEST_EMAIL และ DRC_TEST_PASSWORD เป็นข้อมูลรับรองสำหรับบัญชีทดสอบที่ไม่บังคับ ซึ่งสามารถจัดเตรียมไว้ล่วงหน้าใน Firebase หากคุณเปิดใช้งานการลงชื่อเข้าใช้ด้วยอีเมล/รหัสผ่าน สิ่งเหล่านี้ใช้สำหรับการทดสอบด้วยเครื่องมือเท่านั้น

แอปได้รับการกำหนดค่าให้ใช้บัญชี Firebase และใบรับรองของคุณแล้ว ใน Android 9 ขึ้นไป คุณต้องตั้งค่า Privileged Permission Allowlisting รายการที่อนุญาตต้องมีอย่างน้อย 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 : พาธไปยังใบรับรองรูท CA ที่เข้ารหัส PEM
    • $TOKEN_ISSUER_API_NAME : ชื่อของฟังก์ชัน Firebase Cloud;
    • $TOKEN_ISSUER_HOST_NAME : SAN ในใบรับรอง;
    • $DRC_TEST_EMAIL และ $DRC_TEST_EMAI L: ข้อมูลประจำตัวสำหรับบัญชีทดสอบ การดีบักบิลด์เท่านั้น
  6. ในการสร้างแอปด้วย Gradle ให้เรียกใช้คำสั่งดังนี้:
    $ ./gradlew build
    

การรวมผู้ออกโทเค็น

ผู้ออกโทเค็นอ้างอิงคือฟังก์ชัน Firebase Cloud ที่ใช้งานใน Node.js ฟังก์ชันนี้สามารถเรียกได้โดยผู้ใช้ที่ตรวจสอบสิทธิ์เท่านั้น ก่อนทำให้แอปใช้งานได้ คุณต้องตั้งค่าคีย์ส่วนตัวและใบรับรองที่ใช้ในการลงนามโทเค็น 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 Cloud:
  5. $ firebase deploy --only functions
    
  6. ในการจัดการและตรวจสอบ Token Issuer ของคุณ โปรดดูที่ จัดการตัวเลือกการปรับใช้ฟังก์ชันและรันไทม์

การตั้งค่าข้อจำกัดเริ่มต้น

ข้อจำกัดเริ่มต้นสามารถใช้ได้ก่อนการบู๊ตครั้งแรก ทำสิ่งนี้ด้วยการซ้อนทับทรัพยากรแบบคงที่เพื่อแทนที่ค่าเริ่มต้นในกรอบงาน Android ข้อจำกัดสามารถนำไปใช้กับผู้ใช้ประเภทต่างๆ ได้ตามลำดับ หากต้องการเรียนรู้เกี่ยวกับผู้ใช้ประเภทต่างๆ โปรดดู การสนับสนุนผู้ใช้หลาย คน

ข้อจำกัดดีฟอลต์สำหรับ ผู้ใช้ระบบ headless สามารถกำหนดค่าด้วย config_defaultFirstUserRestrictions string-array ใน frameworks/base/core/res/res/values/config.xml การตั้งค่าข้อจำกัดนี้จะปิดใช้งาน Android Debug Bridge (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>