ประจักษ์

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

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

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

  • รายการผู้ขายระบุ HALs, รุ่นนโยบาย SELinux ฯลฯ ที่เหมือนกันกับ SoC ก็จะแนะนำให้อยู่ในแหล่งต้นไม้ Android ที่ device/ VENDOR / DEVICE /manifest.xml แต่ไฟล์ส่วนหลายคนสามารถนำมาใช้ ดูรายละเอียด ชิ้นส่วน Manifest และ สร้าง DM จากเศษ
  • รายการ 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 จะถูกใช้ รายการ ODM อาจแทนที่รายการผู้ขายดั้งเดิมอย่างสมบูรณ์
    • บนอุปกรณ์ที่เปิดตัวด้วย 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>

สำหรับรายละเอียดเพิ่มเติมโปรดดูที่ อุปกรณ์การพัฒนา Manifest

รายการกรอบงาน

ไฟล์ Manifest กรอบงานประกอบด้วยรายการระบบ รายการผลิตภัณฑ์ และรายการ System_ext

  • ประจักษ์ระบบ (ให้บริการโดย Google) จะถูกสร้างขึ้นด้วยตนเองและชีวิตในแหล่งต้นไม้ Android ที่ /system/libhidl/manifest.xml
  • รายการผลิตภัณฑ์ (จัดเตรียมโดยอุปกรณ์) แสดงรายการ HAL ที่ให้บริการโดยโมดูลที่ติดตั้งบนพาร์ติชันผลิตภัณฑ์
  • รายการ system_ext (ให้มาโดยอุปกรณ์) แสดงรายการต่อไปนี้:
    • HAL ที่ให้บริการโดยโมดูลที่ติดตั้งบนพาร์ติชัน system_ext
    • เวอร์ชัน VNDK;
    • เวอร์ชัน SDK ของระบบ

เช่นเดียวกับรายการอุปกรณ์ คุณสามารถใช้ไฟล์แฟรกเมนต์หลายไฟล์ได้ ดูรายละเอียด ชิ้นส่วน 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>

เศษชิ้นส่วนที่ประจักษ์

ใน 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 สร้าง Manifest สำหรับโมดูลนี้ ณ เวลาสร้าง รายการนี้จะถูกเพิ่มลงในอุปกรณ์ การเพิ่มรายการที่นี่เหมือนกับการเพิ่มรายการในรายการหลักของอุปกรณ์ ซึ่งช่วยให้ไคลเอ็นต์ใช้อินเทอร์เฟซและอนุญาตให้ VTS ระบุการใช้งาน HAL บนอุปกรณ์ได้ อะไรก็ตามที่รายการปกติทำ รายการนี้ก็เช่นกัน

ตัวอย่างด้านล่างนี้ดำเนิน 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>

สคีมาไฟล์มานิเฟสต์

ส่วนนี้อธิบายความหมายของแท็ก XML เหล่านี้ บางคน "ที่จำเป็น" แท็กสามารถหายไปจากแฟ้มแหล่งที่มาใน Android แหล่งต้นไม้และเขียนโดย assemble_vintf เวลาที่สร้าง แท็กที่จำเป็นต้องมีอยู่ในไฟล์ที่เกี่ยวข้องบนอุปกรณ์

?xml
ไม่จำเป็น. ให้ข้อมูลแก่ตัวแยกวิเคราะห์ XML เท่านั้น
manifest.version
ที่จำเป็น. Meta รุ่นของประจักษ์นี้ อธิบายองค์ประกอบที่คาดหวังในรายการ ไม่เกี่ยวข้องกับเวอร์ชัน XML
manifest.type
ที่จำเป็น. ประเภทของรายการนี้ มันมีค่า device สำหรับไฟล์ Manifest อุปกรณ์และ framework สำหรับไฟล์ Manifest กรอบ
manifest.target-level
จำเป็นสำหรับรายการอุปกรณ์ ระบุเวอร์ชันเมทริกซ์ความเข้ากันได้ของเฟรมเวิร์ก (FCM) ที่รายการอุปกรณ์นี้กำหนดเป้าหมายให้เข้ากันได้ ซึ่งเรียกอีกอย่างว่าเวอร์ชัน FCM สำหรับการจัดส่งของอุปกรณ์
manifest.hal
ไม่บังคับ สามารถทำซ้ำได้ เดียว HAL (HIDL หรือพื้นเมืองเช่น GL) ขึ้นอยู่กับ format แอตทริบิวต์
manifest.hal.format
ไม่จำเป็น. ค่าสามารถเป็นหนึ่งใน:
  • hidl : HIDL HALs นี่คือค่าเริ่มต้น
  • aidl : HALs AIDL ใช้ได้เฉพาะในรายการ meta-เวอร์ชัน 2.0 ขึ้นไปเท่านั้น
  • native HALs พื้นเมือง:
manifest.hal.max-level
ไม่จำเป็น. ใช้ได้เฉพาะกับรายการเฟรมเวิร์กเท่านั้น หากตั้งค่าไว้ HAL ที่มีระดับสูงสุดต่ำกว่า Target FCM Version ในรายการเฟรมเวิร์กจะถูกปิดใช้งาน
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 : โหมด 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 และ HALs พื้นเมืองรูปแบบคือ MAJOR . MINOR สำหรับตัวอย่างหมายถึง hardware/interfaces , vendor/${VENDOR}/interfaces , framework/hardware/interfaces หรือ system/hardware/interfaces

HIDL และ HALs พื้นเมืองอาจจะใช้หลายสาขารุ่นตราบเท่าที่พวกเขาเป็นตัวแทนของรุ่นใหญ่ที่แตกต่างกันมีเพียงรุ่นรองต่อหนึ่งรุ่นใหญ่ที่มีให้ ตัวอย่างเช่น 3.1 และ 3.2 ไม่สามารถอยู่ร่วมกันได้ แต่ 1.0 และ 3.4 สามารถอยู่ร่วมกันได้ สามารถใช้ได้กับทุก hal องค์ประกอบที่มีชื่อเดียวกันเว้นแต่ override="true" ค่าของ <version> จะไม่เกี่ยวข้องกับ <fqname> เพราะ <fqname> ดำเนินรุ่น

สำหรับ AIDL HALs, <version> ต้องไม่อยู่บนอุปกรณ์ที่ใช้ Android 11 และด้านล่าง <version> ต้องเป็นจำนวนเต็มเดียวบนอุปกรณ์ที่ใช้ Android 12 ปีขึ้นไป ต้องมีมากที่สุดคนหนึ่ง <version> สำหรับแต่ละ (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
ไม่บังคับ สามารถทำซ้ำได้ ทางเลือกในการระบุเช่นฮาลที่มีชื่อ manifest.hal.name
  • สำหรับ HALs HIDL รูปแบบคือ @ MAJOR . MINOR :: INTERFACE / INSTANCE
  • สำหรับ HALs AIDL รูปแบบคือ INTERFACE / INSTANCE
manifest.sepolicy
ที่จำเป็น. มีรายการที่เกี่ยวข้องกับ sepolicy ทั้งหมด
manifest.sepolicy.version
จำเป็นสำหรับรายการอุปกรณ์ ประกาศเวอร์ชัน SELinux มันมีรูปแบบ SDK_INT . PLAT_INT
manifest.vendor-ndk
จำเป็น สามารถทำซ้ำได้ ที่จำเป็นสำหรับรายการกรอบงาน ต้องไม่มีอยู่ในรายการอุปกรณ์ หลาย <vendor-ndk> รายการที่แตกต่างกันจะต้องมี <version> s อธิบายชุดของสแน็ปช็อต 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 ดู กฎการแข่งขันเคอร์เนล สำหรับรายละเอียด