वीएनडीके चालू करें

वेंडर नेटिव डेवलपमेंट किट (वीएनडीके) को अलग करने के लिए, कोड बेस में कई बदलाव करने की ज़रूरत होती है सिस्टम और वेंडर, किसी वेंडर/OEM में 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"
        }
        ...
    }
    

जब किसी लाइब्रेरी को vendor_available:true के तौर पर मार्क किया जाता है, तो दो बार:

  • प्लैटफ़ॉर्म के लिए एक बार (और इस तरह /system/lib पर इंस्टॉल किया गया)
  • वेंडर के लिए एक बार (और इस तरह /vendor/lib या VNDK APEX पर इंस्टॉल किया गया)

लिब्स के वेंडर वर्शन, -D__ANDROID_VNDK__ की मदद से बनाए गए हैं. निजी सिस्टम के कॉम्पोनेंट, जो आने वाले वर्शन में काफ़ी बदल सकते हैं इस फ़्लैग के साथ Android बंद कर दिया गया है. इसके अलावा, अलग-अलग लाइब्रेरी हेडर का अलग सेट है (जैसे कि liblog). एक खास टारगेट के वेंडर वैरिएंट की जानकारी, Android.bp फ़ाइल में दी जा सकती है इसमें:

target: { vendor: { … } }

कोड बेस के लिए वीएनडीके चालू करना

कोड बेस के लिए वीएनडीके को चालू करने के लिए:

  1. प्रॉडक्ट की ज़रूरी शर्तों को कैलकुलेट करके, यह तय करें कि मॉडल कितना ज़रूरी है vendor.img और system.img पार्टिशन.
  2. BOARD_VNDK_VERSION=current चालू करें. आप इसमें जोड़ सकते हैं BoardConfig.mk या सीधे इससे कॉम्पोनेंट बनाएं (उदाहरण के लिए, m -j BOARD_VNDK_VERSION=current MY-LIB).

BOARD_VNDK_VERSION=current को चालू करने के बाद, बिल्ड सिस्टम नीचे दी गई डिपेंडेंसी और हेडर की ज़रूरी शर्तें लागू करती है.

डिपेंडेंसी मैनेज करें

core कॉम्पोनेंट पर निर्भर करने वाला vendor ऑब्जेक्ट जो vndk में या vendor ऑब्जेक्ट के तौर पर मौजूद नहीं है इसका समाधान इनमें से किसी एक विकल्प का इस्तेमाल करके किया जाना चाहिए:

  • डिपेंडेंसी हटाई जा सकती है.
  • अगर core कॉम्पोनेंट का मालिकाना हक vendor के पास है, तो यह ये काम कर सकता है: vendor_available या vendor के तौर पर मार्क किया जाना चाहिए.
  • vndk के मुख्य ऑब्जेक्ट को शामिल करने में होने वाला बदलाव Google पर अपलोड किया गया.

इसके अलावा, अगर core कॉम्पोनेंट vendor कॉम्पोनेंट बनाने के लिए, vendor कॉम्पोनेंट बनाना ज़रूरी है किसी core कॉम्पोनेंट में या डिपेंडेंसी होनी चाहिए दूसरे तरीके से हटाया गया हो (उदाहरण के लिए, डिपेंडेंसी को हटाकर या vendor कॉम्पोनेंट में निर्भरता रखता है).

हेडर मैनेज करें

ग्लोबल हेडर डिपेंडेंसी को हटाना ज़रूरी है, ताकि बिल्ड सिस्टम को जानकारी मिल सके -D__ANDROID_VNDK__ के साथ या उसके बिना हेडर बनाना है या नहीं. उदाहरण के लिए, utils/StrongPointer.h जैसे libutils हेडर हेडर लाइब्रेरी का इस्तेमाल करके अब भी ऐक्सेस किया जा सकेगा libutils_headers.

कुछ हेडर (जैसे कि unistd.h) को अब ट्रांज़िट तरीके से शामिल नहीं किया जा सकता लेकिन स्थानीय तौर पर शामिल किया जा सकता है.

आख़िर में, private/android_filesystem_config.h का सार्वजनिक हिस्सा को cutils/android_filesystem_config.h में ले जाया गया. मैनेज करने के लिए तो इनमें से कोई एक काम करें:

  • इस पर निर्भरता हटाएं सभी को बदलकर private/android_filesystem_config.h getgrnam/ के साथ AID_* मैक्रो अगर हो सके, तो getpwnam कॉल करें. जैसे:
    • (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.