वेंडर नेटिव डेवलपमेंट किट (वीएनडीके) के लिए, कोडबेस में कई बदलाव करने पड़ते हैं, ताकि वेंडर और सिस्टम के बीच अंतर किया जा सके. वेंडर/ओईएम कोडबेस में VNDK चालू करने के लिए, यहां दी गई गाइड का इस्तेमाल करें.
सिस्टम लाइब्रेरी बनाना
बिल्ड सिस्टम में कई तरह के ऑब्जेक्ट होते हैं. जैसे, लाइब्रेरी (शेयर की गई, स्टैटिक या हेडर) और बाइनरी.

पहली इमेज. सिस्टम लाइब्रेरी बनाना.
core
लाइब्रेरी का इस्तेमाल, सिस्टम इमेज पर मौजूद सिस्टम इमेज करती है. इन लाइब्रेरी का इस्तेमालvendor
,vendor_available
,vndk
याvndk-sp
लाइब्रेरी नहीं कर सकतीं.cc_library { name: "libThatIsCore", ... }
vendor-only
(याproprietary
) लाइब्रेरी का इस्तेमाल, वेंडर की इमेज पर किया जाता है.cc_library { name: "libThatIsVendorOnly", proprietary: true, # or: vendor: true, # (for things in AOSP) ... }
vendor_available
लाइब्रेरी का इस्तेमाल, वेंडर की इमेज में किया जाता है. वेंडर की इमेज मेंvendor_available
के डुप्लीकेट हो सकते हैं.core
cc_library { name: "libThatIsVendorAvailable", vendor_available: true, ... }
vndk
लाइब्रेरी का इस्तेमाल, वेंडर इमेज और सिस्टम इमेज पर किया जाता है.cc_library { name: "libThatIsVndk", vendor_available: true, vndk: { enabled: true, } ... }
vndk-sp
लाइब्रेरी का इस्तेमाल वेंडर इमेज करती हैं. साथ ही, सिस्टम इमेज भी इनका इस्तेमाल करती हैं.cc_library { name: "libThatIsVndkSp", vendor_available: true, vndk: { enabled: true, support_system_process: true, } ... }
llndk
लाइब्रेरी का इस्तेमाल सिस्टम और वेंडर इमेज, दोनों के लिए किया जाता है.cc_library { name: "libThatIsLlndk", llndk: { symbol_file: "libthatisllndk.map.txt" } ... }
जब किसी लाइब्रेरी को vendor_available:true
के तौर पर मार्क किया जाता है, तो उसे दो बार बनाया जाता है:
- प्लैटफ़ॉर्म के लिए एक बार (इसलिए,
/system/lib
पर इंस्टॉल किया गया) - वेंडर के लिए एक बार (और इस तरह
/vendor/lib
या वीएनडीके एपेक्स में इंस्टॉल किया जाता है)
वेंडर के वर्शन वाली लाइब्रेरी, -D__ANDROID_VNDK__
का इस्तेमाल करके बनाई जाती हैं.
इस फ़्लैग की मदद से, निजी सिस्टम कॉम्पोनेंट बंद किए जाते हैं. ये कॉम्पोनेंट, Android के आने वाले वर्शन में काफ़ी बदल सकते हैं. इसके अलावा, अलग-अलग लाइब्रेरी, हेडर का अलग-अलग सेट एक्सपोर्ट करती हैं. जैसे, liblog
. टारगेट के वेंडर वैरिएंट के लिए खास तौर पर उपलब्ध विकल्पों को Android.bp
फ़ाइल में इस तरह से तय किया जा सकता है:
target: { vendor: { … } }
किसी कोडबेस के लिए वीएनडीके चालू करना
किसी कोडबेस के लिए वीएनडीके चालू करने के लिए:
vendor.img
औरsystem.img
पार्टीशन के ज़रूरी साइज़ का हिसाब लगाकर, यह तय करें कि आवेदन किया जा सकता है या नहीं.BOARD_VNDK_VERSION=current
चालू करें. इसेBoardConfig.mk
में जोड़ा जा सकता है या इससे सीधे तौर पर कॉम्पोनेंट बनाए जा सकते हैं. उदाहरण के लिए,m -j BOARD_VNDK_VERSION=current MY-LIB
.
BOARD_VNDK_VERSION=current
चालू करने के बाद, बिल्ड सिस्टम, डिपेंडेंसी और हेडर से जुड़ी इन ज़रूरी शर्तों को लागू करता है.
डिपेंडेंसी मैनेज करना
अगर कोई vendor
ऑब्जेक्ट, ऐसे core
कॉम्पोनेंट पर निर्भर करता है जो vndk
में मौजूद नहीं है या vendor
ऑब्जेक्ट के तौर पर मौजूद नहीं है, तो उसे इनमें से किसी एक विकल्प का इस्तेमाल करके ठीक किया जाना चाहिए:
- डिपेंडेंसी को हटाया जा सकता है.
- अगर
core
कॉम्पोनेंट का मालिकाना हकvendor
के पास है, तो इसेvendor_available
याvendor
के तौर पर मार्क किया जा सकता है. - कोर ऑब्जेक्ट को
vndk
का हिस्सा बनाने वाले बदलाव को Google के साथ शेयर किया जा सकता है.
इसके अलावा, अगर किसी core
कॉम्पोनेंट की डिपेंडेंसी किसी vendor
कॉम्पोनेंट पर है, तो vendor
कॉम्पोनेंट को core
कॉम्पोनेंट में बदलना होगा या डिपेंडेंसी को किसी दूसरे तरीके से हटाना होगा. उदाहरण के लिए, डिपेंडेंसी को हटाकर या डिपेंडेंसी को vendor
कॉम्पोनेंट में ले जाकर.
हेडर मैनेज करना
ग्लोबल हेडर की डिपेंडेंसी को हटाना ज़रूरी है, ताकि बिल्ड सिस्टम को यह पता चल सके कि हेडर को -D__ANDROID_VNDK__
के साथ या इसके बिना बनाना है.
उदाहरण के लिए, libutils हेडर जैसे कि utils/StrongPointer.h
को अब भी हेडर लाइब्रेरी libutils_headers
का इस्तेमाल करके ऐक्सेस किया जा सकता है.
कुछ हेडर (जैसे, unistd.h
) को अब ट्रांज़िटिव तरीके से शामिल नहीं किया जा सकता. हालांकि, उन्हें स्थानीय तौर पर शामिल किया जा सकता है.
आखिर में, private/android_filesystem_config.h
के सार्वजनिक हिस्से को cutils/android_filesystem_config.h
में ले जाया गया है. इन हेडर को मैनेज करने के लिए, इनमें से कोई एक काम करें:
- अगर हो सके, तो सभी
AID_*
मैक्रो कोgetgrnam
/getpwnam
कॉल से बदलकर,private/android_filesystem_config.h
पर निर्भरता हटाएं. उदाहरण के लिए:(uid_t)AID_WIFI
,getpwnam("wifi")->pw_uid
हो जाता है.(gid_t)AID_SDCARD_R
,getgrnam("sdcard_r")->gr_gid
हो जाता है.
private/android_filesystem_config.h
पर जाएं. - हार्ड-कोड किए गए एआईएस के लिए,
cutils/android_filesystem_config.h
शामिल करें.