VNDK स्नैपशॉट डिज़ाइन

सिस्टम इमेज में VNDK स्नैपशॉट का इस्तेमाल करके, वेंडर इमेज को सही VNDK लाइब्रेरी दी जा सकती हैं. भले ही, सिस्टम और वेंडर इमेज, Android के अलग-अलग वर्शन से बनाई गई हों. VNDK स्नैपशॉट बनाने के लिए, VNDK लाइब्रेरी को स्नैपशॉट के तौर पर कैप्चर करना और उन्हें वर्शन नंबर के साथ मार्क करना ज़रूरी है. वेंडर इमेज, किसी खास VNDK वर्शन से लिंक हो सकती है. यह वर्शन, वेंडर इमेज में मौजूद मॉड्यूल के लिए ज़रूरी एबीआई उपलब्ध कराता है. हालांकि, एक ही VNDK वर्शन में, VNDK लाइब्रेरी एबीआई-स्टैबल होनी चाहिए.

VNDK स्नैपशॉट डिज़ाइन में, मौजूदा सिस्टम इमेज से VNDK स्नैपशॉट के पहले से बने वर्शन जनरेट करने और नए Android वर्शन के सिस्टम पार्टीशन में पहले से बने उन लाइब्रेरी को इंस्टॉल करने के तरीके शामिल हैं.

VNDK लाइब्रेरी के बारे में जानकारी

Android 8.0 में पेश किए गए HIDL-HALs, सिस्टम और वेंडर पार्टिशन के लिए अलग-अलग अपग्रेड की सुविधा देते हैं. VNDK, लाइब्रेरी के ऐसे सेट तय करता है (VNDK-core, VNDK-SP, और LL-NDK) जिनसे वेंडर कोड लिंक किया जा सकता है. साथ ही, यह वेंडर को उन लाइब्रेरी का इस्तेमाल करने से रोकता है जो VNDK सेट में शामिल नहीं हैं. इसलिए, अगर वेंडर इमेज में सिस्टम इमेज पर मौजूद सही VNDK सेट दिए जाते हैं, तो वेंडर इमेज को बनाया और चलाया जा सकता है.

VNDK-core

लाइब्रेरी का VNDK-कोर सेट, /system/lib[64]/vndk-${VER} में इंस्टॉल किया गया है. यह सिर्फ़ उन वेंडर प्रोसेस के लिए उपलब्ध है जिनका एपीआई लेवल, ${VER} के बराबर है. सिस्टम प्रोसेस इन लाइब्रेरी का इस्तेमाल नहीं कर सकतीं. इसके बजाय, उन्हें /system/lib[64] में इंस्टॉल की गई लाइब्रेरी का इस्तेमाल करना चाहिए. हर प्रोसेस के लिए नेमस्पेस की सख्त पाबंदी की वजह से, VNDK-कोर लाइब्रेरी ड्यूअल-लोडिंग से सुरक्षित रहती हैं.

VNDK-core में कोई लाइब्रेरी शामिल करने के लिए, Android.bp में ये चीज़ें जोड़ें:

vendor_available: true,
vndk: {
    enabled: true,
},

VNDK-SP

VNDK-SP लाइब्रेरी, /system/lib[64]/vndk-sp-${VER} में इंस्टॉल की जाती हैं और वेंडर प्रोसेस और सिस्टम प्रोसेस के लिए उपलब्ध होती हैं. ऐसा, वेंडर सेक्शन में इंस्टॉल की गई SP-HAL लाइब्रेरी के ज़रिए होता है. VNDK-SP लाइब्रेरी को ड्यूअल-लोड किया जा सकता है.

VNDK-SP में कोई लाइब्रेरी शामिल करने के लिए, Android.bp में यह जोड़ें:

vendor_available: true,
vndk: {
    enabled: true,
    support_system_process: true,
},

LL-NDK

LL-NDK लाइब्रेरी, /system/lib[64] में इंस्टॉल की गई हैं. वेंडर मॉड्यूल, LL-NDK लाइब्रेरी के पहले से चुने गए सिंबल ऐक्सेस करने के लिए, LL-NDK स्टब लाइब्रेरी का इस्तेमाल कर सकते हैं. LL-NDK लाइब्रेरी, पुराने वर्शन के साथ काम करने वाली और एबीआई के हिसाब से स्थिर होनी चाहिए, ताकि वेंडर मॉड्यूल के पुराने वर्शन, LL-NDK लाइब्रेरी के नए वर्शन का इस्तेमाल कर सकें. LL-NDK के एबीआई-स्टेबल होने की वजह से, VNDK स्नैपशॉट में, वेंडर की पुरानी इमेज के लिए LL-NDK लाइब्रेरी शामिल करने की ज़रूरत नहीं होती.

VNDK के स्नैपशॉट के बारे में जानकारी

Android 8.1 में, सोर्स कोड से बनाई गई VNDK लाइब्रेरी शामिल थीं. हालांकि, Android के नए वर्शन के लिए, हर VNDK वर्शन को स्नैपशॉट के तौर पर कैप्चर किया जाना चाहिए और उसे पहले से बने वर्शन के तौर पर उपलब्ध कराया जाना चाहिए, ताकि किसी पुरानी वेंडर इमेज से लिंक किया जा सके.

Android 9 से, Android के नए वर्शन में, Android सोर्स कोड में पुराने वर्शन के लिए, VNDK-core और VNDK-SP डायरेक्ट्री का कम से कम एक स्नैपशॉट शामिल होगा. बिल्ड के समय, ज़रूरी स्नैपशॉट /system/lib[64]/vndk-${VER} और /system/lib[64]/vndk-sp-${VER} में इंस्टॉल किए जाएंगे. ये ऐसी डायरेक्ट्री हैं जिनका इस्तेमाल, वेंडर पार्टीशन कर सकता है. यहां ${VER} एक स्ट्रिंग वैरिएबल है, जो VNDK स्नैपशॉट के वर्शन का नाम दिखाता है.

VNDK के हर वर्शन के लिए, VNDK स्नैपशॉट लाइब्रेरी अलग-अलग हो सकती हैं. इसलिए, VNDK स्नैपशॉट में लिंकर नेमस्पेस कॉन्फ़िगरेशन भी शामिल होते हैं. ये कॉन्फ़िगरेशन, etc/ld.config.${VER}.txt, /etc/llndk.libraries.${VER}.txt, और /etc/vndksp.libraries.${VER}.txt के तौर पर इंस्टॉल किए जाते हैं.

उदाहरण: सिस्टम और वेंडर की इमेज अपग्रेड करना

स्नैपशॉट की ज़रूरत नहीं है; VNDK के स्नैपशॉट के लिए, अतिरिक्त कॉन्फ़िगरेशन के बिना बनाएं.

उदाहरण: सिर्फ़ सिस्टम इमेज को अपग्रेड करना

सिस्टम इमेज में, वेंडर इमेज के लिए VNDK स्नैपशॉट और लिंकर नेमस्पेस कॉन्फ़िगरेशन फ़ाइलें शामिल होनी चाहिए. लिंकर नेमस्पेस कॉन्फ़िगरेशन फ़ाइलें, /system/lib[64]/vndk-${VER} और /system/lib[64]/vndk-sp-${VER} में VNDK लाइब्रेरी खोजने के लिए अपने-आप कॉन्फ़िगर होती हैं.

पहली इमेज. सिर्फ़ सिस्टम को अपग्रेड करना

उदाहरण: सिस्टम इमेज को अपग्रेड करना, वेंडर की इमेज में मामूली बदलाव करना

फ़िलहाल, VNDK स्नैपशॉट के आधार पर वेंडर इमेज बनाने की सुविधा उपलब्ध नहीं है. इसलिए, आपको वेंडर इमेज को उसके ओरिजनल सोर्स कोड के साथ अलग से बनाना होगा. इसके बाद, पिछले उदाहरण में बताए गए तरीके से सिस्टम इमेज को अपग्रेड करना होगा.

VNDK स्नैपशॉट आर्किटेक्चर

Android 9 सिस्टम इमेज को Android 8.1 वाली वेंडर इमेज के साथ काम करने लायक बनाने के लिए, Android 8.1 वाली वेंडर इमेज से मैच करने वाला VNDK स्नैपशॉट, Android 9 वाली सिस्टम इमेज के साथ दिया जाना चाहिए. इसकी जानकारी यहां दी गई है:

दूसरी इमेज. VNDK स्नैपशॉट आर्किटेक्चर

VNDK स्नैपशॉट डिज़ाइन में ये तरीके शामिल हैं:

  • VNDK-core और VNDK-SP लाइब्रेरी के लिए स्नैपशॉट जनरेट करना. Android 9 में एक स्क्रिप्ट शामिल होती है, जिसका इस्तेमाल करके, मौजूदा VNDK बिल्ड का स्नैपशॉट लिया जा सकता है. यह स्क्रिप्ट, /system/lib[64]/vndk-28 और /system/lib[64]/vndk-sp-28 में मौजूद सभी लाइब्रेरी को बंडल करती है. ये लाइब्रेरी, VNDK स्नैपशॉट के तौर पर मौजूदा सोर्स के साथ बनाई गई थीं. 28, Android 9 का VNDK वर्शन है. स्नैपशॉट में लिंकर नेमस्पेस कॉन्फ़िगरेशन फ़ाइलें /etc/ld.config.28.txt, /etc/llndk.libraries.28.txt, और /etc/vndksp.libraries.28.txt भी शामिल होती हैं. जनरेट किए गए स्नैपशॉट का इस्तेमाल, Android के नए वर्शन (Android 9 से ज़्यादा) के साथ किया जाएगा.
  • स्नैपशॉट से पहले से बनी VNDK-core और VNDK-SP लाइब्रेरी इंस्टॉल करना. Android 9 में, VNDK स्नैपशॉट में पहले से बनी VNDK-कोर लाइब्रेरी और VNDK-SP लाइब्रेरी का एक सेट होता है. साथ ही, इसमें लिंकर नेमस्पेस कॉन्फ़िगरेशन फ़ाइलें भी होती हैं. जब VNDK के उन स्नैपशॉट वर्शन की सूची दी जाती है जिन्हें इंस्टॉल करना है, तो बिल्ड के समय सिस्टम इमेज, VNDK के स्नैपशॉट की लाइब्रेरी को /system/lib[64]/vndk-${VER} और /system/lib[64]/vndk-sp-${VER} डायरेक्ट्री में इंस्टॉल करती है. साथ ही, उन VNDK स्नैपशॉट के लिए लिंकर नेमस्पेस कॉन्फ़िगरेशन फ़ाइलों को /etc डायरेक्ट्री में इंस्टॉल करती है.

VNDK का वर्शन

हर Android रिलीज़ में सिर्फ़ एक VNDK स्नैपशॉट होता है और SDK टूल के वर्शन का इस्तेमाल, VNDK वर्शन के तौर पर किया जाता है. इसका मतलब है कि VNDK वर्शन में एक पूर्णांक होता है, जैसे कि Android 8.1 के लिए 27. Android वर्शन रिलीज़ होने पर, VNDK वर्शन ठीक हो जाता है. वेंडर पार्टीशन का इस्तेमाल किया जाने वाला VNDK वर्शन, ro.vndk.version प्रॉपर्टी में अपने-आप सेव हो जाता है. इसे रनटाइम पर पढ़ा जा सकता है. इसके बाद, इस वर्शन का इस्तेमाल कुछ लाइब्रेरी के लिए, वेंडर VNDK वर्शन की पहचान करने और नेमस्पेस कॉन्फ़िगरेशन के लिए, VNDK स्नैपशॉट वर्शन की पहचान करने में किया जाता है.

VNDK लाइब्रेरी बनाना

make vndk कमांड, ऐसी लाइब्रेरी बनाता है जिनमें vndk: { enabled: true, … } शामिल होता है. इनमें डिपेंडेंसी और नेमस्पेस कॉन्फ़िगरेशन फ़ाइलें भी शामिल होती हैं. अगर BOARD_VNDK_VERSION := current सेट है, तो इन लाइब्रेरी को make कमांड की मदद से बनाया जाता है.

इस बिल्ड में स्नैपशॉट से VNDK लाइब्रेरी इंस्टॉल नहीं की जाती हैं. इसलिए, इंस्टॉल की गई VNDK लाइब्रेरी, एबीआई के हिसाब से स्थिर नहीं होती हैं. हालांकि, जब कोई Android वर्शन रिलीज़ होता है, तो VNDK के मौजूदा वर्शन के लिए एबीआई तय हो जाता है. फ़िलहाल, एबीआई के किसी भी तरह के गड़बड़ी को बिल्ड गड़बड़ी माना जाता है. इसलिए, Android वर्शन के पैच में, VNDK लाइब्रेरी के लिए एबीआई में बदलाव नहीं किया जाना चाहिए.