หน้านี้จะนำเสนอกลไกหลายอย่างที่ OEM ของอุปกรณ์ Android สามารถใช้เพื่อมี อิมเมจระบบที่ใช้ร่วมกัน (SSI) ของตนเองในกลุ่มผลิตภัณฑ์ต่างๆ นอกจากนี้ ยังเสนอ ขั้นตอนการใช้ SSI ที่ OEM เป็นเจ้าของโดยอิงตามอิมเมจระบบทั่วไป (GSI) ที่สร้างขึ้นใน AOSP ด้วย
ฉากหลัง
Project Treble ได้แยก Android แบบ Monolithic ออกเป็น 2 ส่วน ได้แก่ ส่วนที่เฉพาะเจาะจงกับฮาร์ดแวร์ (การติดตั้งใช้งานของผู้ให้บริการ) และส่วนของระบบปฏิบัติการทั่วไป (เฟรมเวิร์กของระบบปฏิบัติการ Android) โดยจะติดตั้ง ซอฟต์แวร์สำหรับแต่ละรายการในพาร์ติชันแยกกัน ได้แก่ พาร์ติชันของผู้ให้บริการสำหรับ ซอฟต์แวร์ที่เฉพาะเจาะจงกับฮาร์ดแวร์ และพาร์ติชันของระบบสำหรับซอฟต์แวร์ ระบบปฏิบัติการทั่วไป อินเทอร์เฟซที่มีการกำหนดเวอร์ชันซึ่งเรียกว่าอินเทอร์เฟซของผู้ให้บริการ (VINTF) ได้รับการกำหนดและบังคับใช้ในทั้ง 2 พาร์ติชัน การใช้ระบบการแบ่งพาร์ติชันนี้ช่วยให้คุณแก้ไขพาร์ติชันระบบได้โดยไม่ต้องแก้ไขพาร์ติชันของผู้ให้บริการ และในทางกลับกัน
แรงจูงใจ
โค้ดเฟรมเวิร์กที่เผยแพร่ใน AOSP เป็นไปตามสถาปัตยกรรม Treble และยังคงความเข้ากันได้แบบย้อนหลังกับการติดตั้งใช้งานของผู้ให้บริการ รุ่นเก่า ตัวอย่างเช่น อิมเมจระบบทั่วไปที่สร้างจากแหล่งที่มาของ AOSP ใน Android 10 สามารถเรียกใช้ในอุปกรณ์ที่รองรับ Treble ซึ่งใช้ Android 8 ขึ้นไป ผู้จำหน่าย SoC และ OEM จะเป็นผู้แก้ไขเวอร์ชัน Android ที่จัดส่งในอุปกรณ์ของผู้บริโภค (ดูวงจรการเปิดตัว Android) การเปลี่ยนแปลงและการขยายเฟรมเวิร์กเหล่านี้ไม่ได้เขียนขึ้นเพื่อ รักษาความเข้ากันได้แบบย้อนหลัง ซึ่งส่งผลให้มีความซับซ้อนมากขึ้นและ มีต้นทุนสูงขึ้นในการอัปเกรดระบบปฏิบัติการ การเปลี่ยนแปลงและการแก้ไขเฉพาะอุปกรณ์จะเพิ่มต้นทุนและความซับซ้อนในการอัปเกรดระบบปฏิบัติการ Android
ก่อน Android 11 จะไม่มีสถาปัตยกรรมที่ชัดเจนซึ่งช่วยให้พาร์ทเนอร์สร้าง ส่วนขยายแบบแยกส่วนไปยังเฟรมเวิร์กของระบบปฏิบัติการ Android ได้ เอกสารนี้อธิบายขั้นตอนที่ผู้ให้บริการ SoC และ OEM สามารถทำเพื่อสร้าง SSI ซึ่งหมายความว่ามีอิมเมจเดียว ที่สร้างจากแหล่งที่มาของเฟรมเวิร์ก Android OS เพื่อนำไปใช้ซ้ำในอุปกรณ์หลายเครื่อง เพื่อรักษาความเข้ากันได้แบบย้อนหลังกับการติดตั้งใช้งานของผู้ให้บริการ และเพื่อ ลดความซับซ้อนและค่าใช้จ่ายในการอัปเกรด Android OS ลงอย่างมาก ดูขั้นตอนเฉพาะที่คุณต้องใช้ในการสร้าง SSI ได้ที่ส่วนขั้นตอนที่แนะนำสำหรับ SSI ที่อิงตาม GSI และโปรดทราบว่าคุณไม่จำเป็นต้องทำตามทั้ง 4 ขั้นตอน ขั้นตอนที่คุณเลือก (เช่น เฉพาะขั้นตอนที่ 1) จะขึ้นอยู่กับการติดตั้งใช้งานของคุณ
ภาพรวม SSI
เมื่อใช้ SSI ระบบจะวางคอมโพเนนต์ซอฟต์แวร์เฉพาะผลิตภัณฑ์และส่วนขยาย OEM ไว้ในพาร์ติชัน /product
ใหม่ คอมโพเนนต์ในพาร์ติชัน /product
ใช้
อินเทอร์เฟซที่เสถียรและกำหนดไว้อย่างดีเพื่อโต้ตอบกับคอมโพเนนต์ในพาร์ติชัน /system
OEM สามารถเลือกสร้าง SSI เพียงรายการเดียว หรือมี SSI จำนวนเล็กน้อยเพื่อใช้ใน SKU ของอุปกรณ์หลายรายการ เมื่อมีการเผยแพร่ Android OS เวอร์ชันใหม่ ผู้ผลิตอุปกรณ์จะลงทุนเพียงครั้งเดียวในการอัปเดต SSI เป็น Android เวอร์ชันล่าสุด
โดยสามารถนำ SSI กลับมาใช้เพื่ออัปเดตอุปกรณ์หลายเครื่องโดยไม่ต้อง
อัปเดตพาร์ติชัน /product
โปรดทราบว่า OEM และผู้ให้บริการ SoC สร้าง SSI ที่มีฟีเจอร์และการแก้ไขที่กำหนดเองทั้งหมดซึ่ง OEM ต้องการ กลไกและแนวทางปฏิบัติแนะนำ ที่ระบุไว้ในหน้านี้มีไว้เพื่อให้ OEM ใช้ในการบรรลุเป้าหมายสำคัญต่อไปนี้
- นำ SSI กลับมาใช้ใหม่ใน SKU ของอุปกรณ์หลายรายการ
- อัปเดตระบบ Android ด้วยส่วนขยายแบบโมดูลเพื่อให้การอัปเกรดระบบปฏิบัติการ ง่ายขึ้น
แนวคิดหลักของการแยกคอมโพเนนต์เฉพาะผลิตภัณฑ์ออกเป็นพาร์ติชันผลิตภัณฑ์ จะคล้ายกับแนวคิดของ Treble ในการแยกคอมโพเนนต์เฉพาะ SoC ออกเป็นพาร์ติชันของผู้ให้บริการ อินเทอร์เฟซผลิตภัณฑ์ (คล้ายกับ VINTF) ช่วยให้ SSI และพาร์ติชันผลิตภัณฑ์สื่อสารกันได้ โปรดทราบว่าในส่วนของ SSI คำว่า "คอมโพเนนต์" จะอธิบายถึงทรัพยากร ไบนารี ข้อความ ไลบรารี และอื่นๆ ทั้งหมดที่ติดตั้งลงในอิมเมจ ซึ่งจะกลายเป็นพาร์ติชันในที่สุด
พาร์ติชันรอบ SSI
รูปที่ 1 แสดงพาร์ติชันรอบ SSI และอินเทอร์เฟซที่มีการกำหนดเวอร์ชันใน พาร์ติชันและนโยบายในอินเทอร์เฟซ ส่วนนี้จะอธิบายรายละเอียดของ พาร์ติชันและอินเทอร์เฟซแต่ละรายการ
รูปที่ 1 พาร์ติชันและอินเทอร์เฟซเกี่ยวกับ SSI
รูปภาพและพาร์ติชัน
ข้อมูลในส่วนนี้จะอธิบายความแตกต่างระหว่างคำว่าอิมเมจและพาร์ติชัน
- อิมเมจคือซอฟต์แวร์เชิงแนวคิดที่อัปเดตแยกกันได้
- พาร์ติชันคือตำแหน่งที่จัดเก็บจริงที่อัปเดตแยกกันได้
ส่วนต่างๆ ในรูปที่ 1 มีคำจำกัดความดังนี้
SSI: SSI คือรูปภาพที่ใช้ร่วมกันใน OEM และอาจมีอยู่ในอุปกรณ์หลายเครื่อง โดยไม่มีคอมโพเนนต์ที่เฉพาะเจาะจงกับฮาร์ดแวร์หรือผลิตภัณฑ์ ทุกอย่างใน SSI ที่กำหนดจะแชร์ในหมู่ อุปกรณ์ทั้งหมดที่ใช้ SSI นั้นตามคำจำกัดความ SSI ประกอบด้วย
/system
รูปภาพเดียว หรือ/system
และพาร์ติชัน/system_ext
ดังที่แสดงในรูปที่ 1พาร์ติชัน
/system
มีคอมโพเนนต์ที่อิงตาม AOSP ส่วน/system_ext
เมื่อใช้งานจะมีส่วนขยายของผู้ผลิตอุปกรณ์และผู้จำหน่าย SoC รวมถึงคอมโพเนนต์ที่เชื่อมโยงอย่างใกล้ชิดกับคอมโพเนนต์ AOSP ตัวอย่างเช่น ไลบรารีเฟรมเวิร์ก Java ของ OEM ที่มี API ที่กำหนดเองสำหรับแอปของ OEM เอง จะเหมาะกับพาร์ติชัน/system_ext
มากกว่าพาร์ติชัน/system
เนื้อหาสำหรับทั้งพาร์ติชัน/system
และ/system_ext
สร้างขึ้นจากแหล่งที่มาของ Android ที่ OEM แก้ไขพาร์ติชัน
/system_ext
เป็นพาร์ติชันที่ไม่บังคับ แต่การใช้พาร์ติชันนี้จะเป็นประโยชน์ สำหรับฟีเจอร์และส่วนขยายที่กำหนดเองซึ่งเชื่อมโยงอย่างใกล้ชิดกับคอมโพเนนต์ที่อิงตาม AOSP ความแตกต่างนี้ช่วยให้คุณระบุการเปลี่ยนแปลงที่ต้องทำเพื่อย้ายคอมโพเนนต์ดังกล่าวจากพาร์ติชัน/system_ext
ไปยังพาร์ติชัน/product
ในช่วงระยะเวลาหนึ่ง
ผลิตภัณฑ์: กลุ่มคอมโพเนนต์ที่เฉพาะเจาะจงสำหรับผลิตภัณฑ์หรืออุปกรณ์ ซึ่ง แสดงถึงการปรับแต่งและการขยายระบบปฏิบัติการ Android ของ OEM วางคอมโพเนนต์เฉพาะ SoC ไว้ในพาร์ติชัน
/vendor
ผู้ให้บริการ SoC ยังใช้พาร์ติชัน/product
สำหรับคอมโพเนนต์ที่เหมาะสมได้ด้วย เช่น คอมโพเนนต์ที่ไม่ขึ้นอยู่กับ SoC ตัวอย่างเช่น หากผู้จำหน่าย SoC จัดหาคอมโพเนนต์ที่ไม่ขึ้นอยู่กับ SoC ให้แก่ลูกค้า OEM (ซึ่งเป็นตัวเลือกในการจัดส่งพร้อมกับผลิตภัณฑ์) ผู้จำหน่าย SoC จะวางคอมโพเนนต์ดังกล่าว ในรูปภาพผลิตภัณฑ์ได้ ตำแหน่งของคอมโพเนนต์ไม่ได้กำหนดโดยความเป็นเจ้าของ แต่กำหนดโดยวัตถุประสงค์ผู้ให้บริการ: ชุดคอมโพเนนต์ที่เฉพาะเจาะจงสำหรับ SoC
ODM: ชุดคอมโพเนนต์เฉพาะบอร์ดที่ไม่ได้มาจาก SoC โดยปกติแล้วผู้จำหน่าย SoC จะเป็นเจ้าของรูปภาพของผู้จำหน่าย ในขณะที่ผู้ผลิตอุปกรณ์จะเป็นเจ้าของรูปภาพของ ODM หากไม่มีพาร์ติชัน
/odm
แยกกัน ระบบจะผสานรวมทั้งรูปภาพของผู้จำหน่าย SoC และ ODM ไว้ด้วยกันในพาร์ติชัน/vendor
อินเทอร์เฟซระหว่างรูปภาพ
SSI มีอินเทอร์เฟซหลัก 2 อย่างสำหรับรูปภาพของผู้ขายและผลิตภัณฑ์
Vendor Interface (VINTF): VINTF คืออินเทอร์เฟซสำหรับ คอมโพเนนต์ที่อยู่ในรูปภาพของผู้ให้บริการและ ODM คอมโพเนนต์ใน รูปภาพผลิตภัณฑ์และระบบจะโต้ตอบกับรูปภาพของผู้ให้บริการและ ODM ได้ ผ่านอินเทอร์เฟซนี้เท่านั้น เช่น รูปภาพของผู้ให้บริการจะขึ้นอยู่กับส่วนส่วนตัวของรูปภาพระบบไม่ได้ และในทางกลับกัน เดิมทีมีการกำหนดไว้ใน Project Treble ซึ่งแยกอิมเมจออกเป็นพาร์ติชันระบบและพาร์ติชันของผู้ให้บริการ อินเทอร์เฟซ อธิบายโดยใช้กลไกต่อไปนี้
- HIDL (HAL แบบส่งผ่านใช้ได้เฉพาะกับโมดูล
system
และsystem_ext
) - AIDL ที่เสถียร
- การกำหนดค่า
- API ของพร็อพเพอร์ตี้ของระบบ
- API สคีมาไฟล์การกำหนดค่า
- VNDK
- Android SDK API
- ไลบรารี Java SDK
- HIDL (HAL แบบส่งผ่านใช้ได้เฉพาะกับโมดูล
อินเทอร์เฟซผลิตภัณฑ์: อินเทอร์เฟซผลิตภัณฑ์คืออินเทอร์เฟซระหว่าง SSI กับ รูปภาพผลิตภัณฑ์ การกำหนดอินเทอร์เฟซที่เสถียรจะแยกส่วนประกอบของผลิตภัณฑ์ ออกจากส่วนประกอบของระบบใน SSI อินเทอร์เฟซผลิตภัณฑ์ต้องมี อินเทอร์เฟซที่เสถียรเหมือนกับ VINTF อย่างไรก็ตาม ระบบจะบังคับใช้เฉพาะ VNDK และ Android SDK API สำหรับอุปกรณ์ที่เปิดตัวด้วย Android 11 (และสูงกว่า)
เปิดใช้ SSI ใน Android 11
ส่วนนี้จะอธิบายวิธีใช้ฟีเจอร์ใหม่ที่มีอยู่เพื่อรองรับ SSI ใน Android 11
พาร์ติชัน /system_ext
/system_ext
พาร์ติชันเปิดตัวใน Android 11 เป็นพาร์ติชันที่ไม่บังคับ
(เป็นที่อยู่ของคอมโพเนนต์ที่ไม่ใช่ AOSP ซึ่งมีการเชื่อมโยงอย่างใกล้ชิดกับ
คอมโพเนนต์ที่กำหนดโดย AOSP ในพาร์ติชัน /system
) ระบบจะถือว่าพาร์ติชัน /system_ext
เป็นส่วนขยายเฉพาะ OEM ของพาร์ติชัน /system
โดยไม่มีการกำหนดอินเทอร์เฟซในทั้ง 2 พาร์ติชัน คอมโพเนนต์ในพาร์ติชัน /system_ext
สามารถเรียกใช้ API ส่วนตัวในพาร์ติชัน /system
ได้ และคอมโพเนนต์ในพาร์ติชัน /system
สามารถเรียกใช้ API ส่วนตัวในพาร์ติชัน /system_ext
ได้
เนื่องจากพาร์ติชันทั้ง 2 เชื่อมโยงกันอย่างใกล้ชิด จึงมีการอัปเกรดทั้ง 2 พาร์ติชัน
พร้อมกันเมื่อมีการเปิดตัว Android เวอร์ชันใหม่ /system_ext
พาร์ติชัน
ที่สร้างขึ้นสำหรับ Android รุ่นก่อนหน้าไม่จำเป็นต้องเข้ากันได้กับ
/system
พาร์ติชันใน Android รุ่นถัดไป
หากต้องการติดตั้งโมดูลในพาร์ติชัน /system_ext
ให้เพิ่ม system_ext_specific:
true
ลงในไฟล์ Android.bp
สำหรับอุปกรณ์ที่ไม่มีพาร์ติชัน /system_ext
ให้ติดตั้งโมดูลดังกล่าวลงในไดเรกทอรีย่อย ./system_ext
ในพาร์ติชัน /system
ประวัติ
ต่อไปนี้คือประวัติบางส่วนเกี่ยวกับพาร์ติชัน /system_ext
เป้าหมายการออกแบบคือการวางคอมโพเนนต์ทั้งหมดที่เฉพาะเจาะจงสำหรับ OEM ไม่ว่าจะเป็นคอมโพเนนต์ทั่วไปหรือไม่ก็ตาม ไว้ในพาร์ติชัน /product
อย่างไรก็ตาม การย้ายทั้งหมดพร้อมกันนั้นเป็นไปไม่ได้
โดยเฉพาะอย่างยิ่งเมื่อคอมโพเนนต์บางอย่างมีการเชื่อมต่ออย่างแน่นหนากับ/system
พาร์ติชัน หากต้องการย้ายคอมโพเนนต์ที่เชื่อมโยงกันอย่างใกล้ชิดไปยังพาร์ติชัน /product
คุณต้องขยายอินเทอร์เฟซผลิตภัณฑ์ ซึ่งมักจะต้องมีการปรับโครงสร้างคอมโพเนนต์อย่างละเอียด ซึ่งต้องใช้เวลาและความพยายามเป็นอย่างมาก พาร์ติชัน
/system_ext
เริ่มต้นจากการเป็นที่สำหรับโฮสต์ชั่วคราวของคอมโพเนนต์เหล่านั้น
ที่ยังไม่พร้อมที่จะย้ายไปยังพาร์ติชัน /product
เป้าหมายของ SSI
คือการกำจัด/system_ext
พาร์ติชันในที่สุด
อย่างไรก็ตาม พาร์ติชัน /system_ext
มีประโยชน์ในการทำให้พาร์ติชัน /system
ใกล้เคียงกับ AOSP มากที่สุด เมื่อใช้ SSI ความพยายามส่วนใหญ่ในการอัปเกรดจะ
มุ่งเน้นไปที่คอมโพเนนต์ในพาร์ติชัน /system
และ /system_ext
เมื่อสร้างอิมเมจระบบจากแหล่งที่มาซึ่งมีความคล้ายคลึงกับแหล่งที่มาใน AOSP มากที่สุด คุณจะมุ่งเน้นความพยายามในการอัปเกรดไปที่อิมเมจ system_ext
ได้
แยกคอมโพเนนต์ออกจากพาร์ติชัน /system และ /system_ext ไปยังพาร์ติชัน /product
Android 9 เปิดตัวพาร์ติชัน /product
ที่เชื่อมโยงกับพาร์ติชัน /system
โมดูลในพาร์ติชัน /product
จะใช้ทรัพยากรของระบบโดยไม่มีข้อจำกัด และในทางกลับกัน เพื่อเปิดใช้ SSI ใน Android 10 เราจึงแยกคอมโพเนนต์ของผลิตภัณฑ์ออกเป็นพาร์ติชัน /system_ext
และ /product
/system_ext
พาร์ติชันไม่จำเป็นต้อง
ปฏิบัติตามข้อจำกัดในการใช้คอมโพเนนต์ของระบบที่/product
พาร์ติชันทำใน Android 9 ตั้งแต่ Android 10 เป็นต้นไป /product
พาร์ติชันจะต้องแยกออกจากพาร์ติชัน /system
และต้องใช้อินเทอร์เฟซที่เสถียรจากพาร์ติชัน /system
และ /system_ext
จุดประสงค์หลักของพาร์ติชัน /system_ext
คือการขยายฟีเจอร์ของระบบ
ไม่ใช่เพื่อติดตั้งโมดูลผลิตภัณฑ์ที่มาพร้อมกันตามที่อธิบายไว้ในส่วน/system_ext partition
โดยการแยกโมดูลเฉพาะผลิตภัณฑ์และย้ายไปยังพาร์ติชัน /product
การแยกโมดูลเฉพาะผลิตภัณฑ์จะทำให้ /system_ext
เป็นเรื่องปกติสำหรับอุปกรณ์
(ดูรายละเอียดเพิ่มเติมได้ที่การทำให้พาร์ติชัน /system_ext เป็นแบบทั่วไป)
หากต้องการแยก/product
พาร์ติชันออกจากคอมโพเนนต์ของระบบ /product
พาร์ติชันต้องมีนโยบายการบังคับใช้เดียวกันกับ/vendor
พาร์ติชันที่
แยกออกจาก Project Treble แล้ว
ตั้งแต่ Android 11 เป็นต้นไป ระบบจะบังคับใช้อินเทอร์เฟซเนทีฟและ Java สำหรับพาร์ติชัน /product
ตามที่อธิบายไว้ด้านล่าง ดูข้อมูลเพิ่มเติมได้ที่
การบังคับใช้อินเทอร์เฟซการแบ่งพาร์ติชันผลิตภัณฑ์
- อินเทอร์เฟซดั้งเดิม: โมดูลดั้งเดิมในพาร์ติชัน
/product
ต้อง แยกออกจากพาร์ติชันอื่นๆ Dependency ที่อนุญาตจาก โมดูลผลิตภัณฑ์มีเพียงไลบรารี VNDK บางรายการ (รวมถึง LLNDK) จากพาร์ติชัน/system
ไลบรารี JNI ที่แอปผลิตภัณฑ์ขึ้นต่อกันต้องเป็นไลบรารี NDK - อินเทอร์เฟซ Java: โมดูล Java (แอป) ในพาร์ติชัน
/product
ใช้ API ที่ซ่อนอยู่ไม่ได้เนื่องจากไม่เสถียร โมดูลเหล่านี้ต้องใช้เฉพาะ API สาธารณะและ API ของระบบจากพาร์ติชัน/system
รวมถึงไลบรารี Java SDK ในพาร์ติชัน/system
หรือ/system_ext
คุณสามารถกำหนดไลบรารี Java SDK สำหรับ API ที่กำหนดเองได้
ขั้นตอนที่แนะนำสำหรับ SSI ที่อิงตาม GSI
รูปที่ 2 การแบ่งพาร์ติชันที่แนะนำสำหรับ SSI ที่อิงตาม GSI
อิมเมจระบบทั่วไป (GSI) คืออิมเมจระบบที่สร้างขึ้นจาก AOSP โดยตรง ใช้สำหรับการทดสอบการปฏิบัติตามข้อกำหนดของ Treble (เช่น CTS-on-GSI) และเป็น แพลตฟอร์มอ้างอิงที่นักพัฒนาแอปใช้เพื่อทดสอบความเข้ากันได้ของ แอปเมื่อไม่มีอุปกรณ์จริงที่ใช้ Android เวอร์ชันที่จำเป็น
นอกจากนี้ OEM ยังใช้ GSI เพื่อสร้าง SSI ของตนเองได้ด้วย ดังที่อธิบายไว้ในรูปภาพและ
พาร์ติชัน
SSI ประกอบด้วยอิมเมจระบบสำหรับคอมโพเนนต์ที่กำหนดโดย AOSP
และอิมเมจ system_ext
สำหรับคอมโพเนนต์ที่กำหนดโดย OEM เมื่อใช้ GSI เป็นsystem
รูปภาพ OEM จะมุ่งเน้นที่system_ext
รูปภาพสำหรับการอัปเกรดได้
ส่วนนี้เป็นคำแนะนำสำหรับ OEM ที่ต้องการแยกการปรับแต่งออกเป็นพาร์ติชัน /system_ext
และ /product
ขณะใช้ AOSP หรืออิมเมจระบบที่ใกล้เคียงกับ AOSP หาก OEM สร้างอิมเมจระบบจากแหล่งที่มาของ AOSP
ก็จะสามารถแทนที่อิมเมจระบบที่สร้างด้วย GSI
ที่ AOSP จัดหาให้ได้ อย่างไรก็ตาม OEM ไม่จำเป็นต้องไปถึงขั้นตอนสุดท้าย (ใช้ GSI ตามที่เป็นอยู่) ในคราวเดียว
ขั้นตอนที่ 1 รับค่า generic_system.mk สำหรับอิมเมจระบบของ OEM (GSI ของ OEM)
การรับค่า
generic_system.mk
(ซึ่งมีชื่อว่า mainline_system.mk
ใน Android 11 และเปลี่ยนชื่อเป็น
generic_system.mk
ใน
AOSP) ทำให้อิมเมจระบบ (OEM GSI) มีไฟล์ทั้งหมดที่ AOSP GSI มี
OEM สามารถแก้ไขไฟล์เหล่านี้เพื่อให้ GSI ของ OEM มีไฟล์ที่เป็นกรรมสิทธิ์ของ OEM นอกเหนือจากไฟล์ GSI ของ AOSP อย่างไรก็ตาม OEM จะไม่ได้รับอนุญาตให้แก้ไขไฟล์ generic_system.mk
เอง
รูปที่ 3 การรับค่า generic_system.mk สำหรับอิมเมจระบบของ OEM
ขั้นตอนที่ 2 ทำให้ GSI ของ OEM มีรายการไฟล์เดียวกันกับ GSI ของ AOSP
GSI ของ OEM จะมีไฟล์เพิ่มเติมในขั้นตอนนี้ไม่ได้ ต้องย้ายไฟล์ที่เป็นกรรมสิทธิ์ของ OEM
ไปยังพาร์ติชัน system_ext
หรือ product
รูปที่ 4 การย้ายไฟล์ที่เพิ่มออกจาก GSI ของ OEM
ขั้นตอนที่ 3 กำหนดรายการที่อนุญาตเพื่อจำกัดไฟล์ที่แก้ไขใน GSI ของ OEM
หากต้องการตรวจสอบไฟล์ที่แก้ไขแล้ว OEM สามารถใช้เครื่องมือ
compare_images
และเปรียบเทียบ GSI ของ AOSP กับ GSI ของ OEM รับ GSI ของ AOSP จาก
เป้าหมาย lunch ของ AOSP generic_system_*
การเรียกใช้เครื่องมือ compare_images
เป็นระยะๆ ด้วยพารามิเตอร์ allowlist
จะช่วยให้คุณตรวจสอบความแตกต่างนอกรายการที่อนุญาตได้ ซึ่งจะช่วยป้องกันไม่ให้ต้องทำการแก้ไขเพิ่มเติมใน GSI ของ OEM
รูปที่ 5 กำหนดรายการที่อนุญาตเพื่อลดรายการไฟล์ที่แก้ไขใน GSI ของ OEM
ขั้นตอนที่ 4 ทำให้ GSI ของ OEM มีไบนารีเหมือนกับ GSI ของ AOSP
การล้างรายการที่อนุญาตจะช่วยให้ OEM ใช้ GSI ของ AOSP เป็นอิมเมจระบบ สำหรับผลิตภัณฑ์ของตนเองได้ หากต้องการล้างรายการที่อนุญาต OEM สามารถละทิ้งการเปลี่ยนแปลงใน GSI ของ OEM หรือส่งการเปลี่ยนแปลงไปยัง AOSP เพื่อให้ GSI ของ AOSP มีการเปลี่ยนแปลงดังกล่าว
รูปที่ 6 การทำให้ GSI ของ OEM มีไบนารีเหมือนกับ GSI ของ AOSP
กำหนด SSI สำหรับ OEM
ปกป้องพาร์ติชัน /system ในเวลาบิลด์
หากต้องการหลีกเลี่ยงการเปลี่ยนแปลงที่เฉพาะเจาะจงผลิตภัณฑ์ในพาร์ติชัน /system
และกำหนด OEM GSI ผู้ผลิตอุปกรณ์สามารถใช้มาโคร Makefile ที่ชื่อ require-artifacts-in-path
เพื่อป้องกันการประกาศโมดูลระบบหลังจากเรียกใช้มาโคร ดูตัวอย่างการสร้างไฟล์ Makefile และเปิดใช้การตรวจสอบเส้นทางอาร์ติแฟกต์
OEM สามารถกำหนดรายการเพื่ออนุญาตให้ติดตั้งโมดูลเฉพาะผลิตภัณฑ์ในพาร์ติชัน
/system
ชั่วคราว อย่างไรก็ตาม รายการต้องว่างเปล่าเพื่อให้ GSI ของ OEM
เป็นแบบทั่วไปสำหรับผลิตภัณฑ์ทั้งหมดของ OEM กระบวนการนี้ใช้สำหรับกำหนด OEM
GSI และสามารถแยกจากขั้นตอนสำหรับ AOSP
GSI ได้
บังคับใช้อินเทอร์เฟซผลิตภัณฑ์
หากต้องการรับประกันว่าพาร์ติชัน /product
จะไม่รวมอยู่ด้วย OEM สามารถตรวจสอบว่าอุปกรณ์บังคับใช้อินเทอร์เฟซผลิตภัณฑ์โดยการตั้งค่า PRODUCT_PRODUCT_VNDK_VERSION:= current
สำหรับโมดูลเนทีฟ และ PRODUCT_ENFORCE_PRODUCT_PARTITION_INTERFACE:= true
สำหรับโมดูล Java ระบบจะตั้งค่าตัวแปรเหล่านี้โดยอัตโนมัติหาก
PRODUCT_SHIPPING_API_LEVEL
ของอุปกรณ์มากกว่าหรือเท่ากับ 30
ดูข้อมูลโดยละเอียดได้ที่การบังคับใช้ Product Partition
Interfaces
ทำให้พาร์ติชัน /system_ext เป็นพาร์ติชันทั่วไป
พาร์ติชัน /system_ext
อาจแตกต่างกันไปในแต่ละอุปกรณ์ เนื่องจากอาจมีโมดูลเฉพาะอุปกรณ์ที่รวมอยู่ในระบบ เนื่องจาก SSI ประกอบด้วยพาร์ติชัน /system
และ /system_ext
ความแตกต่างในพาร์ติชัน /system_ext
จึงเป็นอุปสรรคต่อ OEM ในการกำหนด SSI OEM สามารถมี SSI ของตนเองและแชร์ SSI นั้นในอุปกรณ์หลายเครื่องได้โดยการลบความแตกต่างและทำให้พาร์ติชัน /system_ext
เป็นแบบทั่วไป
ส่วนนี้จะให้คำแนะนำในการทำให้พาร์ติชัน /system_ext
เป็นแบบทั่วไป
เปิดเผย API ที่ซ่อนอยู่ในพาร์ติชันระบบ
แอปเฉพาะผลิตภัณฑ์หลายแอปติดตั้งในพาร์ติชันผลิตภัณฑ์ไม่ได้ เนื่องจากใช้ API ที่ซ่อนอยู่ ซึ่งไม่อนุญาตในพาร์ติชันผลิตภัณฑ์ หากต้องการย้ายแอปเฉพาะอุปกรณ์ไปยังพาร์ติชันผลิตภัณฑ์ ให้นำการใช้ API ที่ซ่อนอยู่ออก
วิธีที่แนะนำในการนำ API ที่ซ่อนอยู่ออกจากแอปคือการค้นหา API สาธารณะหรือ API ของระบบทางเลือกเพื่อแทนที่ API ที่ซ่อนอยู่ หากไม่มี API ที่จะ แทนที่ API ที่ซ่อนอยู่ OEM สามารถมีส่วนร่วมใน AOSP เพื่อกำหนด API ระบบใหม่ สำหรับอุปกรณ์ของตนได้
หรือ OEM สามารถกำหนด API ที่กำหนดเองได้โดยการสร้างไลบรารี Java SDK
ของตนเองในพาร์ติชัน /system_ext
โดยสามารถใช้ API ที่ซ่อนอยู่ในพาร์ติชันระบบ
และสามารถจัดหา API ให้กับแอปในพาร์ติชันผลิตภัณฑ์หรือพาร์ติชันของผู้ให้บริการ
OEM ต้องหยุดการเปลี่ยนแปลง API ที่หันหน้าไปทางผลิตภัณฑ์
เพื่อความเข้ากันได้แบบย้อนหลัง
รวมชุดย่อยของ APK ทั้งหมดและข้ามการติดตั้งแพ็กเกจบางรายการสำหรับอุปกรณ์แต่ละเครื่อง
แพ็กเกจบางอย่างที่มาพร้อมกับระบบจะไม่เหมือนกันในอุปกรณ์ต่างๆ
การแยกโมดูล APK เหล่านี้เพื่อย้ายไปยังพาร์ติชันผลิตภัณฑ์หรือพาร์ติชันของผู้ให้บริการ
อาจทำได้ยาก ในฐานะโซลูชันชั่วคราว OEM สามารถทำให้ SSI มีโมดูลทั้งหมด
จากนั้นกรองโมดูลที่ไม่ต้องการออกโดยใช้พร็อพเพอร์ตี้ SKU
(ro.boot.hardware.sku
) หากต้องการใช้ตัวกรอง OEM จะซ้อนทับทรัพยากรเฟรมเวิร์ก config_disableApkUnlessMatchedSku_skus_list
และ
config_disableApksUnlessMatchedSku_apk_list
หากต้องการตั้งค่าที่แม่นยำยิ่งขึ้น ให้ประกาศ Broadcast Receiver ที่ปิดใช้แพ็กเกจที่ไม่จำเป็น BroadcastReceiver จะเรียกใช้
setApplicationEnabledSetting
เพื่อปิดใช้แพ็กเกจเมื่อได้รับข้อความ
ACTION_BOOT_COMPLETED
กำหนด RRO แทนการใช้การวางซ้อนทรัพยากรแบบคงที่
การซ้อนทับทรัพยากรแบบคงที่จะจัดการแพ็กเกจที่ซ้อนทับ อย่างไรก็ตาม การดำเนินการนี้อาจ ขัดขวางการกำหนด SSI ดังนั้นโปรดตรวจสอบว่าได้เปิดและตั้งค่าพร็อพเพอร์ตี้สำหรับ RRO อย่างถูกต้อง การตั้งค่าพร็อพเพอร์ตี้ดังต่อไปนี้จะช่วยให้ OEM มีการซ้อนทับที่สร้างขึ้นโดยอัตโนมัติทั้งหมดเป็น RRO
PRODUCT_ENFORCE_RRO_TARGETS := *
PRODUCT_ENFORCE_RRO_EXCLUDED_OVERLAYS := # leave it empty
หากต้องมีการกำหนดค่าแบบละเอียด ให้กำหนด RRO ด้วยตนเองแทนที่จะ
ใช้ RRO ที่สร้างขึ้นโดยอัตโนมัติ ดูข้อมูลโดยละเอียดได้ที่การวางซ้อนทรัพยากรที่รันไทม์ (RRO)
นอกจากนี้ OEM ยังกำหนด RRO แบบมีเงื่อนไขที่ขึ้นอยู่กับพร็อพเพอร์ตี้ของระบบได้โดยใช้แอตทริบิวต์ android:requiredSystemPropertyName
และ android:requiredSystemPropertyValue
คำถามที่พบบ่อย (FAQ)
ฉันกำหนด SSI หลายรายการได้ไหม
ซึ่งจะขึ้นอยู่กับความเหมือนและลักษณะของอุปกรณ์ (หรือกลุ่มอุปกรณ์)
OEM สามารถลองทำให้พาร์ติชัน system_ext
เป็นแบบทั่วไปได้ตามที่อธิบายไว้ใน
การทำให้พาร์ติชัน system_ext เป็นแบบทั่วไป หากกลุ่มอุปกรณ์
มีความแตกต่างกันมาก การกำหนด SSI หลายรายการจะดีกว่า
ฉันแก้ไข generic_system.mk (mainline_system.mk) สำหรับ GSI ของ OEM ได้ไหม
ไม่ได้ แต่ OEM สามารถกำหนด Makefile ใหม่สำหรับ GSI ของ OEM ที่รับค่าจากไฟล์
generic_system.mk
และใช้ Makefile ใหม่แทนได้ ดูตัวอย่างได้ที่
การบังคับใช้พาร์ติชันผลิตภัณฑ์
อินเทอร์เฟซ
ฉันจะนำโมดูลออกจาก generic_system.mk ที่ขัดแย้งกับการติดตั้งใช้งานของฉันได้ไหม
ไม่ได้ GSI มีชุดโมดูลที่สามารถบูตและทดสอบได้ขั้นต่ำ หากคิดว่าโมดูลไม่จำเป็น โปรดรายงานข้อบกพร่องเพื่ออัปเดตไฟล์ generic_system.mk
ใน AOSP