อ็อบเจ็กต์ VINTF รวบรวมข้อมูลจาก รายการอุปกรณ์ และไฟล์ รายการเฟรมเวิร์ก (XML) ไฟล์ Manifest ทั้งสองมีรูปแบบร่วมกัน แม้ว่าองค์ประกอบบางอย่างอาจไม่ใช้กับทั้งสองรายการก็ตาม (สำหรับรายละเอียดเกี่ยวกับสคีมา โปรดดูที่ สคีมาไฟล์ Manifest )
รายการอุปกรณ์
รายการอุปกรณ์ (จัดเตรียมโดยอุปกรณ์) ประกอบด้วยรายการผู้ขายและรายการ ODM
- รายการผู้ขายระบุ HAL, เวอร์ชันนโยบาย SELinux ฯลฯ ทั่วไปสำหรับ SoC ขอแนะนำให้วางในแผนผังแหล่งที่มาของ Android ที่
device/ VENDOR / DEVICE /manifest.xml
แต่สามารถใช้ไฟล์แฟรกเมนต์ได้หลายไฟล์ สำหรับรายละเอียด โปรดดูที่ Manifest Fragment และ สร้าง DM จาก Fragment - รายการ ODM แสดงรายการ HAL เฉพาะสำหรับผลิตภัณฑ์ใน พาร์ติชัน ODM อ็อบเจ็กต์ VINTF โหลดรายการ 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
- หากมีการกำหนด
- รายการของผู้จัดจำหน่ายแสดงรายการ HAL เฉพาะสำหรับผลิตภัณฑ์ในพาร์ติชันของผู้จัดจำหน่าย อ็อบเจ็กต์ VINTF โหลดรายการผู้ขายตามลำดับนี้:
- หากมีการกำหนด
SKU
(โดยที่SKU
คือค่าของคุณสมบัติro.boot.product.vendor.sku
)/vendor/etc/vintf/manifest_ SKU .xml
-
/vendor/etc/vintf/manifest.xml
- หากมีการกำหนด
- อ็อบเจ็กต์ VINTF โหลดรายการอุปกรณ์ตามลำดับนี้:
- หากมีรายการผู้ขายอยู่ ให้รวมสิ่งต่อไปนี้:
- รายการผู้ขาย
- ส่วนรายการของผู้จัดจำหน่ายที่เป็นตัวเลือก
- รายการ ODM ทางเลือก
- แฟรกเมนต์รายการ ODM ทางเลือก
- มิฉะนั้น หากมีรายการ ODM ให้รวมรายการ ODM เข้ากับส่วนย่อยรายการ ODM ที่เป็นทางเลือก
-
/vendor/manifest.xml
(ดั้งเดิม ไม่มีแฟรกเมนต์)
โปรดทราบว่า:
- บนอุปกรณ์ระบบเดิม รายการของผู้ขายระบบเดิมและรายการ ODM จะถูกนำมาใช้ ไฟล์ Manifest ของ ODM อาจแทนที่ไฟล์ Manifest ของผู้จำหน่ายเดิมโดยสิ้นเชิง
- บนอุปกรณ์ที่เปิดตัวด้วย Android 9 รายการ ODM จะถูกรวมเข้ากับรายการของผู้จำหน่าย
- เมื่อรวมรายการของรายการ รายการที่ปรากฏในภายหลังในรายการอาจแทนที่แท็กในรายการที่ปรากฏก่อนหน้าในรายการ โดยมีเงื่อนไขว่าแท็กในรายการภายหลังจะมีแอตทริบิวต์
override="true"
ตัวอย่างเช่น รายการ ODM อาจแทนที่แท็ก<hal>
บางส่วนจากรายการของผู้ขาย ดูเอกสารประกอบสำหรับการแทนที่override
ด้านล่าง
- หากมีรายการผู้ขายอยู่ ให้รวมสิ่งต่อไปนี้:
การตั้งค่านี้ช่วยให้ผลิตภัณฑ์หลายรายการที่มีบอร์ดเดียวกันสามารถแบ่งปันอิมเมจของผู้จำหน่ายเดียวกัน (ซึ่งมี HAL ทั่วไป) แต่มีอิมเมจ ODM ที่แตกต่างกัน (ซึ่งระบุ HAL เฉพาะผลิตภัณฑ์)
นี่คือตัวอย่างรายการผู้ขาย
<?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>
นี่คือตัวอย่างรายการ 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>
นี่คือตัวอย่างรายการอุปกรณ์ในแพ็คเกจ 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>
สำหรับรายละเอียดเพิ่มเติม โปรดดูที่ Device Manifest Development
รายการกรอบงาน
ไฟล์รายการเฟรมเวิร์กประกอบด้วยรายการระบบ รายการผลิตภัณฑ์ และรายการ system_ext
- รายการระบบ (จัดทำโดย Google) ถูกสร้างขึ้นด้วยตนเองและอยู่ในแผนผังต้นทางของ Android ที่
/system/libhidl/manifest.xml
- รายการผลิตภัณฑ์ (จัดเตรียมโดยอุปกรณ์) แสดงรายการ HAL ที่ให้บริการโดยโมดูลที่ติดตั้งบนพาร์ติชันผลิตภัณฑ์
- รายการ system_ext (มาจากอุปกรณ์) แสดงรายการต่อไปนี้:
- HAL ที่ให้บริการโดยโมดูลที่ติดตั้งบนพาร์ติชัน system_ext
- เวอร์ชัน VNDK;
- เวอร์ชันของระบบ SDK
เช่นเดียวกับรายการอุปกรณ์ สามารถใช้ไฟล์แฟรกเมนต์ได้หลายไฟล์ สำหรับรายละเอียด โปรดดูที่ Manifest Fragment
นี่คือตัวอย่างรายการกรอบงาน
<?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>
เผยให้เห็นชิ้นส่วน
ใน Android 10 ขึ้นไป คุณสามารถเชื่อมโยงรายการรายการกับโมดูล 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
ให้สร้างรายการสำหรับโมดูลนี้ ณ เวลาสร้าง รายการนี้จะถูกเพิ่มไปยังอุปกรณ์ การเพิ่มรายการที่นี่เหมือนกับการเพิ่มรายการในรายการหลักของอุปกรณ์ ซึ่งช่วยให้ไคลเอ็นต์ใช้อินเทอร์เฟซและอนุญาตให้ VTS ระบุการใช้งาน HAL บนอุปกรณ์ได้ สิ่งใดก็ตามที่รายการปกติทำ รายการนี้ก็ทำเช่นกัน
ตัวอย่างด้านล่างนี้ใช้ android.hardware.foo@1.0::IFoo/default
ซึ่งติดตั้งไว้ใน vendor
หรือพาร์ติชัน odm
หากมีการติดตั้งไว้ใน system
, product
หรือพาร์ติชัน system_ext
ให้ใช้ type framework
แทน type 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 ให้จัดทำแพ็กเกจชิ้นส่วน VINTF ที่เกี่ยวข้องภายใน APEX เดียวกันกับ `prebuilt_etc` ตามที่อธิบายไว้ใน ชิ้นส่วน VINTF
สคีมาไฟล์รายการ
ส่วนนี้จะอธิบายความหมายของแท็ก XML เหล่านี้ แท็ก "จำเป็น" บางแท็กอาจหายไปจากไฟล์ต้นฉบับในแผนผังซอร์สของ Android และเขียนโดย assemble_vintf
ณ เวลาสร้าง แท็กที่จำเป็นจะต้องแสดงอยู่ในไฟล์ที่เกี่ยวข้องบนอุปกรณ์
-
?xml
- ไม่จำเป็น. ให้ข้อมูลแก่ตัวแยกวิเคราะห์ XML เท่านั้น
-
manifest.version
- ที่จำเป็น. เวอร์ชัน Meta ของไฟล์ Manifest นี้ อธิบายองค์ประกอบที่คาดหวังในรายการ ไม่เกี่ยวข้องกับเวอร์ชัน XML
-
manifest.type
- ที่จำเป็น. ประเภทของรายการนี้ โดยมี
device
ค่าสำหรับไฟล์รายการอุปกรณ์และframework
สำหรับไฟล์รายการกรอบงาน -
manifest.target-level
- จำเป็นสำหรับรายการอุปกรณ์ ระบุเวอร์ชันเมทริกซ์ความเข้ากันได้ของเฟรมเวิร์ก (FCM) ที่รายการอุปกรณ์นี้มีเป้าหมายเพื่อให้เข้ากันได้ ซึ่งเรียกอีกอย่างว่าอุปกรณ์เวอร์ชัน FCM ในการจัดส่ง
-
manifest.hal
- ไม่บังคับ สามารถทำซ้ำได้ HAL เดียว (HIDL หรือเนทิฟ เช่น GL) ขึ้นอยู่กับแอตทริบิวต์
format
-
manifest.hal.format
- ไม่จำเป็น. ค่าสามารถเป็นหนึ่งใน:
-
hidl
: HIDL HAL นี่คือค่าเริ่มต้น -
aidl
: AIDL HALs ใช้ได้เฉพาะที่ Manifest Meta-เวอร์ชัน 2.0 ขึ้นไปเท่านั้น -
native
: HAL พื้นเมือง
-
-
manifest.hal.max-level
- ไม่จำเป็น. ใช้ได้เฉพาะกับเฟรมเวิร์ก Manifest เท่านั้น หากตั้งค่าไว้ HAL ที่มีระดับสูงสุดต่ำกว่าเวอร์ชัน FCM เป้าหมายในรายการเฟรมเวิร์กจะถูกปิดใช้งาน
-
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"
จะต้องไม่ปรากฏเป็นอย่างอื่น ระบุการขนส่งที่จะใช้เมื่อมีการสอบถามอินเทอร์เฟซจากแพ็คเกจนี้จากผู้จัดการฝ่ายบริการ ค่าสามารถเป็นหนึ่งใน:-
hwbinder
: โหมด Binderized -
passthrough
: โหมดพาสทรู
-
- ไม่บังคับเมื่อ
manifest.hal.format == "aidl"
จะต้องไม่ปรากฏเป็นอย่างอื่น ระบุการขนส่งที่ใช้เมื่อมีการให้บริการอินเทอร์เฟซจากระยะไกล ค่าจะต้องเป็น:-
inet
: ซ็อกเก็ต Inet
manifest.hal.transport.ip
และmanifest.hal.transport.port
เพื่อระบุข้อมูลการเชื่อมต่อ Inet เพิ่มเติม -
-
manifest.hal.transport.arch
- จำเป็นสำหรับ
passthrough
และต้องไม่ปรากฏสำหรับhwbinder
อธิบายความเป็นบิตของบริการส่งผ่านที่มีให้ ค่าสามารถเป็นหนึ่งใน:-
32
: โหมด 32 บิต - โหมด
64
: 64 บิต -
32+64
: ทั้งคู่
-
-
manifest.hal.transport.ip
- จำเป็นสำหรับ
inet
และจะต้องไม่ปรากฏเป็นอย่างอื่น อธิบายที่อยู่ IP ที่ใช้อินเทอร์เฟซระยะไกล -
manifest.hal.transport.port
- จำเป็นสำหรับ
inet
และจะต้องไม่ปรากฏเป็นอย่างอื่น อธิบายพอร์ตที่ใช้รีโมตอินเตอร์เฟสให้บริการ -
manifest.hal.version
- ไม่บังคับ สามารถทำซ้ำได้ เวอร์ชันสำหรับแท็ก
hal
ในรายการ
สำหรับ HIDL และ HAL ดั้งเดิม รูปแบบจะเป็นMAJOR . MINOR
. ตัวอย่างเช่น อ้างอิงถึงhardware/interfaces
,vendor/${VENDOR}/interfaces
,frameworks/hardware/interfaces
หรือsystem/hardware/interfaces
HIDL และ HAL แบบเนทีฟอาจใช้ช่องเวอร์ชันหลายช่องได้ ตราบใดที่ช่องเหล่านั้นแสดงถึง เวอร์ชันหลักที่แตกต่างกัน โดยมีการระบุเวอร์ชันรองเพียงเวอร์ชันรองต่อเวอร์ชันหลักเท่านั้น ตัวอย่างเช่น 3.1 และ 3.2 ไม่สามารถอยู่ร่วมกันได้ แต่ 1.0 และ 3.4 สามารถอยู่ร่วมกันได้ สิ่งนี้ใช้กับองค์ประกอบhal
ทั้งหมดที่มีชื่อเดียวกัน เว้นแต่override="true"
ค่าของ<version>
ไม่เชื่อมโยงกับ<fqname>
เนื่องจาก<fqname>
มีเวอร์ชันอยู่
สำหรับ AIDL HAL จะต้องไม่แสดง<version>
ในอุปกรณ์ที่ใช้ Android 11 และต่ำกว่า<version>
ต้องเป็นจำนวนเต็มเดียวบนอุปกรณ์ที่ใช้ Android 12 ขึ้นไป ต้องมีอย่างน้อยหนึ่ง<version>
สำหรับแต่ละทูเพิล(package, interface, instance)
หากไม่มี ให้ตั้งค่าเริ่มต้นเป็น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
- จำเป็นสำหรับรายการอุปกรณ์ ประกาศเวอร์ชัน SELinux มันมีรูปแบบ
SDK_INT . PLAT_INT
-
manifest.vendor-ndk
- จำเป็น สามารถทำซ้ำได้ จำเป็นสำหรับรายการกรอบงาน ต้องไม่มีอยู่ในรายการอุปกรณ์ รายการ
<vendor-ndk>
หลายรายการต้องมี<version>
ที่แตกต่างกัน อธิบายชุดของสแน็ปช็อต VNDK ที่จัดทำโดยเฟรมเวิร์ก -
manifest.vendor-ndk.version
- ที่จำเป็น. นี่เป็นจำนวนเต็มบวกซึ่งแสดงถึงเวอร์ชันของสแนปชอต VNDK
-
manifest.vendor-ndk.library
- ไม่จำเป็น สามารถทำซ้ำได้โดยไม่ซ้ำกัน อธิบายชุดของไลบรารี VNDK ที่จัดทำโดยเฟรมเวิร์กสำหรับสแน็ปช็อตผู้ขาย VNDK นี้ ค่านี้คือชื่อไฟล์ของไลบรารี เช่น
libjpeg.so
รวมถึงคำนำหน้าlib
และส่วนต่อท้าย.so
ไม่อนุญาตให้ใช้ส่วนประกอบเส้นทาง -
manifest.system-sdk.version
- ไม่จำเป็น สามารถทำซ้ำได้โดยไม่ซ้ำกัน ใช้โดยรายการกรอบงานเท่านั้น อธิบายชุดเวอร์ชัน SDK ของระบบที่เฟรมเวิร์กมอบให้กับแอปของผู้จำหน่าย
-
manifest.kernel
- ไม่จำเป็น. อธิบายข้อมูลคงที่เกี่ยวกับเคอร์เนล
-
manifest.kernel.target-level
- ไม่จำเป็น. อธิบายสาขาเคอร์เนล ค่าของมันจะมีค่าเริ่มต้นเป็น
manifest.target-level
หากไม่มีอยู่ ต้องมากกว่าหรือเท่ากับmanifest.target-level
ดู กฎการจับคู่เคอร์เนล สำหรับรายละเอียด