พาร์ติชันผลิตภัณฑ์

Android 9 ขึ้นไปรองรับการสร้างพาร์ติชัน product โดยใช้ระบบการสร้างของ Android ก่อนหน้านี้ Android 8.x บังคับให้แยกคอมโพเนนต์เฉพาะ SoC จากพาร์ติชัน system ไปยังพาร์ติชัน vendor โดยไม่จัดสรรพื้นที่สำหรับคอมโพเนนต์เฉพาะ OEM ที่สร้างขึ้นจากระบบการสร้างของ Android Android 9 ขึ้นไปมีสิทธิ์และฟีเจอร์รายการที่อนุญาตเพิ่มเติมที่ใช้กับ priv-app ในพาร์ติชันต่างๆ

เกี่ยวกับการแบ่งส่วนผลิตภัณฑ์

OEM จํานวนมากปรับแต่งภาพระบบ AOSP เพื่อใช้ฟีเจอร์ของตนเอง รวมถึงข้อกําหนดของผู้ให้บริการ อย่างไรก็ตาม การปรับแต่งดังกล่าวทำให้ใช้ภาพระบบเดียวกับ SKU ซอฟต์แวร์หลายรายการไม่ได้ รูปภาพแต่ละรูปต้องไม่ซ้ำกันเพื่อรองรับการปรับแต่ง เช่น กับภาษาหรือผู้ให้บริการที่แตกต่างกัน การใช้พาร์ติชัน product แยกต่างหากเพื่อเก็บข้อมูลการปรับแต่งช่วยให้คุณใช้อิมเมจระบบเดียวกับ SKU ซอฟต์แวร์หลายรายการได้ (พาร์ติชัน system โฮสต์โค้ดทั่วไปที่แชร์ได้กับ SKU ซอฟต์แวร์หลายรายการ) พาร์ติชัน vendor จะยังคงโฮสต์โค้ด BSP สำหรับ SoC โดยเฉพาะ ซึ่งแชร์กับอุปกรณ์หลายเครื่องตาม SoC ที่ระบุได้

การใช้พาร์ติชันแยกกันมีข้อเสียบางประการ เช่น การจัดการพื้นที่ว่างในดิสก์ (ต้องสำรองพื้นที่ไว้บางส่วนเพื่อการเติบโตในอนาคต) และการบำรุงรักษาอินเทอร์เฟซไบนารีของแอปพลิเคชัน (ABI) ที่เสถียรระหว่างพาร์ติชัน ก่อนตัดสินใจใช้พาร์ติชัน product ให้พิจารณาการติดตั้งใช้งาน AOSP ที่ไม่ซ้ำใครและกลยุทธ์การบรรเทาที่เป็นไปได้ (เช่น การแบ่งพาร์ติชันอุปกรณ์ใหม่ระหว่างการอัปเดตแบบ OTA ซึ่ง Google ไม่ได้เป็นผู้ดำเนินการ แต่ OEM บางรายเป็นผู้ดำเนินการ) การแบ่งพาร์ติชันแบบไดนามิกเป็นโซลูชันที่ดีสำหรับปัญหานี้

การแบ่งส่วนผลิตภัณฑ์และสิทธิ์

ใน Android 9 ขึ้นไป การเปลี่ยนแปลงสิทธิ์และกระบวนการเพิ่มในรายการที่อนุญาตจะส่งผลต่อวิธีให้สิทธิ์ priv-apps ในพาร์ติชัน "product" ไฟล์ permissions.xml ต้องอยู่ในพาร์ติชันเดียวกับ priv-apps การวางไฟล์ permissions.xml ในพาร์ติชัน system สำหรับ priv-apps จะไม่ขยายสิทธิ์เหล่านั้นไปยัง priv-apps ในพาร์ติชัน product แม้ว่าพาร์ติชันแรกจะเป็นส่วนขยายของพาร์ติชันหลังก็ตาม โปรดดูรายละเอียดเกี่ยวกับสิทธิ์และกระบวนการเพิ่มในรายการที่อนุญาตที่หัวข้อการเพิ่มสิทธิ์ที่มีสิทธิ์ในรายการที่อนุญาต

/oem เดิมเทียบกับ /product

เรามีแอตทริบิวต์ของพาร์ติชัน product 2 ประเภท โดยขึ้นอยู่กับการบังคับใช้อินเทอร์เฟซผลิตภัณฑ์ นอกจากนี้ พาร์ติชัน product ยังแตกต่างจากพาร์ติชัน oem เดิม ดังนี้

พาร์ติชัน แอตทริบิวต์
oem
  • อัปเดตไม่ได้ โดยปกติจะแฟลชเพียงครั้งเดียวที่โรงงาน
  • สร้างตามผลิตภัณฑ์ย่อย เช่น การสร้างแบรนด์และสี การมีoemเนื้อหาของพาร์ติชันที่แตกต่างกันไม่ได้หมายความว่าซอฟต์แวร์ของผลิตภัณฑ์จะแตกต่างกัน
  • พาร์ติชัน system ไม่ได้ขึ้นอยู่กับพาร์ติชัน oem (จะใช้พาร์ติชัน oem ก็ต่อเมื่อมีไฟล์ที่เฉพาะเจาะจงอยู่ในนั้นเท่านั้น)
  • ใช้เฉพาะ API สาธารณะในพาร์ติชัน system
product
  • อัปเดตได้
  • ควบคู่ไปกับอิมเมจระบบ (อัปเดตพร้อมกัน)
  • สร้างตามผลิตภัณฑ์หรือกลุ่มผลิตภัณฑ์
  • พาร์ติชันระบบอาจขึ้นอยู่กับพาร์ติชัน product
  • ใช้ API ที่ไม่สาธารณะได้เนื่องจากมีการอัปเดตพร้อมกัน
product (อินเทอร์เฟซที่บังคับใช้)
  • อัปเดตได้
  • แยกจากภาพระบบแล้ว
  • สร้างตามผลิตภัณฑ์หรือกลุ่มผลิตภัณฑ์
  • พาร์ติชัน system ไม่ได้ขึ้นอยู่กับพาร์ติชัน product
  • ใช้ API ที่ซ่อนอยู่ไม่ได้ แต่จะใช้ได้เฉพาะ API สาธารณะและ API ของระบบในพาร์ติชัน system

ด้วยเหตุนี้ Android 9 จึงรองรับพาร์ติชัน product ไปพร้อมกับการรองรับพาร์ติชัน oem แบบเดิมสำหรับอุปกรณ์ที่ต้องใช้พาร์ติชันดังกล่าว หากต้องการแยกพาร์ติชัน product ออกจากพาร์ติชัน system Android 11 รองรับการบังคับใช้อินเทอร์เฟซ product

/product components

พาร์ติชัน product ประกอบด้วยคอมโพเนนต์ต่อไปนี้

  • พร็อพเพอร์ตี้ของระบบสำหรับผลิตภัณฑ์ที่เฉพาะเจาะจง (/product/build.prop)
  • RRO สำหรับผลิตภัณฑ์ที่เฉพาะเจาะจง (/product/overlay/*.apk)
  • แอปเฉพาะผลิตภัณฑ์ (/product/app/*.apk)
  • priv-apps สำหรับผลิตภัณฑ์ที่เฉพาะเจาะจง (/product/priv-app/*.apk)
  • คลังสำหรับผลิตภัณฑ์ที่เฉพาะเจาะจง (/product/lib/*)
  • ไลบรารี Java สำหรับผลิตภัณฑ์โดยเฉพาะ (/product/framework/*.jar)
  • การกําหนดค่าระบบเฟรมเวิร์ก Android สําหรับผลิตภัณฑ์โดยเฉพาะ (/product/etc/sysconfig/* และ /product/etc/permissions/*)
  • ไฟล์สื่อสำหรับผลิตภัณฑ์ที่เฉพาะเจาะจง (/product/media/audio/*)
  • bootanimation ไฟล์เฉพาะผลิตภัณฑ์

ไม่มี custom_images

คุณใช้ custom_images ไม่ได้ โดยไม่รองรับสิ่งต่อไปนี้

  • การติดตั้งโมดูลลงในเป้าหมายที่เฉพาะเจาะจง custom_images รองรับการคัดลอกอาร์ติแฟกต์ลงในอิมเมจ แต่ติดตั้งโมดูลลงในพาร์ติชันที่เฉพาะเจาะจงไม่ได้โดยระบุพาร์ติชันเป้าหมายเป็นส่วนหนึ่งของกฎการสร้าง
  • การสนับสนุน Soong ไม่สามารถสร้าง custom_images โดยใช้ระบบการบิลด์ Soong
  • การรองรับการอัปเดต OTA custom_images ใช้เป็นรูปภาพ ROM ของโรงงานซึ่งรับการอัปเดต OTA ไม่ได้

รักษา ABI ระหว่างพาร์ติชัน

พาร์ติชัน product ใน Android 9 เป็นส่วนขยายของพาร์ติชัน system ABI ระหว่างพาร์ติชัน product กับ system นั้นไม่เสถียร จึงต้องอัปเกรดทั้ง 2 อย่างพร้อมกัน และ ABI ควรอิงตาม SDK ของระบบ หาก SDK ของระบบไม่ครอบคลุมแพลตฟอร์ม API ทั้งหมดระหว่าง product กับ system OEM จะต้องดูแล ABI ของตนเองระหว่าง 2 พาร์ติชันดังกล่าว

พาร์ติชัน product และ system อาจมีการขึ้นต่อกัน อย่างไรก็ตาม การทดสอบด้วยภาพระบบทั่วไป (GSI) ต้องทำงานอย่างถูกต้องโดยไม่ต้องมีพาร์ติชัน product

เมื่อบังคับใช้อินเทอร์เฟซ product ระบบจะแยกพาร์ติชัน productออกจากพาร์ติชัน system พาร์ติชัน product ใช้เฉพาะอินเทอร์เฟซที่ได้รับอนุญาตจากพาร์ติชัน system

พาร์ติชัน product ต้องไม่ใช้อินเทอร์เฟซที่ไม่เสถียรในพาร์ติชัน vendor ไม่อนุญาตให้มีการโต้ตอบโดยตรงระหว่างพาร์ติชัน product กับ vendor (SEpolicy จะบังคับใช้)

ใช้การแบ่งส่วนผลิตภัณฑ์

ก่อนใช้พาร์ติชันผลิตภัณฑ์ใหม่ โปรดอ่านการเปลี่ยนแปลงพาร์ติชันผลิตภัณฑ์ที่เกี่ยวข้องใน AOSP จากนั้น หากต้องการตั้งค่า product ให้ใส่ Flag บอร์ดหรือบิลด์ผลิตภัณฑ์ต่อไปนี้

  • BOARD_USES_PRODUCTIMAGE
  • BOARD_PRODUCTIMAGE_PARTITION_SIZE
  • BOARD_PRODUCTIMAGE_FILE_SYSTEM_TYPE
  • PRODUCT_PRODUCT_PROPERTIES สำหรับ /product/build.prop โดยต้องอยู่ภายใน $(call inherit-product path/to/device.mk) ดังตัวอย่างใน PRODUCT_PRODUCT_PROPERTIES += product.abc=ok

ติดตั้งโมดูลลงในพาร์ติชันผลิตภัณฑ์

ใช้ Flag การสร้างต่อไปนี้เพื่อติดตั้งโมดูลลงในพาร์ติชัน product

  • product_specific: trueในAndroid.bp
  • LOCAL_PRODUCT_MODULE := trueในAndroid.mk

เปิดใช้การเปิดเครื่องที่ได้รับการยืนยัน

หากต้องการป้องกันไม่ให้ซอฟต์แวร์ที่เป็นอันตรายแทรกแซงพาร์ติชัน product ให้เปิดใช้การเปิดเครื่องที่ได้รับการยืนยัน (AVB) ของ Android สำหรับพาร์ติชันนั้น (เช่นเดียวกับพาร์ติชัน vendor และ system) หากต้องการเปิดใช้ AVB ให้ใส่ Flag การสร้างต่อไปนี้ BOARD_AVB_PRODUCT_ADD_HASHTREE_FOOTER_ARGS