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
पुस्तकालयों का उपयोग किया जाता है, विक्रेता छवि पर (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" } ... }
जब किसी lib को vendor_available:true
के रूप में चिह्नित किया जाता है, तो इसे दो बार बनाया जाता है:
- एक बार प्लेटफ़ॉर्म के लिए (और इस प्रकार
/system/lib
पर स्थापित) - एक बार विक्रेता के लिए (और इस प्रकार
/vendor/lib
या VNDK APEX पर स्थापित)
लिब्ज़ के विक्रेता संस्करण -D__ANDROID_VNDK__
के साथ बनाए गए हैं। निजी सिस्टम घटक जो एंड्रॉइड के भविष्य के संस्करणों में महत्वपूर्ण रूप से बदल सकते हैं, इस ध्वज के साथ अक्षम हैं। इसके अलावा, अलग-अलग लाइब्रेरी हेडर का एक अलग सेट निर्यात करती हैं (जैसे कि liblog
)। किसी लक्ष्य के विक्रेता संस्करण के लिए विशिष्ट विकल्प Android.bp
फ़ाइल में निर्दिष्ट किए जा सकते हैं:
target: { vendor: { … } }
कोडबेस के लिए VNDK को सक्षम करना
कोडबेस के लिए VNDK को सक्षम करने के लिए:
-
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
देखें। -
- हार्ड-कोडित AIS के लिए,
cutils/android_filesystem_config.h
शामिल करें।