वीएनडीके स्नैपशॉट जनरेट करें

VNDK स्नैपशॉट, Android रिलीज़ के लिए VNDK-core और VNDK-SP लाइब्रेरी का एक सेट होता है. सिर्फ़ सिस्टम पार्टीशन को तब अपग्रेड किया जा सकता है, जब system.img में vendor.img के लिए ज़रूरी VNDK स्नैपशॉट शामिल हो.

VNDK के आधिकारिक स्नैपशॉट, Android बिल्ड सर्वर पर अपने-आप बन जाते हैं और Android सोर्स ट्री के /prebuilts/vndk में चेक किए जाते हैं. डेवलपमेंट के लिए, VNDK के स्नैपशॉट स्थानीय तौर पर बनाए जा सकते हैं. VNDK स्नैपशॉट, arm, arm64, x86, और x86_64 TARGET_ARCH फ़्लेवर के साथ काम करते हैं.

स्नैपशॉट बनाना

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

पैरामीटर बनाना

बिल्ड टारगेट का नाम vndk है. नीचे, बिल्ड टारगेट कॉन्फ़िगरेशन दिखाया गया है.

TARGET_PRODUCT TARGET_ARCH TARGET_ARCH_VARIANT
aosp_arm arm armv7-a-neon
aosp_arm64 arm64 armv8-a
aosp_x86 x86 x86
aosp_x86_64 x86_64 x86_64
  • TARGET_PRODUCT=aosp_$(TARGET_ARCH)
  • TARGET_BUILD_VARIANT=user
  • TARGET_ARCH, जेनरिक सिस्टम इमेज (जीएसआई) के टारगेट आर्क (arm, arm64, x86, x86_64) के बराबर है.
  • TARGET_ARCH_VARIANT. स्नैपशॉट v28 (Android 9) और इसके बाद के वर्शन के लिए, ऊपर दिए गए लोकप्रिय कॉन्फ़िगरेशन शामिल हैं.

निर्देश बनाना

आधिकारिक स्नैपशॉट के लिए, Android 9 और इसके बाद के वर्शन में vndk.mk में एक सैंपल टारगेट (vndk) शामिल होता है. यह $DIST_DIR में VNDK स्नैपशॉट बनाता है और उसे आउटपुट करता है. स्नैपशॉट की ZIP फ़ाइल, android-vndk-$(TARGET_ARCH).zip फ़ॉर्मैट का इस्तेमाल करती है. उदाहरण के लिए:

lunch aosp_TARGET_ARCH-user
make -j vndk dist [BOARD_VNDK_VERSION=current]

Android बिल्ड सर्वर, यहां दिए गए कमांड की मदद से, काम करने वाले सभी आर्क फ़्लेवर को बनाने के लिए, build.sh स्क्रिप्ट का इस्तेमाल करता है.

DIST_DIR=dist_dir development/vndk/snapshot/build.sh

Android के किसी वर्शन के लिए VNDK टूल का स्नैपशॉट, उस वर्शन की रिलीज़ शाखा से जनरेट होता है.

स्थानीय तौर पर बनाना

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

  • काम करने वाले सभी आर्किटेक्चर को एक साथ बनाने के लिए, नीचे दी गई बिल्ड स्क्रिप्ट को build.sh के तौर पर चलाएं.
    cd $ANDROID_BUILD_TOP
    development/vndk/snapshot/build.sh
  • कोई एक TARGET_ARCH बनाने के लिए, ये कमांड इस्तेमाल करें.
    lunch aosp_TARGET_ARCH-user
    m -j vndk dist

इससे जुड़ी android-vndk-$(TARGET_ARCH).zip फ़ाइल, $DIST_DIR में बनाई जाती है.

स्नैपशॉट फ़ाइलें

VNDK के स्नैपशॉट में ये फ़ाइलें शामिल होती हैं.

  • VNDK-core और VNDK-SP शेयर की गई लाइब्रेरी का वेंडर वैरिएंट.
    • LL-NDK की शेयर की गई लाइब्रेरी की ज़रूरत नहीं है, क्योंकि वे पुराने वर्शन के साथ काम करती हैं.
    • 64 बिट टारगेट के लिए, TARGET_ARCH और TARGET_2ND_ARCH, दोनों लाइब्रेरी बनाई और शामिल की जाती हैं.
  • VNDK-core, VNDK-SP, LL-NDK, और VNDK-private लाइब्रेरी की सूची [vndkcore|vndksp|llndk|vndkprivate].libraries.txt पर दी गई है.
  • लाइसेंस वाली फ़ाइलें.
  • module_paths.txt. सभी VNDK लाइब्रेरी के लिए मॉड्यूल पाथ रिकॉर्ड करता है. इससे यह पता चलता है कि GPL प्रोजेक्ट के सोर्स, किसी Android सोर्स ट्री में रिलीज़ किए गए हैं या नहीं.

किसी VNDK स्नैपशॉट ZIP फ़ाइल, android-vndk-$(TARGET_ARCH).zip के लिए, VNDK की पहले से बनी लाइब्रेरी को, एबीआई के बिटनेस के हिसाब से, arch-$(TARGET_ARCH)-$(TARGET_ARCH_VARIANT) नाम वाली अलग-अलग डायरेक्ट्री में ग्रुप किया जाता है. उदाहरण के लिए, android-vndk-arm64.zip के लिए, 64-बिट वाले लाइब्रेरी को arch-arm64-armv8-a में और 32-बिट वाले लाइब्रेरी को arch-arm-armv8-a में रखा जाता है. नीचे दिए गए उदाहरण में, arm64 (TARGET_ARCH=arm64) VNDK स्नैपशॉट ZIP फ़ाइल (android-vndk-arm64.zip) के लिए डायरेक्ट्री का स्ट्रक्चर दिखाया गया है.

VNDK स्नैपशॉट डायरेक्ट्री का स्ट्रक्चर
पहली इमेज. VNDK स्नैपशॉट डायरेक्ट्री का स्ट्रक्चर (उदाहरण)

वेंडर के स्नैपशॉट के लिए बनाए गए

Android 11 पर, वेंडर के स्नैपशॉट काम करते हैं. इनकी मदद से, सोर्स ट्री पर मौजूद Android वर्शन के बावजूद, vendor.img को बनाया जा सकता है. डिफ़ॉल्ट VNDK स्नैपशॉट में, शेयर की गई लाइब्रेरी फ़ाइलें (.so) होती हैं. इन्हें डिवाइसों पर इंस्टॉल किया जा सकता है और फिर रनटाइम में वेंडर के C++ बाइनरी से लिंक किया जा सकता है. उस VNDK स्नैपशॉट के खिलाफ़ बने वर्शन को बनाने के लिए, आपको हेडर फ़ाइलों और एक्सपोर्ट किए गए फ़्लैग जैसे अन्य आर्टफ़ैक्ट की ज़रूरत होगी.

किसी लोकल सोर्स ट्री से, VNDK स्नैपशॉट के साथ-साथ ऐसे आर्टफ़ैक्ट जनरेट करने के लिए, नीचे दिए गए निर्देश का इस्तेमाल करें.

VNDK_SNAPSHOT_BUILD_ARTIFACTS=true development/vndk/snapshot/build.sh

यह कमांड, $DIST_DIR में android-vndk-$(TARGET_ARCH).zip फ़ाइलें बनाता है. यहां दिए गए उदाहरण में, arm64 VNDK स्नैपशॉट की ZIP फ़ाइल दी गई है. इसमें, बिल्ड आर्टफ़ैक्ट भी शामिल हैं. बोल्ड की गई फ़ाइलें, सामान्य VNDK स्नैपशॉट (पहले इमेज में दिखाई गई हैं) में जोड़ी गई नई फ़ाइलें हैं. इनमें JSON फ़ाइलें (जो हर लाइब्रेरी का cflags सेव करती हैं) और एक्सपोर्ट की गई सभी हेडर फ़ाइलें शामिल हैं.

android-vndk-arm64.zip
├── arch-arm64-armv8-a
│   └── shared
│       ├── vndk-core  -> *.so files, *.json files
│       └── vndk-sp    -> *.so files, *.json files
├── arch-arm-armv8-a   -> (same as arch-arm64-armv8-a)
├── configs            -> *.libraries.txt, module_paths.txt, module_names.txt
├── include            -> exported header files (*.h, *.hh, etc.)
└── NOTICE_FILES       -> license txt files

VNDK के स्नैपशॉट अपलोड करना

VNDK स्नैपशॉट की जांच, /prebuilts/vndk/vVER में मौजूद सोर्स ट्री में की जाती है. यहां VER, VNDK स्नैपशॉट के वर्शन के बराबर होता है. यह वर्शन, संबंधित Android रिलीज़ के SDK टूल के वर्शन के हिसाब से होता है. उदाहरण के लिए, Android 8.1 VNDK स्नैपशॉट का वर्शन 27 है.

update.py स्क्रिप्ट का इस्तेमाल करना

update.py स्क्रिप्ट (/development/vndk/snapshot/update.py), सोर्स ट्री में पहले से बने VNDK स्नैपशॉट को जोड़ने की प्रोसेस को ऑटोमेट करती है. यह अपने-आप, बिल्ड आर्टफ़ैक्ट का पता लगाता है और जनरेट किए गए Android.bp में, उनसे जुड़ी प्रॉपर्टी को सही तरीके से भरता है. यह स्क्रिप्ट ये काम करती है:

  1. /prebuilts/vndk/vVER में, नई Git शाखा बनाने के लिए repo start का इस्तेमाल किया जाता है.
  2. VNDK स्नैपशॉट बिल्ड आर्टफ़ैक्ट को फ़ेच और अनज़िप करता है.
  3. बिल्ड फ़ाइलों को अपने-आप जनरेट करने के लिए, gen_buildfiles.py (Android.bp) को चलाता है.
  4. check_gpl_license.py को चलाकर, यह पुष्टि की जाती है कि पहले से बनी लाइब्रेरी के लिए, जनरल पब्लिक लाइसेंस (जीपीएल) के तहत लाइसेंस मिला है या नहीं. साथ ही, यह भी पुष्टि की जाती है कि मौजूदा सोर्स ट्री में सोर्स रिलीज़ किए गए हैं या नहीं.
  5. नए बदलावों को लागू करने के लिए, git commit का इस्तेमाल करता है.

स्थानीय तौर पर बनाए गए VNDK स्नैपशॉट का इस्तेमाल करना

स्थानीय तौर पर बनाए गए VNDK स्नैपशॉट का भी इस्तेमाल किया जा सकता है. --local विकल्प तय करने पर, update.py स्क्रिप्ट, Android बिल्ड सर्वर के बजाय तय की गई लोकल डायरेक्ट्री से VNDK स्नैपशॉट बिल्ड आर्टफ़ैक्ट फ़ेच करती है. इस डायरेक्ट्री में, development/vndk/snapshot/build.sh से जनरेट की गई android-vndk-$(TARGET_ARCH).zip फ़ाइलें होती हैं. --local विकल्प का इस्तेमाल करने पर, update.py स्क्रिप्ट GPL लाइसेंस की जांच और git commit चरणों को छोड़ देती है.

सिंटैक्स:

python update.py VER --local local_path

/path/to/local/dir में मौजूद लोकल बिल्ड के आर्टफ़ैक्ट के साथ, Android 8.1 VNDK स्नैपशॉट को अपडेट करने के लिए, कमांड का उदाहरण:

python update.py 27 --local /path/to/local/dir

स्थानीय तौर पर बनाए गए VNDK स्नैपशॉट के डायरेक्ट्री स्ट्रक्चर का उदाहरण:

prebuilts/vndk
├── v30
│   ├── arm64
│   │   ├── arch-arm64-armv8-a -> (prebuilt libs)
│   │   ├── arch-arm-armv8-a   -> (prebuilt libs)
│   │   ├── configs            -> (config files)
│   │   ├── include            -> (exported header files)
│   │   └── Android.bp         -> (VNDK modules with cflags)
│   ├── arm                    -> (same as above)
│   ├── x86_64                 -> (same as above)
│   ├── x86                    -> (same as above)
│   ├── common
│   │   ├── NOTICE_FILES       -> (license files)
│   │   └── Android.bp         -> (license file modules)
│   └── Android.bp             -> (*.libraries.30.txt modules)
└── (other VNDK versions)      -> (same as above)
अगर आर्टफ़ैक्ट को VNDK_SNAPSHOT_BUILD_ARTIFACTS=true की मदद से बनाया गया है, तो लोकल बिल्ड आर्टफ़ैक्ट अपने-आप जुड़ जाते हैं.

VNDK के स्नैपशॉट इंस्टॉल करना

सिस्टम इमेज, BOARD_VNDK_VERSION, PRODUCT_EXTRA_VNDK_VERSIONS, और ro.vndk.version में मौजूद जानकारी का इस्तेमाल करके, बिल्ड के समय VNDK स्नैपशॉट लाइब्रेरी इंस्टॉल करती है. इनमें से किसी एक विकल्प का इस्तेमाल करके, यह कंट्रोल किया जा सकता है कि पहले से बने VNDK स्नैपशॉट डायरेक्ट्री (उदाहरण के लिए, /prebuilts/vndk/v29 या /prebuilts/vndk/v30) से कौनसे VNDK स्नैपशॉट इंस्टॉल किए जाएं.

  • पहला विकल्प: BOARD_VNDK_VERSION. मौजूदा वेंडर मॉड्यूल बनाने के लिए, स्नैपशॉट मॉड्यूल का इस्तेमाल करें. साथ ही, सिर्फ़ वे स्नैपशॉट मॉड्यूल इंस्टॉल करें जो वेंडर मॉड्यूल के लिए ज़रूरी हैं.
  • दूसरा विकल्प: PRODUCT_EXTRA_VNDK_VERSIONS. VNDK स्नैपशॉट मॉड्यूल इंस्टॉल करें. भले ही, वेंडर के मौजूदा मॉड्यूल कुछ भी हों. इससे, PRODUCT_EXTRA_VNDK_VERSIONS में दिए गए पहले से बने VNDK स्नैपशॉट इंस्टॉल हो जाते हैं. ऐसा करने के लिए, इन्हें बिल्ड के समय किसी दूसरे मॉड्यूल से लिंक नहीं किया जाता.

BOARD_VNDK_VERSION सेट करना

BOARD_VNDK_VERSION से VNDK का वह वर्शन दिखता है जिस पर मौजूदा वेंडर के मॉड्यूल बनाने ज़रूरी हैं. अगर BOARD_VNDK_VERSION में /prebuilts/vndk डायरेक्ट्री में VNDK स्नैपशॉट का वर्शन उपलब्ध है, तो BOARD_VNDK_VERSION में दिखाया गया VNDK स्नैपशॉट इंस्टॉल हो जाता है. अगर डायरेक्ट्री में VNDK स्नैपशॉट उपलब्ध नहीं है, तो बिल्ड करने में गड़बड़ी होती है.

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

PRODUCT_EXTRA_VNDK_VERSIONS सेट करना

PRODUCT_EXTRA_VNDK_VERSIONS, इंस्टॉल किए जाने वाले VNDK के अन्य वर्शन की सूची देता है. आम तौर पर, मौजूदा वेंडर पार्टीशन के लिए एक VNDK स्नैपशॉट काफ़ी होता है. हालांकि, कुछ मामलों में आपको एक सिस्टम इमेज में कई स्नैपशॉट शामिल करने पड़ सकते हैं. उदाहरण के लिए, जीएसआई में कई स्नैपशॉट होते हैं, ताकि एक सिस्टम इमेज के साथ कई वेंडर वर्शन काम कर सकें. PRODUCT_EXTRA_VNDK_VERSIONS को सेट करके, BOARD_VNDK_VERSION में VNDK वर्शन के साथ-साथ VNDK स्नैपशॉट मॉड्यूल भी इंस्टॉल किए जा सकते हैं.

अगर PRODUCT_EXTRA_VNDK_VERSIONS में वर्शन की कोई खास सूची है, तो बिल्ड सिस्टम, prebuilts/vndk डायरेक्ट्री में वर्शन की सूची के पहले से बनाए गए स्नैपशॉट खोजता है. अगर बिल्ड सिस्टम, सूची में दिए गए सभी स्नैपशॉट ढूंढता है, तो वह उन स्नैपशॉट फ़ाइलों को हर VNDK APEX (out/target/product/$(TARGET_DEVICE)/system_ext/apex/com.android.vndk.vVER) में इंस्टॉल करता है. वर्शन मौजूद न होने पर, बिल्ड से जुड़ी गड़बड़ी होती है.

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

PLATFORM_VNDK_VERSION

PLATFORM_VNDK_VERSION, सिस्टम सोर्स में मौजूद मौजूदा VNDK मॉड्यूल के लिए VNDK वर्शन तय करता है. वैल्यू अपने-आप सेट होती है:

  • रिलीज़ से पहले, PLATFORM_VNDK_VERSION को PLATFORM_VERSION_CODENAME के तौर पर सेट किया जाता है.
  • रिलीज़ होने पर, PLATFORM_SDK_VERSION को PLATFORM_VNDK_VERSION में कॉपी किया जाता है.

Android वर्शन रिलीज़ होने के बाद, मौजूदा VNDK लाइब्रेरी को VNDK APEX (/system/apex/com.android.vndk.vVER) में इंस्टॉल किया जाता है. यहां VER वह वर्शन होता है जिसे PLATFORM_VNDK_VERSION में सेव किया गया है.

जब BOARD_VNDK_VERSION को current पर सेट किया जाता है, तो PLATFORM_VNDK_VERSION को ro.vndk.version में सेव किया जाता है. इसके अलावा, BOARD_VNDK_VERSION को ro.vndk.version में सेव किया जाता है. Android रिलीज़ होने पर, PLATFORM_VNDK_VERSION को SDK टूल के वर्शन पर सेट किया जाता है. रिलीज़ से पहले, PLATFORM_VNDK_VERSION के लिए Android के अक्षरों और अंकों वाले कोड नेम का इस्तेमाल किया जाता है.

VNDK वर्शन की सेटिंग की खास जानकारी

टेबल में, VNDK वर्शन की सेटिंग के बारे में खास जानकारी दी गई है.

वेंडर
बिल्ड
बोर्ड
वर्शन
SDK टूल
रिलीज़
प्लैटफ़ॉर्म
वर्शन
वर्शन
प्रॉपर्टी
डायरेक्ट्री इंस्टॉल करना
वीएनडीके के मौजूदा मॉड्यूल current पहले CODE_NAME CODE_NAME /system/apex/com.android.vndk.vCODE_NAME
बाद में SDK_VER SDK_VER /system/apex/com.android.vndk.vSDK_VER
पहले से बने स्नैपशॉट मॉड्यूल VNDK_VER
स्नैपशॉट के लिए
पहले या बाद में CODE_NAME
या SDK_VER
VNDK_VER /system_ext/apex/com.android.vndk.vVNDK_VER
  • बोर्ड का वर्शन (BOARD_VNDK_VERSION). VNDK का वह वर्शन जिसकी ज़रूरत वेंडर मॉड्यूल को बनाने के लिए होती है. अगर वेंडर मॉड्यूल, मौजूदा सिस्टम मॉड्यूल से लिंक किए जा सकते हैं, तो इसे current पर सेट करें.
  • प्लैटफ़ॉर्म वर्शन (PLATFORM_VNDK_VERSION). VNDK का वह वर्शन जिसे मौजूदा सिस्टम मॉड्यूल बना रहे हैं. सिर्फ़ तब बनाया जाता है, जब BOARD_VNDK_VERSION की वैल्यू मौजूदा वैल्यू के बराबर हो.
  • वर्शन प्रॉपर्टी (ro.vndk.version). यह प्रॉपर्टी, VNDK के उस वर्शन के बारे में बताती है जिसकी ज़रूरत, vendor.img में मौजूद बाइनरी और लाइब्रेरी को काम करने के लिए होती है. /vendor/default.prop पर vendor.img में सेव किया गया.