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

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

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

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

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

  • CONFIG_DM_VERITY=y
  • CONFIG_DM_VERITY_FEC=y

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

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

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

  • ใช้ F2FS:
    • 109s, ผู้ใช้ 8G, ระบบ 867M, ประเภทระบบไฟล์: F2FS: encryption=aes-256-xts:aes-256-cts
    • 104s, ผู้ใช้ 8G, ระบบ 867M, ประเภทระบบไฟล์: F2FS: encryption=ice
  • ใช้ ext4:
    • 135s, ผู้ใช้ 8G, ระบบ 867M, ประเภทระบบไฟล์: ext4: encryption=aes-256-xts:aes-256-cts

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

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

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

DSU ได้รับการพัฒนาและทดสอบด้วยเคอร์เนล/คอมมอน 4.9 ขอแนะนำให้ใช้เคอร์เนล 4.9 และสูงกว่าสำหรับฟีเจอร์นี้

พฤติกรรม HAL ของผู้ขาย

ช่างทอ HAL

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

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

ยาม HAL ต้องการที่จะสนับสนุนขนาดใหญ่ USER_ID ค่าเพราะ GSI ชดเชย UIDs เพื่อ HAL โดย +1000000

ยืนยันการบูต

หากคุณต้องการที่จะสนับสนุนการบูต ผู้พัฒนา GSI แสดงสินค้า ใน รัฐล็อค โดยไม่ต้องปิดการใช้งานบูตตรวจสอบมีกุญแจ GSI พัฒนาโดยการเพิ่มบรรทัดต่อไปนี้ไปยังแฟ้ม device/<device_name>/device.mk :

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

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

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

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

ข้อกำหนดฮาร์ดแวร์

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

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

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

ฟรอนต์เอนด์ที่มีจำหน่าย

คุณสามารถเปิดอย่าใช้ adb , app 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 โดยใช้แอพ

จุดเริ่มต้นที่หลักในการอย่าเป็น 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 คุณไม่สามารถสร้างแอพพลิเคกับ 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 ชี้ไปที่ไฟล์อิมเมจระบบ gzipped ที่ไม่กระจัดกระจาย ซึ่งคุณสามารถสร้างได้ด้วยคำสั่งต่อไปนี้:

$ 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 การเปิดตัวรถตักดินอย่า

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

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

ความคืบหน้าการติดตั้งภาพรูปที่ 2 อย่า

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

แฟล็กคุณลักษณะ

คุณลักษณะอย่าอยู่ภายใต้การ settings_dynamic_android ธงคุณลักษณะ ก่อนใช้ DSU ตรวจสอบให้แน่ใจว่าได้เปิดใช้งานแฟล็กคุณลักษณะที่เกี่ยวข้องแล้ว

การเปิดใช้งานแฟล็กคุณลักษณะ

รูปที่ 3 การเปิดใช้งานคุณลักษณะธง

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

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

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

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

รูปภาพจะต้องเข้าถึงได้แบบสาธารณะ ดังที่แสดงไว้ที่นี่:

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

รูปที่ 4 การเข้าถึงของประชาชนใน GCE

ขั้นตอนที่จะทำให้ประชาชนรายการที่มีอยู่ใน เอกสาร Google Cloud

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

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

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

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

DSU . ที่ลงนามโดย OEM

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

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

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

ตัวอธิบาย DSU JSON

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

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

ประการที่สอง image ดั้งเดิมใช้เพื่ออธิบายการแพคเกจอย่าปล่อยออกมา ภายในภาพดั้งเดิมมีคุณสมบัติหลายประการ:

  • name และ details คุณลักษณะสตริงที่มีการแสดงบนโต้ตอบสำหรับผู้ใช้เพื่อเลือก

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

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

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

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

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

สำหรับการอ้างอิง นี่คือตัวอธิบาย DSU JSON สำหรับ 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 และ 11 สำหรับ Android, os_version คือ 11 เมื่อแอตทริบิวต์นี้มีการระบุจะต้องเท่ากับหรือมากกว่า ro.system.build.version.release คุณสมบัติระบบ การตรวจสอบนี้ใช้เพื่อป้องกันการบูทอิมเมจ Android 10 GSI บนอุปกรณ์ของผู้จำหน่าย Android 11 ซึ่งไม่รองรับในขณะนี้ อนุญาตให้บูตอิมเมจ Android 11 GSI บนอุปกรณ์ Android 10

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

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

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

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

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

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 ในการบล็อกคีย์สาธารณะบางอย่างโดยไม่ต้องอัปเดตอิมเมจ ramdisk ของอุปกรณ์

รูปแบบของรายการเพิกถอนคือ:

{
   "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 pubkey ส่วน
  • status บ่งชี้สถานะการเพิกถอนของคีย์ ปัจจุบันมูลค่าการสนับสนุนเฉพาะจะ REVOKED
  • reason เป็นสตริงตัวเลือกอธิบายเหตุผลของการเพิกถอน

ขั้นตอนของ DSU

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

กำลังสร้างคู่คีย์ใหม่

ใช้ openssl คำสั่งในการสร้าง RSA ส่วนตัว / คู่คีย์ของประชาชนใน .pem รูปแบบ (ตัวอย่างเช่นที่มีขนาด 2,048 บิต):

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

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

ในการแปลงใบรับรอง x509 เป็นรูปแบบ PEM:

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

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

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

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

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

จากนั้นรวมกุญแจสาธารณะใน ramdisk ด่านแรกด้วยขั้นตอนต่อไปนี้

  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 descriptor

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
}

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

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

การปรับแต่ง one-click-DSU

โดยค่าเริ่มต้นที่จุดรถตักดินอย่าข้อมูลเมตาของภาพ GSI ซึ่งเป็น https://...google.com/.../gsi-src.json

OEMs สามารถเขียนทับรายการโดยกำหนด 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 Chaining การเผยแพร่ข้อมูลเมตาอย่า