รูปแบบการกำหนดเวอร์ชัน GKI

หน้านี้อธิบายรูปแบบการกำหนดเวอร์ชันสำหรับรูปภาพเคอร์เนลทั่วไป (GKI) Generic Kernel Image (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

ดูรายละเอียดได้ที่ Makefile ของเคอร์เนล Linux (ค้นหา "KERNELRELEASE")

w.x.y จะใช้โดยตรงตลอดทั้งเอกสารนี้ หรือเรียกอีกอย่างว่าหมายเลขเวอร์ชันแบบ 3 ส่วน คำที่ใช้ ใน VINTF, เคอร์เนลเวอร์ชัน อาจทำให้เกิดความสับสนกับคำอื่นๆ โดยเฉพาะ w

ตัวแปรนี้เรียกว่า kernel_version_tuple ใน libkver

การอัปเดตใดๆ รวมถึง OTA หรือเมนไลน์ต้องไม่ลดค่าของทูเพิลนี้

Kernel Branch zzz-w.x android12-5.4 คำนี้ใช้ใน ประเภทสาขาเคอร์เนลทั่วไป
เวอร์ชัน w 5 คำนี้ไม่ได้ใช้ในเอกสารนี้ ตัวแปรนี้เรียกว่า version ใน libkver
ระดับแพตช์ x 4 คำนี้ไม่ได้ใช้ในเอกสารนี้ ตัวแปรนี้เรียกว่า patch_level ใน libkver
การเปิดตัว Android zzz android12

นี่คือหมายเลขรุ่น Android (ขนมหวาน) ที่เคอร์เนลเชื่อมโยง ด้วย

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

การอัปเดตใดๆ จะต้องไม่ลดหมายเลขเวอร์ชัน Android รวมถึง OTA หรือ Mainline

การสร้าง 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 รายการมี เคอร์เนลรีลีสเดียวกัน ไบนารีทั้ง 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 ที่เข้ากันได้กับรายการหนึ่งจะเข้ากันได้กับอีกรายการหนึ่งด้วย

การอัปเดต OTA จะต้องไม่ลดเวอร์ชัน KMI

ระดับย่อย

ส่วนย่อย 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 จะ แยกวิเคราะห์ด้วยนิพจน์ทั่วไปต่อไปนี้ (สมมติว่า 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 จะเข้ารหัสฟิลด์ a version สำหรับแต่ละพาร์ติชัน เมื่อ update_engine จัดการเพย์โหลด OTA จะเปรียบเทียบฟิลด์นี้เพื่อให้แน่ใจว่าพาร์ติชันจะไม่ลดรุ่น

ฟิลด์ version สำหรับพาร์ติชันการบูตในข้อมูลเมตาของ OTA จะเรียกว่า boot image version เพื่อไม่ให้เกิดความสับสน

เนื่องจาก ramdisk สร้างขึ้นใหม่ตั้งแต่ต้นเสมอ การใช้ramdisk timestamp จึงเพียงพอที่จะอธิบายอิมเมจการบูตทั้งหมด ไม่จำเป็นต้อง เข้ารหัสรุ่นเคอร์เนลในเวอร์ชันอิมเมจการบูต เว้นแต่คุณจะเย็บอิมเมจการบูตเก่า เข้ากับไบนารีเคอร์เนลใหม่ในอนาคต

ก่อนการอัปเดต OTA ไคลเอ็นต์ OTA จะตรวจสอบเวอร์ชันของอิมเมจการบูต ในลักษณะเดียวกับพาร์ติชันอื่นๆ