รูปแบบการกำหนดเวอร์ชัน 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 หรือ เมนไลน์

Branch ของเคอร์เนล zzz-w.x android12-5.4 คำนี้ใช้ใน ประเภท Branch ของเคอร์เนลทั่วไป
เวอร์ชัน w 5 ไม่ได้ใช้คํานี้ในเอกสารนี้ ตัวแปรนี้เรียกว่า version ใน libkver
ระดับแพตช์ x 4 ไม่มีการใช้คำนี้ในเอกสารนี้ ตัวแปรนี้เรียกว่า patch_level ใน libkver
เวอร์ชัน Android ฮึ่มมม 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 ตัวอย่างเช่น ในรุ่น Kernel เวอร์ชัน 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 หรือต่ำกว่า เวอร์ชัน 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 disk ขึ้นใหม่ทุกครั้ง การใช้ ramdisk timestamp จึงเพียงพอที่จะอธิบายภาพการบูตทั้งหมด คุณไม่จำเป็นต้อง เข้ารหัสรุ่นเคอร์เนลในอิมเมจการเปิดเครื่อง เว้นแต่คุณจะต่อ บูตอิมเมจไปยังไบนารีเคอร์เนลใหม่ในอนาคต

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