ไฟล์ Manifest

อ็อบเจ็กต์ VINTF รวบรวมข้อมูลจาก รายการอุปกรณ์ และไฟล์ รายการเฟรมเวิร์ก (XML) ไฟล์ Manifest ทั้งสองมีรูปแบบร่วมกัน แม้ว่าองค์ประกอบบางอย่างอาจไม่ใช้กับทั้งสองรายการก็ตาม (สำหรับรายละเอียดเกี่ยวกับสคีมา โปรดดูที่ สคีมาไฟล์ Manifest )

รายการอุปกรณ์

รายการอุปกรณ์ (จัดเตรียมโดยอุปกรณ์) ประกอบด้วยรายการผู้ขายและรายการ ODM

  • รายการผู้ขายระบุ HAL, เวอร์ชันนโยบาย SELinux ฯลฯ ทั่วไปสำหรับ SoC ขอแนะนำให้วางในแผนผังแหล่งที่มาของ Android ที่ device/ VENDOR / DEVICE /manifest.xml แต่สามารถใช้ไฟล์แฟรกเมนต์ได้หลายไฟล์ สำหรับรายละเอียด โปรดดูที่ Manifest Fragment และ สร้าง DM จาก Fragment
  • รายการ ODM แสดงรายการ HAL เฉพาะสำหรับผลิตภัณฑ์ใน พาร์ติชัน ODM อ็อบเจ็กต์ VINTF โหลดรายการ ODM ตามลำดับนี้:
    1. หากมีการกำหนด SKU (โดยที่ SKU คือค่าของคุณสมบัติ ro.boot.product.hardware.sku ) /odm/etc/vintf/manifest_ SKU .xml
    2. /odm/etc/vintf/manifest.xml
    3. หากมีการกำหนด SKU /odm/etc/manifest_ SKU .xml
    4. /odm/etc/manifest.xml
  • รายการของผู้จัดจำหน่ายแสดงรายการ HAL เฉพาะสำหรับผลิตภัณฑ์ในพาร์ติชันของผู้จัดจำหน่าย อ็อบเจ็กต์ VINTF โหลดรายการผู้ขายตามลำดับนี้:
    1. หากมีการกำหนด SKU (โดยที่ SKU คือค่าของคุณสมบัติ ro.boot.product.vendor.sku ) /vendor/etc/vintf/manifest_ SKU .xml
    2. /vendor/etc/vintf/manifest.xml
  • อ็อบเจ็กต์ VINTF โหลดรายการอุปกรณ์ตามลำดับนี้:
    1. หากมีรายการผู้ขายอยู่ ให้รวมสิ่งต่อไปนี้:
      1. รายการผู้ขาย
      2. ส่วนรายการของผู้จัดจำหน่ายที่เป็นตัวเลือก
      3. รายการ ODM ทางเลือก
      4. แฟรกเมนต์รายการ ODM ทางเลือก
    2. มิฉะนั้น หากมีรายการ ODM ให้รวมรายการ ODM เข้ากับส่วนย่อยรายการ ODM ที่เป็นทางเลือก
    3. /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>

สคีมาไฟล์รายการ

ส่วนนี้จะอธิบายความหมายของแท็ก 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
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 ดู กฎการจับคู่เคอร์เนล สำหรับรายละเอียด