मेनिफ़ेस्ट

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

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

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

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

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

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

<?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 और उच्चतर में, आप बिल्ड सिस्टम में एक एचएएल मॉड्यूल के साथ एक मेनिफेस्ट प्रविष्टि को जोड़ सकते हैं। यह सशर्त रूप से बिल्ड सिस्टम में HAL मॉड्यूल को शामिल करना आसान बनाता है।

उदाहरण

अपनी Android.bp या Android.mk फ़ाइल में, किसी भी मॉड्यूल में vintf_fragments जोड़ें। उदाहरण के लिए, आप अपने एचएएल ( 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
आवश्यक। इस मेनिफेस्ट का मेटा-संस्करण। मैनिफेस्ट में अपेक्षित तत्वों का वर्णन करता है। एक्सएमएल संस्करण से असंबंधित।
manifest.type
आवश्यक। इस मैनिफेस्ट का प्रकार। इसमें डिवाइस मेनिफेस्ट फ़ाइल के लिए वैल्यू device और framework मेनिफेस्ट फ़ाइल के लिए फ्रेमवर्क है।
manifest.target-level
डिवाइस मेनिफेस्ट के लिए आवश्यक है। फ्रेमवर्क संगतता मैट्रिक्स (FCM) संस्करण निर्दिष्ट करता है जिसके साथ संगत होने के लिए यह डिवाइस मेनिफेस्ट लक्षित है। इसे डिवाइस का शिपिंग FCM संस्करण भी कहा जाता है।
manifest.hal
वैकल्पिक, दोहरा सकते हैं। format विशेषता के आधार पर एक एकल एचएएल (एचआईडीएल या देशी, जैसे जीएल)।
manifest.hal.format
वैकल्पिक। मान इनमें से एक हो सकता है:
  • hidl : एचआईडीएल एचएएल। यह डिफ़ॉल्ट है।
  • सहायता: aidl एचएएल । केवल मेनिफेस्ट मेटा-संस्करण 2.0 और इसके बाद के संस्करण पर मान्य है।
  • native : मूल निवासी एचएएल।
manifest.hal.max-level
वैकल्पिक। केवल ढांचे पर मान्य प्रकट होता है। यदि सेट किया जाता है, तो फ्रेमवर्क मेनिफेस्ट में लक्ष्य FCM संस्करण की तुलना में अधिकतम स्तर कम वाले HAL अक्षम हो जाते हैं।
manifest.hal.override
वैकल्पिक। मान इनमें से एक हो सकता है:
  • true : अन्य <hal> तत्वों को समान <name> और प्रमुख संस्करण के साथ ओवरराइड करें। यदि इस <hal> तत्व में कोई <version> या <fqname> नहीं है, तो <hal> तत्व इस HAL को अक्षम घोषित करता है।
  • false : अन्य <hal> तत्वों को समान <name> और प्रमुख संस्करण के साथ ओवरराइड न करें।
manifest.hal.name
आवश्यक। एचएएल का पूर्णतः योग्य पैकेज नाम। एकाधिक एचएएल प्रविष्टियां एक ही नाम का उपयोग कर सकती हैं। उदाहरण:
  • android.hardware.camera (HIDL या AIDL HAL)
  • GLES (मूल HAL, केवल नाम की आवश्यकता है)
manifest.hal.transport
आवश्यक है जब manifest.hal.format == "hidl" । अन्यथा उपस्थित नहीं होना चाहिए। बताता है कि सेवा प्रबंधक से इस पैकेज से एक इंटरफ़ेस पूछे जाने पर किस परिवहन का उपयोग किया जाता है। मान इनमें से एक हो सकता है:
  • hwbinder : बाइंडराइज़्ड मोड
  • passthrough : पासथ्रू मोड
वैकल्पिक जब manifest.hal.format == "aidl" । अन्यथा उपस्थित नहीं होना चाहिए। बताता है कि जब इंटरफ़ेस को दूरस्थ रूप से परोसा जाता है तो किस परिवहन का उपयोग किया जाता है। मान होना चाहिए:
  • 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 में हाल टैग के लिए एक संस्करण।

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