หน้านี้อธิบายรูปแบบการกำหนดเวอร์ชันสำหรับอิมเมจเคอร์เนลทั่วไป (GKI) ต อิมเมจเคอร์เนลทั่วไป (GKI) มีตัวระบุที่ไม่ซ้ำกันที่เรียกว่ารุ่นเคอร์เนล รุ่นเคอร์เนลประกอบด้วย เวอร์ชันอินเทอร์เฟซโมดูลเคอร์เนล (KMI) และระดับย่อย เคอร์เนล การเผยแพร่นั้นเฉพาะเจาะจงสำหรับรูปภาพที่เผยแพร่ ขณะที่เวอร์ชัน 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 | Android 12-5.4 | คำนี้ใช้ใน ประเภท Branch ของเคอร์เนลทั่วไป |
เวอร์ชัน | w | 5 | ไม่มีการใช้คำนี้ในเอกสารนี้ ตัวแปรนี้เรียกว่า version ใน libkver |
ระดับแพตช์ | x | 4 | ไม่มีการใช้คำนี้ในเอกสารนี้ ตัวแปรนี้เรียกว่า patch_level ใน libkver |
รุ่นของ Android | ฮึ่มมม | Android12 |
นี่คือหมายเลขรุ่นของ Android (ของหวาน) ที่เชื่อมโยงกับเคอร์เนล ด้วย
เมื่อเปรียบเทียบฟิลด์ ต้องไม่ลดหมายเลขรุ่นของ 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 ตัวอย่างเช่น
ในรุ่น Kernel เวอร์ชัน KMI คือ
5.4-android12-0
คำอธิบาย
เวอร์ชัน KMI จะอธิบายอินเทอร์เฟซโมดูลเคอร์เนล (KMI) ระหว่าง GKI กับ โมดูลเคอร์เนลที่โหลดแบบไดนามิกได้ (DLKM)
หากการเผยแพร่เคอร์เนล 2 รายการมีเวอร์ชัน KMI เดียวกัน เวอร์ชันดังกล่าวจะใช้เคอร์เนลเดียวกัน ของโมดูล DLKM ที่เข้ากันได้กับ 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คอมมิต
Libkver
ไลบรารี libkver มีอินเทอร์เฟซ C++ สำหรับแยกวิเคราะห์รุ่นเคอร์เนลหรือ
สตริงเวอร์ชัน KMI สำหรับรายการของ API ที่ libkver เปิดเผย โปรดดู
packages/modules/Gki/libkver/include/kver
การตรวจสอบ VINTF
สำหรับ Android 11 หรือต่ำกว่า เวอร์ชัน KMI ที่เผยแพร่สำหรับ Android คือ ที่ระบุด้วยตนเองในไฟล์ 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
เนื่องจาก RAM จะสร้างขึ้นมาใหม่เสมอโดยใช้ ramdisk timestamp นั้นเพียงพอที่จะอธิบายอิมเมจการเปิดเครื่องทั้งหมด คุณไม่จำเป็นต้อง เข้ารหัสรุ่นเคอร์เนลในอิมเมจการเปิดเครื่อง เว้นแต่คุณจะต่อ บูตอิมเมจไปยังไบนารีเคอร์เนลใหม่ในอนาคต
ก่อนการอัปเดต OTA ไคลเอ็นต์ OTA จะตรวจสอบเวอร์ชันอิมเมจการเปิดเครื่อง ในลักษณะเดียวกับพาร์ติชันอื่นๆ