विक्रेता मूल विकास किट (VNDK)

संग्रह की मदद से व्यवस्थित रहें अपनी प्राथमिकताओं के आधार पर, कॉन्टेंट को सेव करें और कैटगरी में बांटें.

विक्रेता मूल विकास किट (वीएनडीके) विशेष रूप से विक्रेताओं के लिए उनके एचएएल को लागू करने के लिए पुस्तकालयों का एक समूह है। VNDK system.img में शिप करता है और रनटाइम पर वेंडर कोड से गतिशील रूप से जुड़ा होता है।

वीएनडीके क्यों?

एंड्रॉइड 8.0 और उच्चतर फ्रेमवर्क-ओनली अपडेट को सक्षम करता है जिसमें सिस्टम विभाजन को नवीनतम संस्करण में अपग्रेड किया जा सकता है जबकि विक्रेता विभाजन को अपरिवर्तित छोड़ दिया जाता है। इसका तात्पर्य यह है कि अलग-अलग समय पर निर्मित बायनेरिज़ को एक दूसरे के साथ काम करने में सक्षम होना चाहिए; VNDK Android रिलीज़ में API/ABI परिवर्तनों को कवर करता है।

केवल-फ़्रेमवर्क अपडेट में निम्नलिखित चुनौतियाँ शामिल हैं:

  • फ्रेमवर्क मॉड्यूल और विक्रेता मॉड्यूल के बीच निर्भरता । एंड्रॉइड 8.0 से पहले, दोनों तरफ के मॉड्यूल दूसरी तरफ के मॉड्यूल से जुड़ सकते थे। हालांकि, विक्रेता मॉड्यूल से निर्भरता ने फ्रेमवर्क मॉड्यूल विकास के लिए अवांछित प्रतिबंध लगाए।
  • एओएसपी पुस्तकालयों में विस्तार । एंड्रॉइड 8.0 और उच्चतर के लिए सभी एंड्रॉइड डिवाइसों को सीटीएस पास करने की आवश्यकता होती है जब सिस्टम विभाजन को एक मानक जेनेरिक सिस्टम इमेज (जीएसआई) से बदल दिया जाता है। हालांकि, जैसा कि विक्रेता प्रदर्शन को बढ़ावा देने के लिए या अपने एचआईडीएल कार्यान्वयन के लिए अतिरिक्त कार्यक्षमता जोड़ने के लिए एओएसपी पुस्तकालयों का विस्तार करते हैं, मानक जीएसआई के साथ सिस्टम विभाजन को चमकाने से विक्रेता के एचआईडीएल कार्यान्वयन को तोड़ सकता है। (ऐसे टूट-फूट को रोकने के दिशा-निर्देशों के लिए, VNDK एक्सटेंशन देखें।)

इन चुनौतियों का समाधान करने के लिए, Android 8.0 VNDK (इस खंड में वर्णित), HIDL , hwbinder, डिवाइस ट्री ओवरले , और सेपॉलिसी ओवरले जैसी कई तकनीकों का परिचय देता है।

वीएनडीके संसाधन

इस खंड में निम्नलिखित VNDK संसाधन शामिल हैं:

  • वीएनडीके अवधारणाएं (नीचे) फ्रेमवर्क साझा पुस्तकालयों, समान-प्रक्रिया एचएएल (एसपी-एचएएल), और वीएनडीके शब्दावली का वर्णन करती हैं।
  • VNDK एक्सटेंशन विक्रेता-विशिष्ट परिवर्तनों को श्रेणियों में वर्गीकृत करता है। उदाहरण के लिए, विस्तारित कार्यक्षमता वाले पुस्तकालय जिन पर विक्रेता मॉड्यूल निर्भर करते हैं, उन्हें विक्रेता विभाजन में कॉपी किया जाना चाहिए, लेकिन ABI- असंगत परिवर्तन निषिद्ध हैं।
  • VNDK बिल्ड सिस्टम सपोर्ट बिल्ड सिस्टम कॉन्फ़िगरेशन और मॉड्यूल परिभाषा सिंटैक्स का वर्णन करता है जो VNDK से संबंधित हैं।
  • VNDK डेफिनिशन टूल आपके स्रोत ट्री को Android 8.0 और उच्चतर पर माइग्रेट करने में मदद करता है।
  • लिंकर नेमस्पेस साझा लाइब्रेरी लिंकेज पर बढ़िया नियंत्रण प्रदान करता है।
  • निर्देशिकाएँ, नियम, और सेपॉलिसी Android 8.0 और बाद के वर्शन, VNDK नियम, और संबद्ध सेपॉलिसी चलाने वाले उपकरणों के लिए निर्देशिका संरचना को परिभाषित करती है।
  • VNDK डिज़ाइन प्रस्तुति Android 8.0 और उच्चतर में उपयोग की जाने वाली मूलभूत VDNK अवधारणाओं को दर्शाती है।

वीएनडीके अवधारणाएं

एक आदर्श एंड्रॉइड 8.0 और उच्चतर दुनिया में, फ्रेमवर्क प्रक्रियाएं विक्रेता साझा पुस्तकालयों को लोड नहीं करती हैं, सभी विक्रेता प्रक्रियाएं केवल विक्रेता साझा पुस्तकालयों (और फ्रेमवर्क साझा पुस्तकालयों का एक हिस्सा) लोड करती हैं, और फ्रेमवर्क प्रक्रियाओं और विक्रेता प्रक्रियाओं के बीच संचार एचआईडीएल और हार्डवेयर द्वारा नियंत्रित होते हैं। जिल्दसाज़।

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

निम्नलिखित खंड विस्तार से बताते हैं कि VNDK विक्रेताओं और समान-प्रक्रिया HALs (SP-HALs) के लिए फ्रेमवर्क साझा पुस्तकालयों को कैसे संभालता है।

विक्रेता के लिए फ्रेमवर्क साझा पुस्तकालय

यह खंड विक्रेता प्रक्रियाओं के लिए सुलभ साझा पुस्तकालयों को वर्गीकृत करने के मानदंडों का वर्णन करता है। कई Android रिलीज़ में विक्रेता मॉड्यूल का समर्थन करने के लिए दो दृष्टिकोण हैं:

  1. साझा पुस्तकालयों के ढांचे के एबीआई/एपीआई को स्थिर करें । मेमोरी फ़ुटप्रिंट और स्टोरेज आकार को कम करने के लिए नए फ्रेमवर्क मॉड्यूल और पुराने विक्रेता मॉड्यूल समान साझा लाइब्रेरी का उपयोग कर सकते हैं। एक अद्वितीय साझा पुस्तकालय कई डबल-लोडिंग मुद्दों से भी बचा जाता है। हालांकि, स्थिर एबीआई/एपीआई को बनाए रखने के लिए विकास लागत अधिक है और प्रत्येक फ्रेमवर्क साझा पुस्तकालय द्वारा निर्यात किए गए सभी एबीआई/एपीआई को स्थिर करना अवास्तविक है।
  2. पुराने ढांचे की साझा पुस्तकालयों की प्रतिलिपि बनाएँ । साइड चैनलों के खिलाफ मजबूत प्रतिबंध के साथ आता है, फ्रेमवर्क मॉड्यूल और विक्रेता मॉड्यूल के बीच संवाद करने के लिए सभी तंत्रों के रूप में परिभाषित किया गया है, जिसमें बाइंडर, सॉकेट, पाइप, साझा मेमोरी, साझा फ़ाइल और सिस्टम गुण शामिल हैं (लेकिन सीमित नहीं)। कोई संचार तब तक नहीं होना चाहिए जब तक कि संचार प्रोटोकॉल स्थिर और स्थिर न हो (उदाहरण के लिए hwbinder के माध्यम से HIDL)। साझा पुस्तकालयों को डबल-लोड करने से भी समस्याएँ हो सकती हैं; उदाहरण के लिए, यदि नई लाइब्रेरी द्वारा बनाई गई कोई वस्तु पुरानी लाइब्रेरी से फ़ंक्शन में पास की जाती है, तो एक त्रुटि हो सकती है क्योंकि ये लाइब्रेरी ऑब्जेक्ट की अलग-अलग व्याख्या कर सकती हैं।

साझा पुस्तकालयों की विशेषताओं के आधार पर विभिन्न दृष्टिकोणों का उपयोग किया जाता है। नतीजतन, फ्रेमवर्क साझा पुस्तकालयों को तीन उप-श्रेणियों में वर्गीकृत किया गया है:

  • एलएल-एनडीके पुस्तकालय फ्रेमवर्क साझा पुस्तकालय हैं जिन्हें स्थिर माना जाता है। उनके डेवलपर अपनी API/ABI स्थिरता बनाए रखने के लिए प्रतिबद्ध हैं।
    • LL-NDK में निम्नलिखित पुस्तकालय शामिल हैं: libEGL.so , libGLESv1_CM.so , libGLESv2.so , libGLESv3.so , libandroid_net.so , libc.so , libdl.so , liblog.so , libm.so , libnativewindow.so , libneuralnetworks.so , libsync.so , libvndksupport.so , और libvulkan.so ,
  • योग्य वीएनडीके पुस्तकालय (वीएनडीके) फ्रेमवर्क साझा पुस्तकालय हैं जिन्हें दो बार कॉपी किया जा सकता है। फ्रेमवर्क मॉड्यूल और विक्रेता मॉड्यूल अपनी प्रतियों के साथ लिंक कर सकते हैं। एक फ्रेमवर्क साझा पुस्तकालय एक योग्य वीएनडीके पुस्तकालय तभी बन सकता है जब वह निम्नलिखित मानदंडों को पूरा करता हो:
    • यह फ्रेमवर्क को/से आईपीसी नहीं भेजता/प्राप्त करता है।
    • यह एआरटी वर्चुअल मशीन से संबंधित नहीं है।
    • यह अस्थिर फ़ाइल स्वरूपों वाली फ़ाइलों/विभाजनों को पढ़ता/लिखता नहीं है।
    • इसके पास विशेष सॉफ्टवेयर लाइसेंस नहीं है जिसके लिए कानूनी समीक्षा की आवश्यकता है।
    • इसके कोड मालिक को विक्रेता के उपयोग पर आपत्ति नहीं है।
  • फ्रेमवर्क-ओनली लाइब्रेरी (एफडब्ल्यूके-ओनली) फ्रेमवर्क साझा लाइब्रेरी हैं जो ऊपर उल्लिखित श्रेणियों से संबंधित नहीं हैं। ये पुस्तकालय:
    • ढांचे के आंतरिक कार्यान्वयन विवरण माने जाते हैं।
    • विक्रेता मॉड्यूल द्वारा एक्सेस नहीं किया जाना चाहिए।
    • अस्थिर एबीआई/एपीआई और कोई एपीआई/एबीआई संगतता गारंटी नहीं है।
    • नकल नहीं कर रहे हैं।

समान-प्रक्रिया एचएएल (एसपी-एचएएल)

समान-प्रक्रिया एचएएल ( एसपी-एचएएल ) पूर्व निर्धारित एचएएल का एक सेट है जिसे विक्रेता साझा पुस्तकालयों के रूप में कार्यान्वित किया जाता है और फ्रेमवर्क प्रक्रियाओं में लोड किया जाता है। SP-HALs को एक लिंकर नेमस्पेस द्वारा अलग किया जाता है (पुस्तकालयों और प्रतीकों को नियंत्रित करता है जो साझा पुस्तकालयों को दिखाई देते हैं)। SP-HALs को केवल LL-NDK और VNDK-SP पर निर्भर होना चाहिए।

वीएनडीके-एसपी पात्र वीएनडीके पुस्तकालयों का एक पूर्वनिर्धारित उपसमुच्चय है। VNDK-SP पुस्तकालयों की सावधानीपूर्वक समीक्षा की जाती है ताकि यह सुनिश्चित किया जा सके कि VNDK-SP पुस्तकालयों को ढांचे की प्रक्रियाओं में डबल-लोड करने से समस्या न हो। SP-HALs और VNDK-SPs दोनों को Google द्वारा परिभाषित किया गया है।

निम्नलिखित पुस्तकालय स्वीकृत SP-HALs हैं:

  • libGLESv1_CM_${driver}.so
  • libGLESv2_${driver}.so
  • libGLESv3_${driver}.so
  • libEGL_${driver}.so
  • vulkan.${driver}.so
  • android.hardware.renderscript@1.0-impl.so
  • android.hardware.graphics.mapper@2.0-impl.so

VNDK-SP पुस्तकालय अपनी Android.bp फ़ाइलों में vndk: { support_system_process: true } निर्दिष्ट करते हैं। यदि vendor_available: false भी निर्दिष्ट है, तो इन पुस्तकालयों को वीएनडीके-एसपी-प्राइवेट कहा जाता है और वे एसपी -एचएएलएस के लिए अदृश्य हैं।

आरएस अपवादों (एफडब्ल्यूके-ओनली-आरएस) के साथ फ्रेमवर्क-ओनली लाइब्रेरी निम्नलिखित हैं:

  • libft2.so (रेंडरस्क्रिप्ट)
  • libmediandk.so (रेंडरस्क्रिप्ट)

वीएनडीके शब्दावली

  • मॉड्यूल या तो साझा लाइब्रेरी या एक्ज़ीक्यूटेबल्स को संदर्भित करता है।
  • प्रक्रियाएं निष्पादन योग्य से उत्पन्न ऑपरेटिंग सिस्टम कार्य हैं।
  • फ्रेमवर्क -योग्य शब्द सिस्टम विभाजन से संबंधित अवधारणाओं को संदर्भित करता है।
  • विक्रेता -योग्य शब्द विक्रेता विभाजन से संबंधित अवधारणाओं को संदर्भित करते हैं।

उदाहरण के लिए:

  • फ्रेमवर्क निष्पादन योग्य /system/bin या /system/xbin में निष्पादन योग्य को संदर्भित करता है।
  • फ्रेमवर्क साझा पुस्तकालय /system/lib[64] के अंतर्गत साझा पुस्तकालयों को संदर्भित करता है।
  • फ्रेमवर्क मॉड्यूल फ्रेमवर्क साझा पुस्तकालयों और फ्रेमवर्क निष्पादन योग्य दोनों को संदर्भित करता है।
  • फ्रेमवर्क प्रक्रियाएं फ्रेमवर्क एक्जीक्यूटेबल्स (जैसे /system/bin/app_process ) से उत्पन्न प्रक्रियाएं हैं।
  • विक्रेता निष्पादन योग्य /vendor/bin . में निष्पादन योग्य को संदर्भित करता है
  • विक्रेता साझा पुस्तकालय /vendor/lib[64] के अंतर्गत साझा पुस्तकालयों को संदर्भित करता है।
  • विक्रेता मॉड्यूल विक्रेता निष्पादन योग्य और विक्रेता साझा पुस्तकालय दोनों को संदर्भित करता है।
  • विक्रेता प्रक्रियाएं विक्रेता निष्पादन योग्य प्रक्रियाओं से उत्पन्न प्रक्रियाएं हैं (उदाहरण के लिए)
  • /vendor/bin/android.hardware.camera.provider@2.4-service )।

वीएनडीके संस्करण

एंड्रॉइड 9 में, वीएनडीके साझा पुस्तकालयों का संस्करण है:

  • ro.vndk.version सिस्टम गुण स्वचालित रूप से /vendor/default.prop में जुड़ जाता है।
  • VNDK साझा पुस्तकालय /system/lib[64]/vndk-${ro.vndk.version} पर स्थापित हैं।
  • VNDK-SP साझा पुस्तकालय /system/lib[64]/vndk-sp-${ro.vndk.version} में स्थापित हैं।
  • डायनेमिक लिंकर कॉन्फ़िगरेशन फ़ाइल /system/etc/ld.config.${ro.vndk.version}.txt में स्थापित है।

ro.vndk.version का मान नीचे दिए गए एल्गोरिथम द्वारा चुना जाता है:

  • यदि BOARD_VNDK_VERSION current के बराबर नहीं है, तो BOARD_VNDK_VERSION का उपयोग करें।
  • यदि BOARD_VNDK_VERSION current बराबर है :
    • यदि PLATFORM_VERSION_CODENAME REL है, तो PLATFORM_SDK_VERSION (उदा. 28 ) का उपयोग करें।
    • अन्यथा, PLATFORM_VERSION_CODENAME (उदा. P ) का उपयोग करें।

उपकरणों का उन्नयन

यदि कोई Android 8.x डिवाइस BOARD_VNDK_VERSION के बिना निर्मित करके VNDK रन-टाइम प्रवर्तन को अक्षम कर देता है, तो वह Android 9 में अपग्रेड करते समय PRODUCT_USE_VNDK_OVERRIDE := false को BoardConfig.mk में जोड़ सकता है।

यदि PRODUCT_USE_VNDK_OVERRIDE false है, तो ro.vndk.lite गुण स्वचालित रूप से /vendor/default.prop में जुड़ जाएगा और इसका मान true होगा। नतीजतन, डायनेमिक लिंकर लिंकर नेमस्पेस कॉन्फ़िगरेशन को /system/etc/ld.config.vndk_lite.txt से लोड करेगा, जो केवल SP-HAL और VNDK-SP को अलग करता है।

Android 7.0 या उससे पहले के डिवाइस को Android 9 में अपग्रेड करने के लिए, PRODUCT_TREBLE_LINKER_NAMESPACES_OVERRIDE := false को BoardConfig.mk में जोड़ें।

विक्रेता परीक्षण सूट (वीटीएस)

Android 9 विक्रेता परीक्षण सूट (VTS) एक गैर-रिक्त ro.vndk.version गुण को अनिवार्य करता है। नए लॉन्च किए गए डिवाइस और अपग्रेड करने वाले डिवाइस दोनों को ro.vndk.version परिभाषित करना चाहिए। कुछ VNDK परीक्षण मामले (जैसे VtsVndkFilesTest और VtsVndkDependencyTest ) मिलान योग्य VNDK लाइब्रेरी डेटा सेट को लोड करने के लिए ro.vndk.version गुण पर निर्भर करते हैं।

यदि ro.product.first_api_level गुण 27 से अधिक है, तो ro.vndk.lite गुण परिभाषित नहीं किया जाना चाहिए। यदि VtsTreblePlatformVersionTest को नए लॉन्च किए गए Android 9 डिवाइस में परिभाषित किया गया है, तो ro.vndk.lite विफल हो जाएगा।

दस्तावेज़ इतिहास

यह खंड VNDK दस्तावेज़ीकरण में परिवर्तनों को ट्रैक करता है।

एंड्रॉइड 9 में बदलाव

  • VNDK वर्जनिंग सेक्शन जोड़ें।
  • वीटीएस अनुभाग जोड़ें।
  • कुछ वीएनडीके श्रेणियों का नाम बदल दिया गया है:
    • एलएल-एनडीके-इनडायरेक्ट का नाम बदलकर एलएल-एनडीके-प्राइवेट कर दिया गया है।
    • वीएनडीके-इनडायरेक्ट का नाम बदलकर वीएनडीके-प्राइवेट कर दिया गया है।
    • वीएनडीके-एसपी-इनडायरेक्ट-प्राइवेट का नाम बदलकर वीएनडीके-एसपी-प्राइवेट कर दिया गया है।
    • VNDK-SP-अप्रत्यक्ष हटा दिया गया है।

एंड्रॉइड 8.1 परिवर्तन

  • SP-NDK पुस्तकालयों को LL-NDK पुस्तकालयों में मिला दिया गया है।
  • RS नेमस्पेस सेक्शन में libui.so को libft2.so से बदलें। libui.so को शामिल करना एक त्रुटि थी।
  • LL-NDK लाइब्रेरी में libGLESv3.so और libandroid_net.so जोड़ें।
  • VNDK-SP पुस्तकालयों में libion.so जोड़ें।
  • एलएल-एनडीके पुस्तकालयों से libstdc++.so को हटा दें। इसके बजाय libc++.so का प्रयोग करें। स्टैंडअलोन टूलचेन के कुछ संस्करण डिफ़ॉल्ट लिंकर फ़्लैग में -lstdc++ जोड़ सकते हैं। डिफ़ॉल्ट को अक्षम करने के लिए, -nodefaultlibs -lc -lm -ldl LDFLAGS में जोड़ें।
  • libz.so को LL-NDK से VNDK-SP लाइब्रेरी में ले जाएँ। कुछ कॉन्फ़िगरेशन में, libz.so LL-NDK होना जारी रख सकता है। हालांकि, कोई ध्यान देने योग्य अंतर नहीं होना चाहिए।