การอัปเดตระบบแบบไดนามิก (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 ได้ วัตถุประสงค์ของแอปนี้คือ
- ดึงข้อมูลรายการรูปภาพและ URL ที่เกี่ยวข้องซึ่งมีรูปแบบที่ผู้ให้บริการกำหนด
- จับคู่รูปภาพในรายการกับอุปกรณ์และแสดงรูปภาพที่เข้ากันได้ เพื่อให้ผู้ใช้เลือก
เรียกใช้
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 แบบคลิกเดียว เป็นฟรอนท์เอนด์ในการตั้งค่าสำหรับนักพัฒนาซอฟต์แวร์
รูปที่ 1 การเปิดตัวตัวโหลด DSU
เมื่อนักพัฒนาซอฟต์แวร์คลิกปุ่ม DSU Loader นักพัฒนาซอฟต์แวร์จะดึงข้อมูล ข้อบ่งชี้ JSON ของ 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 ไปยัง เพิ่ม/ลบ/เปลี่ยนอิมเมจระบบที่เผยแพร่
รูปภาพต้องเป็นการเข้าถึงแบบสาธารณะ ตามที่แสดงอยู่ด้านล่าง
รูปที่ 4 การเข้าถึงแบบสาธารณะใน GCE
ขั้นตอนในการทำให้รายการเป็นสาธารณะมีอยู่ใน เอกสารประกอบของ Google Cloud
DSU แบบแบ่งพาร์ติชันในไฟล์ ZIP
ตั้งแต่ Android 11 เป็นต้นไป DSU จะมี URL มากกว่า 1 รายการ
พาร์ติชัน ตัวอย่างเช่น อาจมี product.img
นอกเหนือจาก
system.img
เมื่ออุปกรณ์เปิดเครื่อง ขั้นแรก init
จะตรวจหา
ติดตั้งพาร์ติชัน 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 10os_version
คือ10
และ สำหรับ Android 11 ราคาos_version
คือ11
เมื่อใด มีการระบุแอตทริบิวต์แล้ว ค่าดังกล่าวต้องเท่ากับหรือมากกว่าro.system.build.version.release
พร็อพเพอร์ตี้ของระบบ การตรวจสอบนี้ใช้เพื่อป้องกันการเปิดเครื่องอิมเมจ GSI ของ Android 10 ใน Android 11 อุปกรณ์ของผู้ให้บริการ ซึ่งยังไม่รองรับในขณะนี้ อนุญาตให้เปิดเครื่องอิมเมจ GSI ของ Android 11 ในอุปกรณ์ Android 10vndk
เป็นอาร์เรย์ที่ไม่บังคับที่ระบุ 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 ของคีย์ที่เพิกถอนในรูปแบบที่อธิบาย ในการสร้างคีย์ผู้เผยแพร่โฆษณา AVBstatus
ระบุสถานะการเพิกถอนของคีย์ ปัจจุบันมีเพียงเครือข่ายเดียว ค่าที่รองรับคือ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 ขั้นตอนแรกตามขั้นตอนต่อไปนี้
เพิ่มโมดูลที่สร้างไว้ล่วงหน้าเพื่อคัดลอก
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)
ทำให้เป้าหมาย 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
รูปที่ 7 การเชื่อมโยงข้อมูลเมตา DSU ที่เผยแพร่