หน้านี้อธิบายรูปแบบการกำหนดเวอร์ชันสำหรับอิมเมจเคอร์เนลทั่วไป (GKI) ภาพเคอร์เนลทั่วไป (GKI) เป็นตัวระบุที่ไม่ซ้ำกันที่เรียกว่ารุ่นเคอร์เนล เวอร์ชันเคอร์เนลประกอบด้วยเวอร์ชันอินเทอร์เฟซโมดูลเคอร์เนล (KMI) และระดับย่อย เวอร์ชันเคอร์เนลจะเจาะจงสำหรับรูปภาพที่เผยแพร่ ส่วนเวอร์ชัน KMI จะแสดงอินเทอร์เฟซที่ใช้สร้างรุ่น เวอร์ชัน KMI หนึ่งๆ รองรับการเผยแพร่เคอร์เนลได้หลายรุ่น เวอร์ชันเคอร์เนลจะเชื่อมโยงกับ KMI เวอร์ชันเดียวเท่านั้น ในกรณีที่ต้องเปลี่ยนแปลงอินเทอร์เฟซโมดูลเคอร์เนลซึ่งไม่เกิดขึ้นบ่อยนัก เราจะทำซ้ำรุ่น KMI เพื่อให้สอดคล้องกับการเปลี่ยนแปลงเวอร์ชัน KMI
สรุปข้อกำหนด
ตารางต่อไปนี้สรุปคําศัพท์สําคัญที่ใช้ในหน้านี้และสำหรับข้อมูลอัปเดต GKI
ชื่อ | สัญลักษณ์ | ตัวอย่าง | คำอธิบาย |
---|---|---|---|
เวอร์ชันเคอร์เนล | w.x.y-zzz-k-suffix | 5.4.42-android12-0-foo | ตัวระบุที่ไม่ซ้ำกันสำหรับรุ่น GKI นี่คือค่าที่ uname แสดง |
เวอร์ชัน KMI | w.x-zzz-k | 5.4-android12-0 | อธิบายอินเทอร์เฟซโมดูลเคอร์เนล (KMI) ระหว่าง GKI และโมดูลเคอร์เนลที่โหลดแบบไดนามิกได้ (DLKM) |
ระดับย่อย | y | 42 | อธิบายลําดับการเผยแพร่ของรุ่นเคอร์เนลภายใน KMI เวอร์ชันเดียวกัน |
ตารางต่อไปนี้แสดงคําอื่นๆ ที่เกี่ยวข้องเพื่อเป็นข้อมูลอ้างอิง
ชื่อ | สัญลักษณ์ | ตัวอย่าง | คำอธิบาย |
---|---|---|---|
w.x.y | w.x.y | 5.4.42 |
โปรดดูรายละเอียดที่หัวข้อ Linux Kernel Makefiles (ค้นหา "KERNELRELEASE") ใช้ w.x.y โดยตรงตลอดทั้งเอกสารนี้ หรือเรียกอีกอย่างว่าหมายเลขเวอร์ชันแบบ 3 ส่วน คําที่ใช้ใน VINTF อย่างเวอร์ชันเคอร์เนลอาจทําให้สับสนกับคําอื่นๆ โดยเฉพาะ w ตัวแปรนี้เรียกว่า kernel_version_tuple ใน libkver การอัปเดตใดๆ ก็ตาม รวมถึง OTA หรือเวอร์ชันหลัก ต้องไม่ทำให้จำนวนชุดค่าผสมนี้ลดลง |
สาขาเคอร์เนล | zzz-w.x | android12-5.4 | คํานี้ใช้ใน ประเภทสาขาเคอร์เนลทั่วไป |
เวอร์ชัน | w | 5 | ไม่ได้ใช้คํานี้ในเอกสารนี้ ตัวแปรนี้เรียกว่า version ใน libkver |
ระดับแพตช์ | x | 4 | ไม่ได้ใช้คํานี้ในเอกสารนี้ ตัวแปรนี้เรียกว่า patch_level ใน libkver |
รุ่นของ Android | zzz | android12 |
นี่คือหมายเลขรุ่น Android (Dessert) ที่เชื่อมโยงกับเคอร์เนล
เมื่อเปรียบเทียบช่อง หมายเลขรุ่น Android ต้องไม่ลดลงจากการอัปเดตใดๆ รวมถึง OTA หรือเวอร์ชันหลัก |
การสร้าง KMI | k | 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
คำอธิบาย
รุ่นเคอร์เนลคือรหัสที่ไม่ซ้ำกันของรุ่น GKI หากไบนารี GKI 2 รายการมีรุ่นเคอร์เนลเดียวกัน จะต้องเหมือนกันทุกไบต์
เวอร์ชันเคอร์เนลประกอบด้วยเวอร์ชัน KMI, ระดับย่อย และส่วนต่อท้าย ในส่วนที่เป็นวัตถุประสงค์ของเอกสารนี้ ระบบจะไม่สนใจส่วนต่อท้ายหลังการสร้าง KMI
เวอร์ชัน KMI
คำจำกัดความ
เวอร์ชัน KMI มีคำจำกัดความดังนี้
KmiVersion :=
Version.PatchLevel-AndroidRelease-KmiGeneration
w .x -zzz -k
โปรดทราบว่าระดับย่อย y
ไม่ได้เป็นส่วนหนึ่งของเวอร์ชัน KMI สำหรับตัวอย่างในรุ่นเคอร์เนล เวอร์ชัน KMI คือ
5.4-android12-0
คำอธิบาย
เวอร์ชัน KMI จะอธิบายอินเทอร์เฟซโมดูลเคอร์เนล (KMI) ระหว่าง GKI กับโมดูลเคอร์เนลที่โหลดแบบไดนามิก (DLKM)
หากรุ่นเคอร์เนล 2 รุ่นมี KMI เวอร์ชันเดียวกัน ระบบจะใช้อินเทอร์เฟซโมดูลเคอร์เนลเดียวกัน DLKM ที่ใช้ร่วมกันได้กับอุปกรณ์หนึ่งจะใช้ร่วมกันกับอีกอุปกรณ์หนึ่งได้ด้วย
และต้องไม่ลดเวอร์ชัน KMI โดยการอัปเดต OTA
ระดับย่อย
ระดับย่อย y
จะอธิบายลําดับการเผยแพร่ของรุ่นเคอร์เนลภายใน KMI เวอร์ชันเดียวกัน
สำหรับรุ่นเคอร์เนล 2 รุ่นที่มี 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 ของ Git Commit
Libkver
ไลบรารี libkver มีอินเทอร์เฟซ C++ เพื่อแยกวิเคราะห์รุ่นเคอร์เนลหรือสตริงเวอร์ชัน KMI ดูรายการ API ที่ libkver แสดงได้ที่
packages/modules/Gki/libkver/include/kver
การตรวจสอบ VINTF
สำหรับ Android 11 หรือต่ำกว่า ผู้ผลิตอุปกรณ์จะระบุส่วนเวอร์ชัน Android ของ KMI ด้วยตนเองในไฟล์ Manifest ของอุปกรณ์ โปรดดูรายละเอียดที่หัวข้อกฎการจับคู่เคอร์เนล VINTF
ตั้งแต่ Android S เป็นต้นไป คุณสามารถดึงข้อมูลส่วนเวอร์ชัน Android ของ KMI ได้จากเคอร์เนลและแทรกลงในไฟล์ Manifest ของอุปกรณ์ได้เมื่อสร้าง
เนื่องจากโดยทั่วไปข้อกำหนดในการกำหนดค่าเคอร์เนลจะไม่เปลี่ยนแปลง จึงไม่จำเป็นต้องเข้ารหัส k
ภายในเมทริกซ์ความเข้ากันได้ อย่างไรก็ตาม ในกรณีที่จำเป็นต้องเปลี่ยนแปลงข้อกำหนดในการกำหนดค่าเคอร์เนล (ซึ่งเกิดขึ้นไม่บ่อย) โปรดตรวจสอบสิ่งต่อไปนี้
- ระบบจะนำข้อกำหนดที่เกี่ยวข้องออกจากตารางความเข้ากันได้
- มีการเพิ่มการทดสอบ VTS เพิ่มเติมเพื่อตรวจสอบข้อกําหนดใหม่แบบมีเงื่อนไขในการสร้าง KMI
เวอร์ชันอิมเมจบูตในข้อมูลเมตา OTA
แม้ว่าอิมเมจการเปิดเครื่องจะอัปเดตผ่าน OTA การอัปเดต แต่ก็ต้องรวมไว้ในรูปแบบเพย์โหลด OTA ซึ่งก็คือ payload.bin
เพย์โหลด OTA จะเข้ารหัสช่อง version
สำหรับแต่ละพาร์ติชัน เมื่อ update_engine
จัดการกับเพย์โหลด OTA ระบบจะเปรียบเทียบช่องนี้เพื่อให้มั่นใจว่าไม่มีการดาวน์เกรดพาร์ติชัน
ช่อง version
สำหรับพาร์ติชันบูตในข้อมูลเมตา OTA จะเรียกว่า boot image version
เพื่อไม่ให้เกิดความสับสน
เนื่องจาก ramdisk สร้างขึ้นใหม่ทั้งหมด การใช้การประทับเวลา ramdisk ในระดับที่เพียงพอก็เพียงพอที่จะอธิบายทั้งอิมเมจการเปิดเครื่อง คุณไม่จำเป็นต้องเข้ารหัสรุ่นเคอร์เนลในเวอร์ชันอิมเมจบูต เว้นแต่คุณจะต่อเชื่อมอิมเมจบูตเก่าเข้ากับไบนารีเคอร์เนลใหม่ในอนาคต
ก่อนการอัปเดต OTA ไคลเอ็นต์ OTA จะตรวจสอบเวอร์ชันของอิมเมจการเปิดเครื่องในลักษณะเดียวกับพาร์ติชันอื่นๆ