หน้านี้อธิบายโครงร่างการกำหนดเวอร์ชันสำหรับ Generic Kernel Images (GKI) Generic Kernel Image (GKI) มีตัวระบุเฉพาะที่เรียกว่าเคอร์เนลรีลีส เคอร์เนลรีลีสประกอบด้วยเวอร์ชันเคอร์เนลโมดูลอินเทอร์เฟซ (KMI) และระดับย่อย การเผยแพร่เคอร์เนลนั้นเฉพาะเจาะจงกับอิมเมจที่กำลังเผยแพร่ ในขณะที่เวอร์ชัน KMI แสดงถึงอินเทอร์เฟซที่ใช้สร้างการเผยแพร่ เวอร์ชัน KMI สามารถรองรับการเผยแพร่เคอร์เนลได้หลายรายการ การเปิดตัวเคอร์เนลจะเชื่อมโยงกับ KMI เวอร์ชันเดียวเท่านั้น ในกรณีที่ไม่น่าเป็นไปได้ที่ต้องเปลี่ยนอินเทอร์เฟซโมดูลเคอร์เนล การสร้าง KMI จะถูกทำซ้ำเพื่อสะท้อนถึงการเปลี่ยนแปลงในเวอร์ชัน KMI
สรุปเงื่อนไข
ตารางต่อไปนี้สรุปคำศัพท์สำคัญที่ใช้ในหน้านี้และสำหรับการอัปเดต GKI
ชื่อ | เครื่องหมาย | ตัวอย่าง | คำอธิบาย |
---|---|---|---|
การเปิดตัวเคอร์เนล | wxy-zzz-k-ต่อท้าย | 5.4.42-android12-0-foo | ตัวระบุที่ไม่ซ้ำสำหรับรุ่น GKI นี่คือค่าที่ส่งคืนโดย uname |
เวอร์ชั่นเคเอ็มไอ | wx-zzz-k | 5.4-android12-0 | อธิบายอินเทอร์เฟซโมดูลเคอร์เนล (KMI) ระหว่าง GKI และโมดูลเคอร์เนลที่โหลดได้แบบไดนามิก (DLKM) |
ระดับย่อย | ย | 42 | อธิบายลำดับการเผยแพร่เคอร์เนลที่เผยแพร่ภายในเวอร์ชัน KMI เดียวกัน |
ตารางต่อไปนี้แสดงรายการคำศัพท์อื่นๆ ที่เกี่ยวข้องเพื่อใช้เป็นข้อมูลอ้างอิง
ชื่อ | เครื่องหมาย | ตัวอย่าง | คำอธิบาย |
---|---|---|---|
ว้าว | ว้าว | 5.4.42 | สำหรับรายละเอียด โปรดดู Linux Kernel Makefiles (ค้นหา "KERNELRELEASE") wxy ถูกใช้โดยตรงตลอดทั้งเอกสารนี้ โดยทั่วไปเรียกอีกอย่างว่า หมายเลขเวอร์ชันสามส่วน คำที่ใช้ใน VINTF ซึ่งเป็น เวอร์ชันเคอร์เนล อาจทำให้เกิดความสับสนกับคำอื่นๆ โดยเฉพาะ w ตัวแปรนี้เรียกว่า kernel_version_tuple ใน libkver tuple นี้จะต้องไม่ลดลงโดยการอัพเดตใด ๆ รวมถึง OTA หรือ mainline |
สาขาเคอร์เนล | zzz-wx | หุ่นยนต์ 12-5.4 | คำนี้ใช้ใน ประเภทสาขาเคอร์เนลทั่วไป |
เวอร์ชัน | ว | 5 | คำนี้ไม่ได้ใช้ในเอกสารนี้ ตัวแปรนี้เรียกว่า เวอร์ชัน ใน libkver |
ระดับแพทช์ | x | 4 | คำนี้ไม่ได้ใช้ในเอกสารนี้ ตัวแปรนี้เรียกว่า patch_level ใน libkver |
การเปิดตัว Android | zzz | หุ่นยนต์12 | นี่คือหมายเลขรุ่น Android (ของหวาน) ที่เคอร์เนลเชื่อมโยงอยู่ เมื่อเปรียบเทียบฟิลด์ หมายเลขรุ่นของ Android จะต้องไม่ลดลงจากการอัปเดตใดๆ รวมถึง OTA หรือ mainline |
การสร้าง KMI | เค | 0 | นี่เป็นการเพิ่มหมายเลขเพิ่มเติมเพื่อจัดการกับเหตุการณ์ที่ไม่น่าเป็นไปได้ หากการแก้ไขข้อบกพร่องด้านความปลอดภัยจำเป็นต้องเปลี่ยนแปลง KMI ภายใน Android รุ่นเดียวกัน การสร้าง KMI จะเพิ่มขึ้น หมายเลขการสร้าง KMI เริ่มต้นด้วย 0 |
การออกแบบเวอร์ชัน
การเปิดตัวเคอร์เนล
คำนิยาม
สำหรับอุปกรณ์ที่มาพร้อมกับ GKI การเผยแพร่เคอร์เนลมีการกำหนดดังนี้:
KernelRelease :=
Version.PatchLevel.SubLevel-AndroidRelease-KmiGeneration-suffix
w .x .y -zzz -k -something
สำหรับข้อมูลเพิ่มเติม โปรดดูที่ การกำหนดการปล่อยเคอร์เนลจากอุปกรณ์
ต่อไปนี้เป็นตัวอย่างของการเปิดตัวเคอร์เนล
5.4.42-android12-0-00544-ged21d463f856
คำอธิบาย
การเปิดตัวเคอร์เนลเป็น ID เฉพาะของการเปิดตัว GKI หากไบนารี GKI สองตัวมีเคอร์เนลที่เหมือนกัน ไบนารีเหล่านั้นจะต้องเหมือนกันแบบไบต์
เคอร์เนลรีลีสประกอบด้วยเวอร์ชัน KMI ระดับย่อย และส่วนต่อท้าย สำหรับวัตถุประสงค์ของเอกสารนี้ ส่วนต่อท้ายหลังจากการสร้าง KMI จะถูกละเว้น
เวอร์ชั่นเคเอ็มไอ
คำนิยาม
เวอร์ชัน KMI มีการกำหนดดังนี้:
KmiVersion :=
Version.PatchLevel-AndroidRelease-KmiGeneration
w .x -zzz -k
โปรดทราบว่าระดับย่อย y
ไม่ได้เป็นส่วนหนึ่งของเวอร์ชัน KMI สำหรับตัวอย่างใน Kernel release เวอร์ชัน KMI คือ:
5.4-android12-0
คำอธิบาย
เวอร์ชัน KMI อธิบายอินเทอร์เฟซโมดูลเคอร์เนล (KMI) ระหว่าง GKI และโมดูลเคอร์เนลที่โหลดได้แบบไดนามิก (DLKM)
หากเคอร์เนลสองรุ่นมีเวอร์ชัน KMI เดียวกัน เคอร์เนลจะใช้อินเทอร์เฟซโมดูลเคอร์เนลเดียวกัน DLKM ที่เข้ากันได้กับอันหนึ่งก็สามารถใช้งานร่วมกับอันอื่นได้เช่นกัน
เวอร์ชัน KMI จะต้องไม่ลดลงด้วยการอัปเดต OTA ใด ๆ
ระดับย่อย
ระดับย่อย y
อธิบายลำดับการเผยแพร่ของเคอร์เนลที่เผยแพร่ภายในเวอร์ชัน KMI เดียวกัน
สำหรับเคอร์เนลสองรุ่นที่มีเวอร์ชัน KMI เหมือนกัน แต่มีระดับย่อย Y1 และ Y2 ตามลำดับ:
- หาก Y1 น้อยกว่าหรือเท่ากับ Y2 อุปกรณ์ที่ใช้ Y1 สามารถรับการอัปเดตเป็น Y2 ได้
- หาก Y1 มากกว่า Y2 อุปกรณ์ที่ใช้ Y1 จะไม่สามารถอัปเดตเป็น Y2 ได้
นั่นคือ หากเวอร์ชัน KMI ไม่เปลี่ยนแปลง ระดับย่อยจะต้องไม่ลดลงด้วยการอัปเดต OTA ใดๆ
การกำหนดการปล่อยเคอร์เนลจากอุปกรณ์
คุณสามารถค้นหาเคอร์เนลแบบเต็มได้โดยดำเนินการ uname -r
หรือ uname(2)
ด้วยข้อมูลโค้ดต่อไปนี้:
std::string get_kernel_release() {
struct utsname buf;
return uname(&buf) == 0 ? buf.release : "";
}
ผลลัพธ์ตัวอย่างคือ:
5.4.42-android12-0-00544-ged21d463f856
สำหรับวัตถุประสงค์ของเอกสารนี้ สิ่งใดก็ตามหลังจากการสร้าง KMI จะถูกละเว้นเมื่อแยกข้อมูลเคอร์เนล อย่างเป็นทางการมากขึ้น ผลลัพธ์ของ uname -r
จะถูกแยกวิเคราะห์ด้วย regex ต่อไปนี้ (สมมติว่า zzz เริ่มต้นด้วย "android") เสมอ:
^(?P<w>\d+)[.](?P<x>\d+)[.](?P<y>\d+)-(?P<z>android\d+)-(?P<k>\d+).*$
ข้อมูลที่ละเว้นอาจรวมถึงข้อมูลต่างๆ เช่น หมายเลขบิวด์ ci.android.com จำนวนแพทช์ที่ด้านบนของเคอร์เนลพื้นฐาน และแฮช SHA ของคอมมิตคอมไพล์
libkver
ไลบรารี libkver จัดเตรียมอินเทอร์เฟซ C++ เพื่อแยกวิเคราะห์เคอร์เนลรุ่นหรือสตริงเวอร์ชัน KMI สำหรับรายการ API ที่ libkver เปิดเผย โปรดดูที่ packages/modules/Gki/libkver/include/kver
การตรวจสอบ VINTF
สำหรับ Android 11 หรือต่ำกว่า ส่วนการเปิดตัว Android ของเวอร์ชัน KMI จะถูกระบุด้วยตนเองในรายการอุปกรณ์โดยผู้ผลิตอุปกรณ์ สำหรับรายละเอียด โปรดดู กฎการจับคู่เคอร์เนล VINTF
จาก Android S สามารถแยกส่วนที่เผยแพร่ Android ของเวอร์ชัน KMI ออกจากเคอร์เนลและแทรกลงในรายการอุปกรณ์ ณ เวลาสร้าง
เนื่องจากข้อกำหนดการกำหนดค่าเคอร์เนลโดยทั่วไปไม่มีการเปลี่ยนแปลง จึงไม่จำเป็นต้องเข้ารหัส k
ภายในเมทริกซ์ความเข้ากันได้ อย่างไรก็ตาม ในกรณีที่ไม่น่าจะต้องเปลี่ยนแปลงข้อกำหนดการกำหนดค่าเคอร์เนล ให้ตรวจสอบสิ่งต่อไปนี้:
- ข้อกำหนดที่เกี่ยวข้องจากเมทริกซ์ความเข้ากันได้จะถูกลบออก
- มีการเพิ่มการทดสอบ VTS เพิ่มเติมเพื่อตรวจสอบข้อกำหนดใหม่ที่มีเงื่อนไขในการสร้าง KMI
เวอร์ชันอิมเมจสำหรับบูตในข้อมูลเมตา OTA
แม้ว่าอิมเมจสำหรับบูตจะได้รับการอัปเดตผ่าน OTA แต่การอัปเดตนั้นจะต้องรวมอยู่ในรูปแบบเพย์โหลด OTA คือ payload.bin
เพย์โหลด OTA เข้ารหัส version
เวอร์ชันสำหรับแต่ละพาร์ติชัน เมื่อ update_engine
จัดการเพย์โหลด OTA ระบบจะเปรียบเทียบฟิลด์นี้เพื่อให้แน่ใจว่าพาร์ติชันไม่ได้ดาวน์เกรด
เพื่อหลีกเลี่ยงความสับสน ฟิลด์ version
สำหรับพาร์ติชันสำหรับเริ่มระบบในข้อมูลเมตา OTA จะเรียกว่า boot image version
เนื่องจาก ramdisk ถูกสร้างขึ้นตั้งแต่ต้นเสมอ การใช้ การประทับเวลา ramdisk ก็เพียงพอที่จะอธิบายอิมเมจสำหรับบูตทั้งหมด ไม่จำเป็นต้องเข้ารหัสเคอร์เนลรีลีสในเวอร์ชันอิมเมจสำหรับบูต เว้นแต่ว่าคุณจะต่ออิมเมจสำหรับบูตเก่าเข้ากับไบนารีเคอร์เนลใหม่ในอนาคต
ก่อนการอัปเดต OTA ไคลเอนต์ OTA จะตรวจสอบเวอร์ชันอิมเมจสำหรับบูตในลักษณะเดียวกับพาร์ติชันอื่น