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