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

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

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

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