การกำหนดเวอร์ชัน GKI

หน้านี้อธิบายโครงร่างการกำหนดเวอร์ชันสำหรับ 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 (ของหวาน) ที่เคอร์เนลเชื่อมโยงอยู่

เมื่อเปรียบเทียบฟิลด์ AndroidRelease ส่วนที่เป็นตัวเลขจะถูกแยกออกจากสตริงเพื่อการเปรียบเทียบ

หมายเลขรุ่นของ 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 จะตรวจสอบเวอร์ชันอิมเมจสำหรับบูตในลักษณะเดียวกับพาร์ติชันอื่น