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

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

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

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

การอัปเดตใดๆ ก็ตาม รวมถึง OTA หรือเวอร์ชันหลัก ต้องไม่ทำให้จำนวนชุดค่าผสมนี้ลดลง

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

นี่คือหมายเลขรุ่น Android (Dessert) ที่เชื่อมโยงกับเคอร์เนล

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

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

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