मेनिफ़ेस्ट

एक VINTF ऑब्जेक्ट डिवाइस मेनिफेस्ट और फ्रेमवर्क मेनिफेस्ट फ़ाइलों (XML) से डेटा एकत्र करता है। दोनों मेनिफेस्ट एक प्रारूप साझा करते हैं, हालांकि सभी तत्व दोनों पर लागू नहीं होते हैं (स्कीमा पर विवरण के लिए, मेनिफेस्ट फ़ाइल स्कीमा देखें)।

डिवाइस मेनिफेस्ट

डिवाइस मेनिफेस्ट (डिवाइस द्वारा प्रदान किया गया) में विक्रेता मेनिफेस्ट और ODM मेनिफेस्ट शामिल हैं।

  • विक्रेता मैनिफ़ेस्ट SoC के लिए सामान्य HALs, SELinux नीति संस्करण आदि निर्दिष्ट करता है। इसे एंड्रॉइड स्रोत ट्री में device/ VENDOR / DEVICE /manifest.xml पर रखने की अनुशंसा की जाती है, लेकिन एकाधिक खंड फ़ाइलों का उपयोग किया जा सकता है। विवरण के लिए, टुकड़ों को प्रकट करें और टुकड़ों से डीएम उत्पन्न करें देखें।
  • ODM मेनिफेस्ट ODM विभाजन में उत्पाद के लिए विशिष्ट HAL को सूचीबद्ध करता है। 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
  • विक्रेता मैनिफेस्ट विक्रेता विभाजन में उत्पाद के लिए विशिष्ट एचएएल को सूचीबद्ध करता है। 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 मेनिफेस्ट लीगेसी विक्रेता मेनिफेस्ट को पूरी तरह से ओवरराइड कर सकता है।
    • एंड्रॉइड 9 के साथ लॉन्च किए गए उपकरणों पर, ODM मेनिफेस्ट को विक्रेता मेनिफेस्ट के साथ जोड़ा जाता है।
    • मेनिफेस्टों की सूची को संयोजित करते समय, सूची में बाद में दिखाई देने वाले मेनिफेस्ट सूची में पहले दिखाई देने वाले मेनिफेस्टों में टैग को ओवरराइड कर सकते हैं, बशर्ते कि बाद में मेनिफेस्ट में टैग में override="true" विशेषता हो। उदाहरण के लिए, ODM मेनिफेस्ट विक्रेता मेनिफेस्ट से कुछ <hal> टैग को ओवरराइड कर सकता है। नीचे विशेषता override के लिए दस्तावेज़ देखें।

यह सेटअप एक ही बोर्ड के साथ कई उत्पादों को एक ही विक्रेता छवि (जो सामान्य एचएएल प्रदान करता है) साझा करने में सक्षम बनाता है, फिर भी अलग-अलग ओडीएम छवियां होती हैं (जो उत्पाद-विशिष्ट एचएएल निर्दिष्ट करती हैं)।

यहां एक उदाहरण विक्रेता मेनिफेस्ट है।

<?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>

अधिक विवरण के लिए, डिवाइस मेनिफेस्ट डेवलपमेंट देखें।

ढाँचा प्रकट

फ़्रेमवर्क मेनिफेस्ट फ़ाइल में सिस्टम मेनिफेस्ट, उत्पाद मेनिफेस्ट और system_ext मेनिफेस्ट शामिल हैं।

  • सिस्टम मेनिफेस्ट (Google द्वारा प्रदान किया गया) मैन्युअल रूप से जेनरेट किया गया है और /system/libhidl/manifest.xml पर एंड्रॉइड सोर्स ट्री में रहता है।
  • उत्पाद मैनिफेस्ट (डिवाइस द्वारा प्रदान किया गया) उत्पाद विभाजन पर स्थापित मॉड्यूल द्वारा सेवित एचएएल को सूचीबद्ध करता है।
  • System_ext मेनिफ़ेस्ट (डिवाइस द्वारा प्रदान किया गया) निम्नलिखित को सूचीबद्ध करता है:
    • system_ext विभाजन पर स्थापित मॉड्यूल द्वारा सेवित HALs;
    • वीएनडीके संस्करण;
    • सिस्टम एसडीके संस्करण.

डिवाइस मेनिफेस्ट के समान, एकाधिक खंड फ़ाइलों का उपयोग किया जा सकता है। विवरण के लिए, प्रकट अंश देखें।

यहां एक उदाहरण फ़्रेमवर्क मेनिफेस्ट है।

<?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>

प्रकट टुकड़े

एंड्रॉइड 10 और उच्चतर में, आप बिल्ड सिस्टम में एचएएल मॉड्यूल के साथ एक मेनिफेस्ट प्रविष्टि को जोड़ सकते हैं। इससे बिल्ड सिस्टम में एचएएल मॉड्यूल को सशर्त रूप से शामिल करना आसान हो जाता है।

उदाहरण

अपनी 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 नामक फ़ाइल में, इस मॉड्यूल के लिए मेनिफेस्ट बनाएं। निर्माण के समय, यह मेनिफेस्ट डिवाइस में जोड़ा जाता है। यहां एक प्रविष्टि जोड़ना डिवाइस के मुख्य मेनिफ़ेस्ट में एक प्रविष्टि जोड़ने के समान है। यह ग्राहकों को इंटरफ़ेस का उपयोग करने की अनुमति देता है और वीटीएस को यह पहचानने की अनुमति देता है कि डिवाइस पर कौन से एचएएल कार्यान्वयन हैं। जो कुछ भी नियमित मेनिफेस्ट करता है, यह मेनिफेस्ट भी करता है।

नीचे दिया गया उदाहरण android.hardware.foo@1.0::IFoo/default लागू करता है, जो vendor या odm विभाजन पर स्थापित है। यदि यह system , product , या system_ext विभाजन पर स्थापित है, तो टाइप device के बजाय टाइप framework उपयोग करें।

<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 टैग्स का अर्थ बताता है। कुछ "आवश्यक" टैग एंड्रॉइड स्रोत ट्री में स्रोत फ़ाइल से गायब हो सकते हैं और बिल्ड समय पर assemble_vintf द्वारा लिखे गए हो सकते हैं। आवश्यक टैग डिवाइस पर संबंधित फ़ाइलों में मौजूद होने चाहिए।

?xml
वैकल्पिक। केवल XML पार्सर को जानकारी प्रदान करता है।
manifest.version
आवश्यक। इस मेनिफेस्ट का मेटा-संस्करण। मेनिफेस्ट में अपेक्षित तत्वों का वर्णन करता है। XML संस्करण से असंबंधित.
manifest.type
आवश्यक। इस मेनिफेस्ट का प्रकार. इसमें डिवाइस मैनिफ़ेस्ट फ़ाइल के लिए वैल्यू device और फ़्रेमवर्क मेनिफेस्ट फ़ाइल के लिए framework
manifest.target-level
डिवाइस मेनिफ़ेस्ट के लिए आवश्यक है. फ़्रेमवर्क अनुकूलता मैट्रिक्स (FCM) संस्करण को निर्दिष्ट करता है जिसके साथ इस डिवाइस मेनिफेस्ट को संगत करने का लक्ष्य रखा गया है। इसे डिवाइस का शिपिंग FCM संस्करण भी कहा जाता है।
manifest.hal
वैकल्पिक, दोहरा सकते हैं. format विशेषता के आधार पर एक एकल एचएएल (एचआईडीएल या मूल, जैसे जीएल)।
manifest.hal.format
वैकल्पिक। मान इनमें से एक हो सकता है:
  • hidl : HIDL HALs। यह डिफ़ॉल्ट है.
  • aidl : एआईडीएल एचएएल । केवल मेनिफेस्ट मेटा-संस्करण 2.0 और इसके बाद के संस्करण पर मान्य है।
  • native : मूल निवासी एचएएल।
manifest.hal.max-level
वैकल्पिक। केवल फ्रेमवर्क मेनिफ़ेस्ट पर मान्य है। यदि सेट किया जाता है, तो फ्रेमवर्क मेनिफेस्ट में लक्ष्य एफसीएम संस्करण से कम अधिकतम स्तर वाले एचएएल अक्षम हो जाते हैं।
manifest.hal.override
वैकल्पिक। मान इनमें से एक हो सकता है:
  • true : समान <name> और प्रमुख संस्करण के साथ अन्य <hal> तत्वों को ओवरराइड करें। यदि इस <hal> तत्व में कोई <version> या <fqname> नहीं है, तो <hal> तत्व इस HAL को अक्षम घोषित कर देता है।
  • false : समान <name> और प्रमुख संस्करण के साथ अन्य <hal> तत्वों को ओवरराइड न करें।
manifest.hal.name
आवश्यक। एचएएल का पूर्णतः योग्य पैकेज नाम। एकाधिक एचएएल प्रविष्टियाँ एक ही नाम का उपयोग कर सकती हैं। उदाहरण:
  • android.hardware.camera (HIDL या AIDL HAL)
  • GLES (मूल एचएएल, केवल नाम की आवश्यकता है)
manifest.hal.transport
manifest.hal.format == "hidl" होने पर आवश्यक है। अन्यथा उपस्थित नहीं होना चाहिए. बताता है कि जब सेवा प्रबंधक से इस पैकेज के इंटरफ़ेस के बारे में पूछा जाता है तो किस परिवहन का उपयोग किया जाता है। मान इनमें से एक हो सकता है:
  • hwbinder : बाइंडराइज्ड मोड
  • passthrough : पासथ्रू मोड
वैकल्पिक जब manifest.hal.format == "aidl" । अन्यथा उपस्थित नहीं होना चाहिए. बताता है कि जब किसी इंटरफ़ेस को दूरस्थ रूप से परोसा जाता है तो किस परिवहन का उपयोग किया जाता है। मान होना चाहिए:
  • inet : इनेट सॉकेट
Inet कनेक्शन जानकारी को और अधिक निर्दिष्ट करने के लिए manifest.hal.transport.ip और manifest.hal.transport.port का उपयोग किया जाना चाहिए।
manifest.hal.transport.arch
passthrough के लिए आवश्यक है और hwbinder के लिए मौजूद नहीं होना चाहिए। प्रदान की जा रही पासथ्रू सेवा की कड़वाहट का वर्णन करता है। मान इनमें से एक हो सकता है:
  • 32 : 32-बिट मोड
  • 64 : 64-बिट मोड
  • 32+64 : दोनों
manifest.hal.transport.ip
inet के लिए आवश्यक है और अन्यथा मौजूद नहीं होना चाहिए। उस आईपी पते का वर्णन करता है जिससे रिमोट इंटरफ़ेस परोसा जा रहा है।
manifest.hal.transport.port
inet के लिए आवश्यक है और अन्यथा मौजूद नहीं होना चाहिए। उस पोर्ट का वर्णन करता है जिससे रिमोट इंटरफ़ेस परोसा जा रहा है।
manifest.hal.version
वैकल्पिक, दोहरा सकते हैं. मेनिफ़ेस्ट में hal टैग के लिए एक संस्करण।

एचआईडीएल और देशी एचएएल के लिए, प्रारूप MAJOR . MINOR । उदाहरण के लिए, hardware/interfaces , vendor/${VENDOR}/interfaces , frameworks/hardware/interfaces , या system/hardware/interfaces देखें।

एचआईडीएल और देशी एचएएल एकाधिक संस्करण फ़ील्ड का उपयोग तब तक कर सकते हैं जब तक वे अलग-अलग प्रमुख संस्करणों का प्रतिनिधित्व करते हैं, प्रत्येक प्रमुख संस्करण में केवल एक छोटा संस्करण प्रदान किया जाता है। उदाहरण के लिए, 3.1 और 3.2 एक साथ नहीं रह सकते, लेकिन 1.0 और 3.4 एक साथ रह सकते हैं। यह समान नाम वाले सभी hal तत्वों पर लागू होता है, जब तक कि override="true" न हो। <version> के मान <fqname> से संबद्ध नहीं हैं क्योंकि <fqname> में एक संस्करण होता है।

एआईडीएल एचएएल के लिए, <version> एंड्रॉइड 11 और उससे नीचे चलने वाले उपकरणों पर मौजूद नहीं होना चाहिए। <version> Android 12 और इसके बाद के संस्करण चलाने वाले उपकरणों पर एक पूर्णांक होना चाहिए। प्रत्येक (package, interface, instance) टपल के लिए अधिकतम एक <version> होना चाहिए। यदि मौजूद नहीं है, तो 1 पर डिफॉल्ट करें। <version> का मान उसी <hal> में सभी <fqname> के साथ जुड़ा हुआ है क्योंकि <fqname> में कोई संस्करण नहीं है।
manifest.hal.interface
आवश्यक है, डुप्लिकेट के बिना दोहराया जा सकता है। पैकेज में एक इंटरफ़ेस बताएं जिसमें एक इंस्टेंस नाम हो। <hal> में अनेक <interface> तत्व हो सकते हैं; नाम अलग-अलग होने चाहिए.
manifest.hal.interface.name
आवश्यक। इंटरफ़ेस का नाम.
manifest.hal.interface.instance
आवश्यक है, दोहरा सकते हैं. इंटरफ़ेस का इंस्टेंस नाम. एक इंटरफ़ेस के लिए कई उदाहरण हो सकते हैं लेकिन कोई डुप्लिकेट <instance> तत्व नहीं हो सकते।
manifest.hal.fqname
वैकल्पिक, दोहरा सकते हैं. manifest.hal.name नाम के साथ HAL के लिए एक उदाहरण निर्दिष्ट करने का एक वैकल्पिक तरीका।
  • एचआईडीएल एचएएल के लिए, प्रारूप @ MAJOR . MINOR :: INTERFACE / INSTANCE
  • एआईडीएल एचएएल के लिए, प्रारूप INTERFACE / INSTANCE है।
manifest.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
वैकल्पिक, डुप्लिकेट के बिना, दोहराया जा सकता है; केवल फ्रेमवर्क मेनिफ़ेस्ट द्वारा उपयोग किया जाता है। विक्रेता ऐप्स को फ्रेमवर्क द्वारा प्रदान किए गए सिस्टम एसडीके संस्करणों के एक सेट का वर्णन करता है।
manifest.kernel
वैकल्पिक। कर्नेल के बारे में स्थिर जानकारी का वर्णन करता है।
manifest.kernel.target-level
वैकल्पिक। कर्नेल शाखा का वर्णन करता है. यदि मौजूद नहीं है तो इसका मान डिफ़ॉल्ट रूप से manifest.target-level पर होता है। manifest.target-level से अधिक या उसके बराबर होना चाहिए। विवरण के लिए कर्नेल मिलान नियम देखें।