ออบเจ็กต์ VINTF รวบรวมข้อมูลจากอุปกรณ์ ไฟล์ Manifest และไฟล์ Manifest ของเฟรมเวิร์ก (XML) ทั้ง 2 อย่าง ไฟล์ Manifest จะใช้รูปแบบเดียวกัน แต่องค์ประกอบบางอย่างอาจใช้ไม่ได้กับทั้ง 2 รูปแบบ (สำหรับรายละเอียด เกี่ยวกับสคีมา โปรดดูสคีมาไฟล์ Manifest)
ไฟล์ Manifest ของอุปกรณ์
ไฟล์ Manifest ของอุปกรณ์ (ได้มาจากอุปกรณ์) ประกอบด้วยไฟล์ Manifest ของผู้ให้บริการ และไฟล์ Manifest ODM
- ไฟล์ Manifest ของผู้ให้บริการระบุ HAL, เวอร์ชันของนโยบาย SELinux ฯลฯ ที่พบได้ใน SoC ทั้งนี้
ไว้ในโครงสร้างแหล่งที่มาของ Android ที่
device/VENDOR/DEVICE/manifest.xml
แต่มีส่วนย่อยหลายรายการ สามารถใช้ได้ โปรดดูรายละเอียดที่หัวข้อส่วนย่อยของไฟล์ Manifest และ สร้าง DM จากส่วนย่อย - ไฟล์ Manifest ของ ODM จะแสดง HAL ที่เฉพาะเจาะจงสำหรับผลิตภัณฑ์ใน
พาร์ติชัน ODM
ออบเจ็กต์ VINTF จะโหลดไฟล์ Manifest ODM ตามลำดับดังนี้
- หากมีการกำหนด
SKU
(โดยที่SKU
คือค่าของ พร็อพเพอร์ตี้ro.boot.product.hardware.sku
)/odm/etc/vintf/manifest_SKU.xml
/odm/etc/vintf/manifest.xml
- หากกำหนด
SKU
ไว้ วันที่/odm/etc/manifest_SKU.xml
/odm/etc/manifest.xml
- หากมีการกำหนด
- ไฟล์ Manifest ของผู้ให้บริการจะแสดง HAL ที่เฉพาะเจาะจงสำหรับผลิตภัณฑ์ในพาร์ติชันผู้ให้บริการ
ออบเจ็กต์ VINTF จะโหลดไฟล์ Manifest ของผู้ให้บริการตามลำดับดังนี้
- หากมีการกำหนด
SKU
(โดยที่SKU
คือค่าของ พร็อพเพอร์ตี้ro.boot.product.vendor.sku
)/vendor/etc/vintf/manifest_SKU.xml
/vendor/etc/vintf/manifest.xml
- หากมีการกำหนด
- ออบเจ็กต์ VINTF จะโหลดไฟล์ Manifest ของอุปกรณ์ตามลำดับต่อไปนี้
- หากมีไฟล์ Manifest ของผู้ให้บริการอยู่ ให้รวมข้อมูลต่อไปนี้
- ไฟล์ Manifest ของผู้ให้บริการ
- ส่วนย่อยของไฟล์ Manifest ของผู้ให้บริการที่ไม่บังคับ
- ไฟล์ Manifest ODM ที่ไม่บังคับ
- ส่วนย่อยของไฟล์ Manifest ODM ที่ไม่บังคับ
- มิฉะนั้น หากมีไฟล์ Manifest ODM อยู่ ให้รวมไฟล์ Manifest ODM กับ ODM ที่ไม่บังคับ ไฟล์ Manifest
/vendor/manifest.xml
(เดิม ไม่มีส่วนย่อย)- สุดท้าย ให้รวมส่วนย่อยของไฟล์ Manifest จาก APEX ของผู้ให้บริการทั้งหมด
โปรดทราบว่า
- ในอุปกรณ์เดิม ระบบจะใช้ไฟล์ Manifest ของผู้ให้บริการเดิมและไฟล์ Manifest ODM ไฟล์ Manifest ODM อาจลบล้างไฟล์ Manifest ของผู้ให้บริการเดิมโดยสมบูรณ์
- ในอุปกรณ์ที่เปิดตัว Android 9 จะมีการรวมไฟล์ Manifest ODM ไว้ด้วยกัน ในไฟล์ Manifest ของผู้ให้บริการ
- เมื่อรวมรายการไฟล์ Manifest ไฟล์ Manifest ที่ปรากฏในรายการภายหลังอาจลบล้าง
แท็กในไฟล์ Manifest ที่ปรากฏก่อนหน้าในรายการ โดยมีเงื่อนไขว่าแท็กในครั้งต่อๆ ไป
ไฟล์ Manifest มีแอตทริบิวต์
override="true"
ตัวอย่างเช่น ไฟล์ Manifest ODM อาจ ลบล้างแท็ก<hal>
บางส่วนจากไฟล์ Manifest ของผู้ให้บริการ ดูเอกสารสำหรับoverride
ด้านล่าง
- หากมีไฟล์ Manifest ของผู้ให้บริการอยู่ ให้รวมข้อมูลต่อไปนี้
การตั้งค่านี้ช่วยให้ผลิตภัณฑ์หลายรายการที่มีกระดานเดียวกันแชร์กันได้ รูปภาพผู้ให้บริการ (ซึ่งมี HAL ทั่วไป) แต่ยังมีรูปภาพ ODM ที่แตกต่างกัน (ซึ่ง ระบุ HAL เฉพาะผลิตภัณฑ์)
ต่อไปนี้คือตัวอย่างไฟล์ Manifest ของผู้ให้บริการ
<?xml version="1.0" encoding="UTF-8"?> <!-- Comments, Legal notices, etc. here --> <manifest version="2.0" type="device" target-level="1"> <hal> <name>android.hardware.camera</name> <transport>hwbinder</transport> <version>3.4</version> <interface> <name>ICameraProvider</name> <instance>legacy/0</instance> <instance>proprietary/0</instance> </interface> </hal> <hal> <name>android.hardware.nfc</name> <transport>hwbinder</transport> <version>1.0</version> <version>2.0</version> <interface> <name>INfc</name> <instance>nfc_nci</instance> </interface> </hal> <hal> <name>android.hardware.nfc</name> <transport>hwbinder</transport> <fqname>@2.0::INfc/default</fqname> </hal> <hal> <name>android.hardware.drm</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>ICryptoFactory</name> <instance>default</instance> </interface> <interface> <name>IDrmFactory</name> <instance>default</instance> </interface> <fqname>@1.1::ICryptoFactory/clearkey</fqname> <fqname>@1.1::IDrmFactory/clearkey</fqname> </hal> <hal format="aidl"> <name>android.hardware.light</name> <version>1</version> <fqname>ILights/default</fqname> </hal> <hal format="aidl"> <name>android.hardware.power</name> <version>2</version> <interface> <name>IPower</name> <instance>default</instance> </interface> </hal> <hal format="native"> <name>EGL</name> <version>1.1</version> </hal> <hal format="native"> <name>GLES</name> <version>1.1</version> <version>2.0</version> <version>3.0</version> </hal> <sepolicy> <version>25.0</version> </sepolicy> </manifest>
ตัวอย่างไฟล์ Manifest ODM มีดังนี้
<?xml version="1.0" encoding="UTF-8"?> <!-- Comments, Legal notices, etc. here --> <manifest version="1.0" type="device"> <!-- camera 3.4 in vendor manifest is ignored --> <hal override="true"> <name>android.hardware.camera</name> <transport>hwbinder</transport> <version>3.5</version> <interface> <name>ICameraProvider</name> <instance>legacy/0</instance> </interface> </hal> <!-- NFC is declared to be disabled --> <hal override="true"> <name>android.hardware.nfc</name> <transport>hwbinder</transport> </hal> <hal> <name>android.hardware.power</name> <transport>hwbinder</transport> <version>1.1</version> <interface> <name>IPower</name> <instance>default</instance> </interface> </hal> </manifest>
ต่อไปนี้คือตัวอย่างไฟล์ Manifest ของอุปกรณ์ในแพ็กเกจ OTA
<?xml version="1.0" encoding="UTF-8"?> <!-- Comments, Legal notices, etc. here --> <manifest version="1.0" type="device" target-level="1"> <!-- hals ommited --> <kernel version="4.4.176"> <config> <key>CONFIG_ANDROID</key> <value>y</value> </config> <config> <key>CONFIG_ARM64</key> <value>y</value> </config> <!-- other configs ommited --> </kernel> </manifest>
ดูรายละเอียดเพิ่มเติมได้ที่ไฟล์ Manifest ของอุปกรณ์ การพัฒนา
ไฟล์ Manifest ของเฟรมเวิร์ก
ไฟล์ Manifest ของเฟรมเวิร์กประกอบด้วยไฟล์ Manifest ของระบบ, ไฟล์ Manifest ของผลิตภัณฑ์ และ ไฟล์ Manifest system_ext
-
ระบบจะสร้างไฟล์ Manifest ของระบบ (จัดทำโดย Google) ด้วยตนเอง และ
อยู่ในแผนผังซอร์สของ Android ที่
/system/libhidl/manifest.xml
- ไฟล์ Manifest ของผลิตภัณฑ์ (ได้มาจากอุปกรณ์) จะแสดง HAL ที่ให้บริการโดยโมดูลที่ติดตั้งในไฟล์ การแบ่งส่วนผลิตภัณฑ์
-
ไฟล์ Manifest ของ system_ext (ได้ให้ไว้โดยอุปกรณ์) จะแสดงรายการดังต่อไปนี้
- HAL ให้บริการโดยโมดูลที่ติดตั้งในพาร์ติชัน system_ext
- เวอร์ชัน VNDK
- เวอร์ชัน SDK ของระบบ
โดยใช้ไฟล์ Fragment หลายไฟล์ได้เช่นเดียวกับไฟล์ Manifest ของอุปกรณ์ โปรดดูรายละเอียดที่หัวข้อ ชิ้นส่วนไฟล์ Manifest
ต่อไปนี้คือตัวอย่างไฟล์ Manifest ของเฟรมเวิร์ก
<?xml version="1.0" encoding="UTF-8"?> <!-- Comments, Legal notices, etc. here --> <manifest version="1.0" type="framework"> <hal> <name>android.hidl.allocator</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>IAllocator</name> <instance>ashmem</instance> </interface> </hal> <hal> <name>android.hidl.memory</name> <transport arch="32+64">passthrough</transport> <version>1.0</version> <interface> <name>IMapper</name> <instance>ashmem</instance> </interface> </hal> <hal> <name>android.hidl.manager</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>IServiceManager</name> <instance>default</instance> </interface> </hal> <hal> <name>android.frameworks.sensorservice</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>ISensorManager</name> <instance>default</instance> </interface> </hal> <hal max-level="5"> <name>android.frameworks.schedulerservice</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>ISchedulingPolicyService</name> <instance>default</instance> </interface> </hal> <vendor-ndk> <version>27</version> </vendor-ndk> <system-sdk> <version>27</version> </system-sdk> </manifest>
ส่วนย่อยของไฟล์ Manifest
ใน Android 10 ขึ้นไป คุณสามารถเชื่อมโยงไฟล์ Manifest ด้วยโมดูล HAL ในระบบบิลด์ วิธีนี้ช่วยให้คุณ รวมโมดูล HAL อย่างมีเงื่อนไขในระบบบิลด์
ตัวอย่าง
ในไฟล์ Android.bp
หรือ Android.mk
ให้เพิ่ม
vintf_fragments
ไปยังโมดูลใดก็ได้ เช่น คุณสามารถแก้ไข
ด้วยการนำ HAL ของคุณไปใช้
(my.package.foo@1.0-service-bar
)
... { ... vintf_fragments: ["manifest_foo.xml"], ... }
LOCAL_MODULE := ... LOCAL_VINTF_FRAGMENTS := manifest_foo.xml
ในไฟล์ชื่อ manifest_foo.xml
ให้สร้างไฟล์ Manifest สำหรับ
โมดูลนี้ ขณะสร้าง ระบบจะเพิ่มไฟล์ Manifest นี้ลงในอุปกรณ์ กำลังเพิ่ม
รายการที่อยู่ที่นี่จะเหมือนกับการเพิ่มรายการในไฟล์ Manifest หลักของอุปกรณ์
ซึ่งจะช่วยให้ไคลเอ็นต์ใช้อินเทอร์เฟซได้และช่วยให้ VTS ระบุ HAL ได้
ในการใช้งานอุปกรณ์ ไฟล์ Manifest ทั่วไป
ไฟล์ Manifest นี้ก็มีเช่นกัน
ตัวอย่างด้านล่างใช้
android.hardware.foo@1.0::IFoo/default
ซึ่งติดตั้งไว้
พาร์ติชัน vendor
หรือ odm
หากติดตั้งไว้ใน
พาร์ติชัน system
, product
หรือ system_ext
ประเภทการใช้งาน
framework
แทนที่จะเป็น
พิมพ์ device
<manifest version="1.0" type="device"> <hal format="hidl"> <name>android.hardware.foo</name> <transport>hwbinder</transport> <fqname>@1.0::IFoo/default</fqname> </hal> </manifest>
หากโมดูล HAL ได้รับแพ็กเกจใน APEX ของผู้ให้บริการ
สร้างแพ็กเกจ Fragment ของ VINTF ที่เกี่ยวข้องภายใน APEX เดียวกันกับ prebuilt_etc
อธิบายไว้ในส่วน VINTF
สคีมาไฟล์ Manifest
ส่วนนี้จะอธิบายความหมายของแท็ก XML เหล่านี้ "ต้องระบุ" บางส่วน แท็กทั้งหมด
อาจหายไปจากไฟล์ต้นฉบับในโครงสร้างแหล่งที่มาของ Android และเขียนโดย
assemble_vintf
ขณะสร้าง แท็กที่จำเป็นต้องแสดงในไฟล์ที่เกี่ยวข้องบน
อุปกรณ์
?xml
- ไม่บังคับ ให้ข้อมูลแก่โปรแกรมแยกวิเคราะห์ XML เท่านั้น
manifest.version
- ต้องระบุ ไฟล์ Manifest นี้เวอร์ชันเมตา อธิบาย องค์ประกอบที่ต้องการในไฟล์ Manifest ไม่เกี่ยวข้องกับเวอร์ชัน XML
manifest.type
- ต้องระบุ ประเภทของไฟล์ Manifest นี้ มีค่า
device
สำหรับ ไฟล์ Manifest ของอุปกรณ์และframework
สำหรับไฟล์ Manifest ของเฟรมเวิร์ก manifest.target-level
- ต้องระบุสำหรับไฟล์ Manifest ของอุปกรณ์ ระบุเมทริกซ์ความเข้ากันได้ของเฟรมเวิร์ก (FCM) เวอร์ชันที่มีการกำหนดเป้าหมายไฟล์ Manifest ของอุปกรณ์นี้ให้ใช้งานร่วมกันได้ ด้วย ซึ่งเรียกอีกอย่างว่าเวอร์ชัน FCM สำหรับการจัดส่งของอุปกรณ์
manifest.hal
- ไม่บังคับ ทำซ้ำได้ HAL เดียว (HIDL หรือเนทีฟ เช่น GL)
ขึ้นอยู่กับแอตทริบิวต์
format
manifest.hal.format
- ไม่บังคับ ค่าอาจเป็นค่าใดค่าหนึ่งต่อไปนี้
hidl
: HIDL HAL โดยตัวเลือกนี้คือค่าเริ่มต้นaidl
: AIDL HAL ใช้ได้เฉพาะที่ไฟล์ Manifest เมตาเวอร์ชัน 2.0 ขึ้นไปnative
: HAL เนทีฟ
manifest.hal.max-level
- ไม่บังคับ ใช้ได้ในไฟล์ Manifest ของเฟรมเวิร์กเท่านั้น หากมีการตั้งค่า HAL ที่มีระดับสูงสุดต่ำกว่า กว่าเวอร์ชัน FCM เป้าหมายในไฟล์ Manifest ของเฟรมเวิร์กที่ปิดใช้อยู่
manifest.hal.override
- ไม่บังคับ ค่าอาจเป็นค่าใดค่าหนึ่งต่อไปนี้
true
: ลบล้างองค์ประกอบ<hal>
อื่นๆ ด้วย<name>
และเวอร์ชันหลักเดียวกัน หากไม่ใช่<version>
หรือ<fqname>
อยู่ในกลุ่มนี้ องค์ประกอบ<hal>
ตามด้วยองค์ประกอบ<hal>
ประกาศว่าจะปิดใช้ HAL นี้false
: อย่าลบล้างองค์ประกอบ<hal>
อื่นๆ ที่มี<name>
และเวอร์ชันหลักเดียวกัน
manifest.hal.name
- ต้องระบุ ชื่อแพ็กเกจแบบเต็มของ HAL รายการ HAL หลายรายการสามารถใช้ได้
ชื่อเดียวกัน ตัวอย่าง:
android.hardware.camera
(HIDL หรือ AIDL HAL)GLES
(HAL แบบดั้งเดิม ต้องใช้ชื่อเท่านั้น)
manifest.hal.transport
- ต้องระบุเมื่อ
manifest.hal.format == "hidl"
ต้องไม่เป็น หรือไม่เช่นนั้น ระบุว่าใช้การขนส่งใดเมื่ออินเทอร์เฟซมาจาก ระบบจะค้นหาแพ็กเกจนี้จาก Service Manager ค่าอาจเป็นค่าใดค่าหนึ่งต่อไปนี้hwbinder
: โหมดรวมpassthrough
: โหมดส่งผ่าน
- ไม่บังคับเมื่อ
manifest.hal.format == "aidl"
ต้องไม่เป็น หรือไม่เช่นนั้น ระบุการขนส่งที่ใช้เมื่อมีการแสดงอินเทอร์เฟซ จากระยะไกล ค่าต้องมีลักษณะดังนี้inet
: ซ็อกเก็ต Inet
manifest.hal.transport.ip
และmanifest.hal.transport.port
เพื่อระบุข้อมูลการเชื่อมต่อ Inet เพิ่มเติม manifest.hal.transport.arch
- ต้องระบุสำหรับ
passthrough
และต้องแสดงเป็นเวลาhwbinder
อธิบายความเป็นบิตของบริการส่งผ่าน (Pass Through) ที่ถูก ที่มีให้ ค่าอาจเป็นค่าใดค่าหนึ่งต่อไปนี้32
: โหมด 32 บิต64
: โหมด 64 บิต32+64
: ทั้งคู่
manifest.hal.transport.ip
- ต้องระบุสำหรับ
inet
และต้องไม่มีอยู่ในกรณีอื่น อธิบายที่อยู่ IP จากอินเทอร์เฟซระยะไกลที่กำลังแสดงผล manifest.hal.transport.port
- ต้องระบุสำหรับ
inet
และต้องไม่มีอยู่ในกรณีอื่น อธิบายท่าเรือต้นทาง อินเทอร์เฟซระยะไกลที่กำลังแสดงผลอยู่ manifest.hal.version
- ไม่บังคับ ทำซ้ำได้ เวอร์ชันสำหรับแท็ก
hal
ใน ไฟล์ Manifest
รูปแบบ HIDL และ HAL แบบเนทีฟคือMAJOR.MINOR
สำหรับ ตัวอย่าง โปรดดูที่hardware/interfaces
vendor/${VENDOR}/interfaces
,frameworks/hardware/interfaces
หรือsystem/hardware/interfaces
HIDL และ HAL เนทีฟอาจใช้ช่องเวอร์ชันหลายช่องตราบใดที่ช่องเหล่านั้นแสดง เวอร์ชันหลักที่แตกต่างกัน โดยมีเวอร์ชันย่อยเพียง 1 เวอร์ชันต่อเวอร์ชันหลัก เวอร์ชันที่ให้ไว้ ตัวอย่างเช่น 3.1 และ 3.2 อยู่ร่วมกันไม่ได้ แต่ 1.0 และ 3.4 อยู่ร่วมกันไม่ได้ การตั้งค่านี้จะมีผลกับองค์ประกอบhal
ทั้งหมดที่มีชื่อเดียวกัน ยกเว้นoverride="true"
ค่าของ<version>
ไม่เท่ากับ เชื่อมโยงกับ<fqname>
เนื่องจาก<fqname>
จะมีเวอร์ชัน
สำหรับ AIDL HAL ต้องไม่มี<version>
ในอุปกรณ์ที่ใช้ Android 11 และต่ำกว่า<version>
ต้องเป็น จำนวนเต็มเดียวในอุปกรณ์ที่ใช้ Android 12 ขึ้นไป ต้องมี<version>
ไม่เกิน 1 รายการต่อ(package, interface, instance)
Tuple หากไม่มี ให้ใช้ค่าเริ่มต้นเป็น1
ค่าของ<version>
เชื่อมโยงกับ<fqname>
ทั้งหมดใน<hal>
เดียวกันเนื่องจาก<fqname>
ไม่มีเวอร์ชัน manifest.hal.interface
- ต้องระบุ สามารถทำซ้ำโดยไม่ซ้ำ ระบุอินเทอร์เฟซใน
แพ็กเกจที่มีชื่ออินสแตนซ์ สามารถแสดงผลได้หลายรายการ
<interface>
องค์ประกอบใน<hal>
ชื่อ ต้องไม่ซ้ำกัน manifest.hal.interface.name
- ต้องระบุ ชื่ออินเทอร์เฟซ
manifest.hal.interface.instance
- ต้องระบุ ทำซ้ำได้ ชื่ออินสแตนซ์ของอินเทอร์เฟซ สามารถมีได้หลายรายการ
อินสแตนซ์สำหรับอินเทอร์เฟซ แต่ไม่มี
<instance>
ที่ซ้ำกัน องค์ประกอบ manifest.hal.fqname
- ไม่บังคับ ทำซ้ำได้ อีกวิธีหนึ่งในการระบุอินสแตนซ์สำหรับ HAL
ด้วยชื่อ
manifest.hal.name
- สำหรับ HIDL HAL รูปแบบคือ
@MAJOR.MINOR::INTERFACE/INSTANCE
- สำหรับ AIDL HAL รูปแบบคือ
INTERFACE/INSTANCE
- สำหรับ HIDL HAL รูปแบบคือ
manifest.sepolicy
- ต้องระบุ มีรายการที่เกี่ยวข้องกับ Sepolicy ทั้งหมด
manifest.sepolicy.version
- ต้องระบุสำหรับไฟล์ Manifest ของอุปกรณ์ ประกาศเวอร์ชัน SELinux โดยมี
รูปแบบ
SDK_INT.PLAT_INT
manifest.vendor-ndk
- ต้องระบุ ทำซ้ำได้ สำหรับไฟล์ Manifest ของเฟรมเวิร์ก ต้องไม่มี
ในไฟล์ Manifest ของอุปกรณ์ รายการ
<vendor-ndk>
หลายรายการต้องมี<version>
ที่แตกต่างกัน อธิบายชุดสแนปชอต VNDK จากเฟรมเวิร์ก manifest.vendor-ndk.version
- ต้องระบุ ค่านี้เป็นจำนวนเต็มบวกที่แสดงเวอร์ชันของ VNDK
manifest.vendor-ndk.library
- ไม่บังคับ สามารถเล่นซ้ำได้ ไม่ซ้ำ อธิบายชุดของไลบรารี VNDK
ที่ให้บริการโดยเฟรมเวิร์กสำหรับภาพรวมผู้ให้บริการ VNDK นี้ ค่าจะเป็น
ชื่อไฟล์ของไลบรารี เช่น
libjpeg.so
รวมถึงคำนำหน้าlib
และคำต่อท้าย.so
ไม่มีคอมโพเนนต์เส้นทาง ได้รับอนุญาต manifest.system-sdk.version
- ไม่บังคับ สามารถซ้ำได้ ไม่ซ้ำ ที่ใช้โดยเฟรมเวิร์กเท่านั้น ไฟล์ Manifest อธิบายชุดเวอร์ชัน SDK ของระบบที่เฟรมเวิร์กมีให้ แอปของผู้ให้บริการ
manifest.kernel
- ไม่บังคับ อธิบายข้อมูลแบบคงที่เกี่ยวกับเคอร์เนล
manifest.kernel.target-level
- ไม่บังคับ อธิบาย Branch ของเคอร์เนล ค่าเริ่มต้นคือ
manifest.target-level
หากไม่มี ต้องมากกว่า หรือเท่ากับmanifest.target-level
โปรดดู กฎการจับคู่เคอร์เนล เพื่อดูรายละเอียด