VNDK . को सक्षम करना

VNDK को विक्रेता और सिस्टम के बीच चिंताओं को अलग करने के लिए कोडबेस में कई बदलावों की आवश्यकता होती है। विक्रेता/ओईएम कोडबेस में वीएनडीके को सक्षम करने के लिए निम्नलिखित गाइड का उपयोग करें।

सिस्टम लाइब्रेरी बनाएं

बिल्ड सिस्टम में लाइब्रेरी (साझा, स्थिर, या हेडर) और बायनेरिज़ सहित कई प्रकार की ऑब्जेक्ट शामिल हैं।

सिस्टम लाइब्रेरी बनाएं
चित्र 1. सिस्टम लाइब्रेरी बनाएँ
  • 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 को सक्षम करने के लिए:

  1. vendor.img और system.img विभाजन के आवश्यक आकारों की गणना करके पात्रता निर्धारित करें।
  2. 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 शामिल करें।