อัปเดตระบบแบบไดนามิก

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

ข้อกำหนดของเคอร์เนล

โปรดดู การใช้งานพาร์ติชันแบบไดนามิก ตามข้อกำหนดของเคอร์เนล

นอกจากนี้ DSU ยังต้องอาศัยฟีเจอร์เคอร์เนล device-mapper-verity (dm-verity) ด้วย เพื่อยืนยันอิมเมจของระบบ Android คุณจึงต้องเปิดใช้งานเคอร์เนลต่อไปนี้ การกำหนดค่า:

  • CONFIG_DM_VERITY=y
  • CONFIG_DM_VERITY_FEC=y

ข้อกำหนดการแบ่งพาร์ติชัน

ตั้งแต่ Android 11 เป็นต้นไป DSU ต้องใช้ /data เพื่อใช้ระบบไฟล์ F2FS หรือ ext4 F2FS ให้ประสิทธิภาพที่ดีกว่าและ ที่แนะนำ แต่ความแตกต่างจะยังไม่มีนัยสำคัญ

นี่คือตัวอย่างระยะเวลาที่ใช้การอัปเดตระบบแบบไดนามิกกับ Pixel อุปกรณ์:

  • กรณีที่ใช้ F2FS
    • 109, ผู้ใช้ 8G, ระบบ 867M, ประเภทระบบไฟล์: F2FS: การเข้ารหัส=aes-256-xts:aes-256-cts
    • 104s, ผู้ใช้ 8G, ระบบ 867M, ประเภทระบบไฟล์: F2FS: encrypted=ice
  • การใช้ ext4
    • 135 วินาที, ผู้ใช้ 8G, ระบบ 867 ล้าน, ประเภทระบบไฟล์: ext4: การเข้ารหัส=aes-256-xts:aes-256-cts

หากใช้เวลานานกว่านั้นมากบนแพลตฟอร์ม คุณอาจต้องตรวจสอบว่าตัวยึด แฟล็กมีแฟล็กที่ทำให้การเขียน "ซิงค์" หรือคุณจะระบุเป็น "async" ก็ได้ แจ้งอย่างชัดเจนเพื่อให้ได้ประสิทธิภาพที่ดีขึ้น

ต้องใช้พาร์ติชัน metadata (16 MB ขึ้นไป) เพื่อจัดเก็บข้อมูลที่เกี่ยวข้องกับ กับอิมเมจที่ติดตั้ง ต้องต่อเชื่อมระหว่างการต่อเชื่อมขั้นตอนแรก

พาร์ติชัน userdata ต้องใช้ระบบไฟล์ F2FS หรือ ext4 เมื่อใช้ F2FS รวมแพตช์ทั้งหมดที่เกี่ยวข้องกับ F2FS ที่มีอยู่ใน เคอร์เนลทั่วไปของ Android

DSU ได้รับการพัฒนาและทดสอบโดยใช้เคอร์เนล/common 4.9 ขอแนะนำให้ใช้ เคอร์เนล 4.9 ขึ้นไปสำหรับฟีเจอร์นี้

ลักษณะการทำงานของ HAL ของผู้ให้บริการ

HAL ของ Weaver

HAL ของ Weaver มีจำนวนช่องคงที่สำหรับจัดเก็บคีย์ผู้ใช้ DSU จะใช้สล็อตคีย์เพิ่มเติม 2 ช่อง หาก OEM มี HAL สำหรับช่างทอ ผลิตภัณฑ์นั้นต้องมี เพียงพอสำหรับอิมเมจระบบทั่วไป (GSI) และอิมเมจโฮสต์

HAL ผู้รักษาประตู

HAL ของผู้รับสายแทนต้องมีลักษณะดังนี้ รองรับค่า USER_ID ที่มีขนาดใหญ่ เนื่องจาก GSI จะชดเชย UID เป็น HAL โดยใช้ +1000000

ยืนยันการเปิดเครื่อง

หากต้องการรองรับการเปิดเครื่องอิมเมจ GSI สำหรับนักพัฒนาซอฟต์แวร์ ในสถานะล็อกอยู่โดยไม่ต้องปิดใช้ การเปิดเครื่องที่ได้รับการยืนยัน รวมถึงคีย์ GSI ของนักพัฒนาซอฟต์แวร์ด้วยการเพิ่มบรรทัดต่อไปนี้ ลงในไฟล์ device/<device_name>/device.mk:

$(call inherit-product, $(SRC_TARGET_DIR)/product/developer_gsi_keys.mk)

การป้องกันแบบย้อนกลับ

เมื่อใช้ DSU อิมเมจระบบ Android ที่ดาวน์โหลดต้องใหม่กว่า อิมเมจระบบปัจจุบันในอุปกรณ์ ซึ่งทำโดยการเปรียบเทียบแพตช์ด้านความปลอดภัย ใน การเปิดเครื่องที่ได้รับการยืนยันจาก Android (AVB) ข้อบ่งชี้พร็อพเพอร์ตี้ AVB ของอิมเมจระบบทั้ง 2 รายการ: Prop: com.android.build.system.security_patch -> '2019-04-05'

สำหรับอุปกรณ์ที่ไม่ได้ใช้ AVB ให้วางระดับแพตช์ความปลอดภัยของระบบปัจจุบัน ลงในเคอร์เนล cmdline หรือ Bootconfig ด้วย Bootloader androidboot.system.security_patch=2019-04-05

ข้อกำหนดเกี่ยวกับฮาร์ดแวร์

เมื่อคุณเปิดใช้งานอินสแตนซ์ DSU ระบบจะจัดสรรไฟล์ชั่วคราว 2 ไฟล์ ได้แก่

  • พาร์ติชันเชิงตรรกะที่จะจัดเก็บ GSI.img (1~1.5 G)
  • พาร์ติชัน /data ที่ว่างเปล่าขนาด 8 GB เป็นแซนด์บ็อกซ์สำหรับการเรียกใช้ GSI

เราขอแนะนำให้จองพื้นที่ว่างอย่างน้อย 10 GB ก่อนเปิดตัว DSU อินสแตนซ์ DSU ยังรองรับการจัดสรรจากการ์ด SD ด้วย เมื่อการ์ด SD ที่มีลำดับความสำคัญสูงสุดในการจัดสรร การรองรับการ์ด SD คือ สำคัญอย่างยิ่งสำหรับอุปกรณ์พลังงานต่ำซึ่งอาจมีที่จัดเก็บข้อมูลภายในไม่เพียงพอ เมื่อมีการ์ด SD โปรดตรวจสอบว่าไม่มีการใช้การ์ด SD ดังกล่าว DSU ไม่รองรับ การ์ด SD มาใช้

ฟรอนท์เอนด์ที่ใช้ได้

คุณเปิดใช้งาน DSU โดยใช้ adb, แอป OEM หรือตัวโหลด DSU แบบคลิกเดียว (ใน Android 11 ขึ้นไป)

เรียกใช้ DSU โดยใช้ adb

หากต้องการเปิดใช้งาน DSU โดยใช้ adb ให้ป้อนคำสั่งต่อไปนี้

$ simg2img out/target/product/.../system.img system.raw
$ gzip -c system.raw > system.raw.gz
$ adb push system.raw.gz /storage/emulated/0/Download
$ adb shell am start-activity \
-n com.android.dynsystem/com.android.dynsystem.VerificationActivity  \
-a android.os.image.action.START_INSTALL    \
-d file:///storage/emulated/0/Download/system.raw.gz  \
--el KEY_SYSTEM_SIZE $(du -b system.raw|cut -f1)  \
--el KEY_USERDATA_SIZE 8589934592

เปิดใช้งาน DSU โดยใช้แอป

จุดแรกเข้าหลักไปยัง DSU คือ android.os.image.DynamicSystemClient.java API:

public class DynamicSystemClient {


...
...

     /**
     * Start installing DynamicSystem from URL with default userdata size.
     *
     * @param systemUrl A network URL or a file URL to system image.
     * @param systemSize size of system image.
     */
    public void start(String systemUrl, long systemSize) {
        start(systemUrl, systemSize, DEFAULT_USERDATA_SIZE);
    }

คุณต้องรวม/ติดตั้งแอปนี้ล่วงหน้าในอุปกรณ์ เพราะ DynamicSystemClient เป็น API ระบบ คุณไม่สามารถสร้างแอปด้วย API ปกติ คุณจึงไม่สามารถเผยแพร่ SDK API ใน Google Play ได้ วัตถุประสงค์ของแอปนี้คือ

  1. ดึงข้อมูลรายการรูปภาพและ URL ที่เกี่ยวข้องซึ่งมีรูปแบบที่ผู้ให้บริการกำหนด
  2. จับคู่รูปภาพในรายการกับอุปกรณ์และแสดงรูปภาพที่เข้ากันได้ เพื่อให้ผู้ใช้เลือก
  3. เรียกใช้ DynamicSystemClient.start ดังนี้:

    DynamicSystemClient aot = new DynamicSystemClient(...)
       aot.start(
            ...URL of the selected image...,
            ...uncompressed size of the selected image...);
    

URL จะชี้ไปยังไฟล์ภาพระบบที่มี gzip และไม่มีขนาดเล็ก ซึ่งคุณสามารถสร้างได้ ด้วยคำสั่งต่อไปนี้

$ simg2img ${OUT}/system.img ${OUT}/system.raw
$ gzip ${OUT}/system.raw
$ ls ${OUT}/system.raw.gz

ชื่อไฟล์ควรเป็นไปตามรูปแบบนี้

<android version>.<lunch name>.<user defined title>.raw.gz

ตัวอย่าง

  • o.aosp_taimen-userdebug.2018dev.raw.gz
  • p.aosp_taimen-userdebug.2018dev.raw.gz

ตัวโหลด DSU แบบคลิกเดียว

Android 11 ขอแนะนำโปรแกรมโหลด DSU แบบคลิกเดียว เป็นฟรอนท์เอนด์ในการตั้งค่าสำหรับนักพัฒนาซอฟต์แวร์

การเปิดตัวตัวโหลด DSU

รูปที่ 1 การเปิดตัวตัวโหลด DSU

เมื่อนักพัฒนาซอฟต์แวร์คลิกปุ่ม DSU Loader นักพัฒนาซอฟต์แวร์จะดึงข้อมูล ข้อบ่งชี้ JSON ของ DSU จากเว็บและแสดงรูปภาพที่เกี่ยวข้องทั้งหมดใน เมนูแบบลอย เลือกอิมเมจเพื่อเริ่มการติดตั้ง DSU และความคืบหน้า จะแสดงบนแถบการแจ้งเตือน

ความคืบหน้าในการติดตั้งอิมเมจ DSU

รูปที่ 2 ความคืบหน้าในการติดตั้งอิมเมจ DSU

โดยค่าเริ่มต้น ตัวโหลด DSU จะโหลดข้อบ่งชี้ JSON ที่มีอิมเมจ GSI ส่วนต่อไปนี้จะแสดงวิธีสร้างแพ็กเกจ DSU ที่ลงนามโดย OEM และโหลด จากตัวโหลด DSU

แฟล็กฟีเจอร์

ฟีเจอร์ DSU อยู่ภายใต้แฟล็กฟีเจอร์ settings_dynamic_android ก่อน เมื่อใช้ DSU ให้ตรวจสอบว่ามีการเปิดใช้แฟล็กฟีเจอร์ที่เกี่ยวข้อง

เปิดใช้การตั้งค่าสถานะฟีเจอร์

รูปที่ 3 การเปิดใช้งานแฟล็กฟีเจอร์

UI แฟล็กฟีเจอร์อาจไม่พร้อมใช้งานในอุปกรณ์ที่ใช้บิลด์ผู้ใช้ ใน ในกรณีนี้ ให้ใช้คำสั่ง adb แทน

$ adb shell setprop persist.sys.fflag.override.settings_dynamic_system 1

อิมเมจระบบโฮสต์ของผู้ให้บริการบน GCE (ไม่บังคับ)

ตำแหน่งจัดเก็บรูปภาพระบบที่ใช้ได้ประการหนึ่งคือ ที่เก็บข้อมูล Compute Engine (GCE) ผู้ดูแลระบบรุ่นจะใช้ คอนโซลพื้นที่เก็บข้อมูล GCP ไปยัง เพิ่ม/ลบ/เปลี่ยนอิมเมจระบบที่เผยแพร่

รูปภาพต้องเป็นการเข้าถึงแบบสาธารณะ ตามที่แสดงอยู่ด้านล่าง

การเข้าถึงแบบสาธารณะใน GCE

รูปที่ 4 การเข้าถึงแบบสาธารณะใน GCE

ขั้นตอนในการทำให้รายการเป็นสาธารณะมีอยู่ใน เอกสารประกอบของ Google Cloud

DSU แบบแบ่งพาร์ติชันในไฟล์ ZIP

ตั้งแต่ Android 11 เป็นต้นไป DSU จะมี URL มากกว่า 1 รายการ พาร์ติชัน ตัวอย่างเช่น อาจมี product.img นอกเหนือจาก system.img เมื่ออุปกรณ์เปิดเครื่อง ขั้นแรก init จะตรวจหา ติดตั้งพาร์ติชัน DSU และแทนที่พาร์ติชันในอุปกรณ์ชั่วคราวเมื่อ DSU ที่ติดตั้งไว้เปิดใช้งานอยู่ แพ็กเกจ DSU อาจมีพาร์ติชันที่ไม่มี มีพาร์ติชันที่เกี่ยวข้องในอุปกรณ์

กระบวนการ DSU ที่มีหลายพาร์ติชัน

รูปที่ 5 กระบวนการ DSU ที่มีหลายพาร์ติชัน

DSU แบบ OEM

เพื่อให้รูปภาพทั้งหมดที่เรียกใช้บนอุปกรณ์ได้รับอนุญาตจากอุปกรณ์ สำหรับผู้ผลิต รูปภาพทั้งหมดในแพ็กเกจ DSU จะต้องมีการเซ็นชื่อ ตัวอย่างเช่น สมมติว่ามีแพ็กเกจ DSU ที่มีอิมเมจพาร์ติชัน 2 รายการดังตัวอย่างต่อไปนี้

dsu.zip {
    - system.img
    - product.img
}

ทั้ง system.img และ product.img ต้องลงนามโดยคีย์ OEM ก่อน ไว้ในไฟล์ ZIP แนวทางปฏิบัติทั่วไปคือการใช้อสมมาตร เช่น RSA ซึ่งจะใช้คีย์ลับในการลงนามแพ็กเกจ ระบบจะใช้คีย์สาธารณะในการยืนยัน ramdisk ขั้นตอนแรกต้องมีการแยก คีย์สาธารณะ เช่น /avb/*.avbpubkey หากอุปกรณ์ใช้ AVB อยู่แล้ว ระบบจะ ขั้นตอนการลงนามเดิมก็เพียงพอแล้ว ส่วนต่อไปนี้แสดงให้เห็นถึง ขั้นตอนการลงนามและไฮไลต์ตำแหน่งของคีย์ผู้เผยแพร่โฆษณา AVB ที่ใช้เพื่อ ให้ยืนยันภาพในแพ็กเกจ DSU

ข้อบ่งชี้ JSON ของ DSU

ข้อบ่งชี้ JSON ของ DSU จะอธิบายแพ็กเกจ DSU รองรับ 2 แบบพื้นฐาน ประการแรก ค่าพื้นฐาน include จะมีข้อบ่งชี้ JSON หรือการเปลี่ยนเส้นทางเพิ่มเติม ตัวโหลด DSU ไปยังตำแหน่งใหม่ เช่น

{
    "include": ["https://.../gsi-release/gsi-src.json"]
}

ประการที่ 2 จะใช้ image Primitive เพื่ออธิบายแพ็กเกจ DSU ที่เปิดตัว ภายใน รูปภาพแบบดั้งเดิมมีแอตทริบิวต์หลายรายการดังนี้

  • แอตทริบิวต์ name และ details เป็นสตริงที่แสดงใน กล่องโต้ตอบเพื่อให้ผู้ใช้เลือก

  • ระบบใช้แอตทริบิวต์ cpu_api, vndk และ os_version สำหรับ การตรวจสอบความเข้ากันได้ ซึ่งอธิบายไว้ในส่วนถัดไป

  • แอตทริบิวต์ pubkey (ไม่บังคับ) จะระบุสาธารณะ ที่จับคู่กับคีย์ลับที่ใช้ในการลงนามแพ็กเกจ DSU เมื่อระบุไว้ บริการ DSU จะตรวจสอบได้ว่าอุปกรณ์มีคีย์หรือไม่ ที่ใช้ในการยืนยันแพ็กเกจ DSU การดำเนินการนี้จะช่วยให้หลีกเลี่ยงการติดตั้ง DSU ที่ไม่รู้จัก เช่น การติดตั้ง DSU ที่ลงชื่อโดย OEM-A ในอุปกรณ์ที่สร้างโดย OEM-B

  • แอตทริบิวต์ tos (ไม่บังคับ) จะชี้ไปยังไฟล์ข้อความที่อธิบาย ข้อกำหนดในการให้บริการสำหรับแพ็กเกจ DSU ที่เกี่ยวข้อง เมื่อนักพัฒนาซอฟต์แวร์ เลือกแพ็กเกจ DSU ที่มีแอตทริบิวต์ข้อกำหนดในการให้บริการระบุไว้ กล่องโต้ตอบที่แสดงในรูปที่ 6 เปิดขึ้น และขอให้นักพัฒนาซอฟต์แวร์ยอมรับข้อกำหนด ก่อนการติดตั้งแพ็กเกจ DSU

    กล่องโต้ตอบข้อกำหนดในการให้บริการ

    รูปที่ 6 กล่องโต้ตอบข้อกำหนดในการให้บริการ

สำหรับการอ้างอิง โปรดดูข้อบ่งชี้ JSON ของ DSU สำหรับ GSI ดังต่อไปนี้

{
   "images":[
      {
         "name":"GSI+GMS x86",
         "os_version":"10",
         "cpu_abi": "x86",
         "details":"exp-QP1A.190711.020.C4-5928301",
         "vndk":[
            27,
            28,
            29
         ],
         "pubkey":"",
         "tos": "https://dl.google.com/developers/android/gsi/gsi-tos.txt",
         "uri":"https://.../gsi/gsi_gms_x86-exp-QP1A.190711.020.C4-5928301.zip"
      },
      {
         "name":"GSI+GMS ARM64",
         "os_version":"10",
         "cpu_abi": "arm64-v8a",
         "details":"exp-QP1A.190711.020.C4-5928301",
         "vndk":[
            27,
            28,
            29
         ],
         "pubkey":"",
         "tos": "https://dl.google.com/developers/android/gsi/gsi-tos.txt",
         "uri":"https://.../gsi/gsi_gms_arm64-exp-QP1A.190711.020.C4-5928301.zip"
      },
      {
         "name":"GSI ARM64",
         "os_version":"10",
         "cpu_abi": "arm64-v8a",
         "details":"exp-QP1A.190711.020.C4-5928301",
         "vndk":[
            27,
            28,
            29
         ],
         "pubkey":"",
         "uri":"https://.../gsi/aosp_arm64-exp-QP1A.190711.020.C4-5928301.zip"
      },
      {
         "name":"GSI x86_64",
         "os_version":"10",
         "cpu_abi": "x86_64",
         "details":"exp-QP1A.190711.020.C4-5928301",
         "vndk":[
            27,
            28,
            29
         ],
         "pubkey":"",
         "uri":"https://.../gsi/aosp_x86_64-exp-QP1A.190711.020.C4-5928301.zip"
      }
   ]
}

การจัดการความเข้ากันได้

ใช้แอตทริบิวต์หลายรายการเพื่อระบุความเข้ากันได้ระหว่างแพ็กเกจ DSU และอุปกรณ์ภายใน

  • cpu_api คือสตริงที่อธิบายสถาปัตยกรรมของอุปกรณ์ แอตทริบิวต์นี้ เป็นรายการบังคับและนำมาเปรียบเทียบกับพร็อพเพอร์ตี้ระบบ ro.product.cpu.abi ค่าของเมตริกจะต้องตรงกันทั้งหมด

  • os_version คือจำนวนเต็มที่ไม่บังคับซึ่งระบุรุ่น Android สำหรับ เช่น สำหรับ Android 10 os_version คือ 10 และ สำหรับ Android 11 ราคา os_version คือ 11 เมื่อใด มีการระบุแอตทริบิวต์แล้ว ค่าดังกล่าวต้องเท่ากับหรือมากกว่า ro.system.build.version.release พร็อพเพอร์ตี้ของระบบ การตรวจสอบนี้ใช้เพื่อป้องกันการเปิดเครื่องอิมเมจ GSI ของ Android 10 ใน Android 11 อุปกรณ์ของผู้ให้บริการ ซึ่งยังไม่รองรับในขณะนี้ อนุญาตให้เปิดเครื่องอิมเมจ GSI ของ Android 11 ในอุปกรณ์ Android 10

  • vndk เป็นอาร์เรย์ที่ไม่บังคับที่ระบุ VNDK ทั้งหมดที่รวมอยู่ใน แพ็กเกจ DSU เมื่อระบุไว้ ตัวโหลด DSU จะตรวจสอบว่าหมายเลข ที่ดึงข้อมูลจากพร็อพเพอร์ตี้ระบบ ro.vndk.version รวมอยู่

เพิกถอนคีย์ DSU เพื่อความปลอดภัย

ในกรณีที่พบไม่บ่อยนักเมื่อคู่คีย์ RSA ที่ใช้ในการลงนามรูปภาพ DSU คือ ถูกโจมตี ควรอัปเดต RAM โดยเร็วที่สุดเพื่อนำ คีย์ที่ถูกบุกรุก นอกจากการอัปเดตพาร์ติชันการเปิดเครื่องแล้ว คุณยังบล็อก คีย์ที่ถูกบุกรุกโดยใช้รายการยกเลิกคีย์ DSU (รายการที่ไม่อนุญาตของคีย์) จาก HTTPS URL

รายการเพิกถอนคีย์ DSU มีรายการคีย์สาธารณะ AVB ที่เพิกถอนแล้ว ในระหว่างการติดตั้ง DSU ระบบจะตรวจสอบคีย์สาธารณะภายในอิมเมจ DSU ในรายการเพิกถอน หากพบว่ารูปภาพมีสาธารณะที่ถูกเพิกถอน ขั้นตอนการติดตั้ง DSU จะหยุดลง

URL รายการยกเลิกคีย์ควรเป็น URL แบบ HTTPS เพื่อให้มีความปลอดภัย ความรัดกุม และมีการระบุไว้ในสตริงทรัพยากร:

frameworks/base/packages/DynamicSystemInstallationService/res/values/strings.xml@key_revocation_list_url

ค่าของสตริงคือ https://dl.google.com/developers/android/gsi/gsi-keyblacklist.json ซึ่งเป็น รายการเพิกถอนสำหรับคีย์ GSI ที่ Google เปิดตัว สตริงแหล่งข้อมูลนี้สามารถเป็น ซ้อนทับและกำหนดเอง เพื่อให้ OEM ที่ใช้ฟีเจอร์ DSU สามารถมอบและ ในรายการที่ไม่อนุญาตคีย์ของตัวเอง วิธีนี้จะช่วยให้ OEM บล็อก คีย์สาธารณะบางรายการโดยไม่อัปเดตอิมเมจ RAM ของอุปกรณ์

รูปแบบของรายการเพิกถอนมีดังนี้

{
   "entries":[
      {
         "public_key":"bf14e439d1acf231095c4109f94f00fc473148e6",
         "status":"REVOKED",
         "reason":"Key revocation test key"
      },
      {
         "public_key":"d199b2f29f3dc224cca778a7544ea89470cbef46",
         "status":"REVOKED",
         "reason":"Key revocation test key"
      }
   ]
}
  • public_key คือไดเจสต์ SHA-1 ของคีย์ที่เพิกถอนในรูปแบบที่อธิบาย ในการสร้างคีย์ผู้เผยแพร่โฆษณา AVB
  • status ระบุสถานะการเพิกถอนของคีย์ ปัจจุบันมีเพียงเครือข่ายเดียว ค่าที่รองรับคือ REVOKED
  • reason เป็นสตริงที่ไม่บังคับซึ่งอธิบายเหตุผลของการเพิกถอน

กระบวนการของ DSU

ส่วนนี้อธิบายถึงขั้นตอนการกำหนดค่า DSU หลายๆ แบบ

สร้างคู่คีย์ใหม่

ใช้คำสั่ง openssl เพื่อสร้างคู่คีย์ส่วนตัว/คีย์สาธารณะ RSA ใน .pem รูปแบบ (เช่น ขนาด 2048 บิต)

$ openssl genrsa -out oem_cert_pri.pem 2048
$ openssl rsa -in oem_cert_pri.pem -pubout -out oem_cert_pub.pem

คีย์ส่วนตัวอาจเข้าถึงไม่ได้และเก็บไว้ใน โมดูลความปลอดภัยฮาร์ดแวร์ (HSM) ในกรณีนี้ อาจมีใบรับรองคีย์สาธารณะ x509 อยู่หลังคีย์ รุ่นใหม่ ดูการเพิ่มคีย์การจับคู่ไปยัง ramdisk สำหรับวิธีการสร้างคีย์สาธารณะ AVB จากใบรับรอง x509

วิธีแปลงใบรับรอง x509 เป็นรูปแบบ PEM

$ openssl x509 -pubkey -noout -in oem_cert_pub.x509.pem > oem_cert_pub.pem

โปรดข้ามขั้นตอนนี้หากใบรับรองเป็นไฟล์ PEM อยู่แล้ว

เพิ่ม pubkey การจับคู่ไปยัง RAM

oem_cert.avbpubkey ต้องอยู่ภายใต้ /avb/*.avbpubkey เพื่อยืนยัน แพ็กเกจ DSU ที่ลงชื่อแล้ว ก่อนอื่น ให้แปลงคีย์สาธารณะในรูปแบบ PEM เป็น AVB สาธารณะ รูปแบบคีย์:

$ avbtool extract_public_key --key oem_cert_pub.pem --output oem_cert.avbpubkey

จากนั้นจึงรวมคีย์สาธารณะใน RAM ขั้นตอนแรกตามขั้นตอนต่อไปนี้

  1. เพิ่มโมดูลที่สร้างไว้ล่วงหน้าเพื่อคัดลอก avbpubkey เช่น เพิ่ม device/<company>/<board>/oem_cert.avbpubkey และ device/<company>/<board>/avb/Android.mk ที่มีเนื้อหาลักษณะนี้:

    include $(CLEAR_VARS)
    
    LOCAL_MODULE := oem_cert.avbpubkey
    LOCAL_MODULE_CLASS := ETC
    LOCAL_SRC_FILES := $(LOCAL_MODULE)
    ifeq ($(BOARD_USES_RECOVERY_AS_BOOT),true)
    LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/first_stage_ramdisk/avb
    else
    LOCAL_MODULE_PATH := $(TARGET_RAMDISK_OUT)/avb
    endif
    
    include $(BUILD_PREBUILT)
    
  2. ทำให้เป้าหมาย Droidcore ขึ้นอยู่กับ oem_cert.avbpubkey ที่เพิ่มขึ้น:

    droidcore: oem_cert.avbpubkey
    

สร้างแอตทริบิวต์ AVB pubkey ในข้อบ่งชี้ JSON

oem_cert.avbpubkey อยู่ในรูปแบบไบนารีคีย์สาธารณะ AVB ใช้ SHA-1 เพื่อ ทำให้อ่านได้ก่อนที่จะใส่ลงในข้อบ่งชี้ JSON ดังนี้

$ sha1sum oem_cert.avbpubkey | cut -f1 -d ' '
3e62f2be9d9d813ef5........866ac72a51fd20

ตัวแปรนี้จะเป็นเนื้อหาของแอตทริบิวต์ pubkey ของข้อบ่งชี้ JSON

   "images":[
      {
         ...
         "pubkey":"3e62f2be9d9d813ef5........866ac72a51fd20",
         ...
      },

ลงนามในแพ็กเกจ DSU

ใช้วิธีใดวิธีหนึ่งต่อไปนี้เพื่อลงนามในแพ็กเกจ DSU

  • วิธีที่ 1: นําอาร์ติแฟกต์ที่สร้างโดยกระบวนการลงนาม AVB ต้นฉบับมาใช้ซ้ำเพื่อ สร้างแพ็กเกจ DSU อีกวิธีหนึ่งคือการดึงข้อมูล รูปภาพจากแพ็กเกจการเผยแพร่และใช้รูปภาพที่ดึงมาเพื่อสร้างไฟล์ ZIP โดยตรง

  • วิธีที่ 2: ใช้คำสั่งต่อไปนี้เพื่อลงนามพาร์ติชัน DSU หากพารามิเตอร์ส่วนตัว กุญแจพร้อมใช้งาน img แต่ละรายการในแพ็กเกจ DSU (ไฟล์ ZIP) มีการลงนาม แยกกัน:

    $ key_len=$(openssl rsa -in oem_cert_pri.pem -text | grep Private-Key | sed -e 's/.*(\(.*\) bit.*/\1/')
    $ for partition in system product; do
        avbtool add_hashtree_footer \
            --image ${OUT}/${partition}.img \
            --partition_name ${partition} \
            --algorithm SHA256_RSA${key_len} \
            --key oem_cert_pri.pem
    done
    

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการเพิ่ม add_hashtree_footer โดยใช้ avbtool โปรดดู การใช้ avbtool

ยืนยันแพ็กเกจ DSU ในเครื่อง

ขอแนะนําให้ตรวจสอบรูปภาพในเครื่องทั้งหมดเทียบกับคีย์สาธารณะที่จับคู่กับ คำสั่งเหล่านี้


for partition in system product; do
    avbtool verify_image --image ${OUT}/${partition}.img  --key oem_cert_pub.pem
done

ผลลัพธ์ที่คาดหวังจะมีลักษณะดังนี้

Verifying image dsu/system.img using key at oem_cert_pub.pem
vbmeta: Successfully verified footer and SHA256_RSA2048 vbmeta struct in dsu/system.img
: Successfully verified sha1 hashtree of dsu/system.img for image of 898494464 bytes

Verifying image dsu/product.img using key at oem_cert_pub.pem
vbmeta: Successfully verified footer and SHA256_RSA2048 vbmeta struct in dsu/product.img
: Successfully verified sha1 hashtree of dsu/product.img for image of 905830400 bytes

สร้างแพ็กเกจ DSU

ตัวอย่างต่อไปนี้สร้างแพ็กเกจ DSU ที่มี system.img และ product.img:

dsu.zip {
    - system.img
    - product.img
}

หลังจากลงนามรูปภาพทั้ง 2 ภาพแล้ว ให้ใช้คำสั่งต่อไปนี้เพื่อสร้างไฟล์ ZIP

$ mkdir -p dsu
$ cp ${OUT}/system.img dsu
$ cp ${OUT}/product.img dsu
$ cd dsu && zip ../dsu.zip *.img && cd -

ปรับแต่ง DSU ในคลิกเดียว

โดยค่าเริ่มต้น ตัวโหลด DSU จะชี้ไปยังข้อมูลเมตาของอิมเมจ GSI ซึ่ง https://...google.com/.../gsi-src.json

OEM อาจเขียนทับรายการได้โดยกำหนด persist.sys.fflag.override.settings_dynamic_system.list ที่ชี้ไปยังข้อบ่งชี้ JSON ของตัวเอง ตัวอย่างเช่น OEM อาจ ให้ข้อมูลเมตา JSON ที่มี GSI รวมถึงรูปภาพที่เป็นกรรมสิทธิ์ของ OEM ดังนี้

{
    "include": ["https://dl.google.com/.../gsi-src.JSON"]
    "images":[
      {
         "name":"OEM image",
         "os_version":"10",
         "cpu_abi": "arm64-v8a",
         "details":"...",
         "vndk":[
            27,
            28,
            29
         ],
         "spl":"...",
         "pubkey":"",
         "uri":"https://.../....zip"
      },

}

OEM อาจเชื่อมโยงข้อมูลเมตา DSU ที่เผยแพร่ดังที่แสดงในรูปที่ 7

การเชื่อมโยงข้อมูลเมตา DSU ที่เผยแพร่

รูปที่ 7 การเชื่อมโยงข้อมูลเมตา DSU ที่เผยแพร่