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