जल्द ही निर्माण प्रणाली

एंड्रॉइड 7.0 रिलीज से पहले, एंड्रॉइड ने अपने निर्माण नियमों का वर्णन करने और निष्पादित करने के लिए विशेष रूप से जीएनयू मेक का उपयोग किया था। मेक बिल्ड सिस्टम व्यापक रूप से समर्थित और उपयोग किया जाता है, लेकिन एंड्रॉइड के पैमाने पर यह धीमा, त्रुटि प्रवण, अनस्केलेबल और परीक्षण करना कठिन हो गया है। सूंग बिल्ड सिस्टम एंड्रॉइड बिल्ड के लिए आवश्यक लचीलापन प्रदान करता है।

इस कारण से, प्लेटफ़ॉर्म डेवलपर्स से अपेक्षा की जाती है कि वे मेक से स्विच करें और जल्द से जल्द सूंग को अपनाएँ। समर्थन प्राप्त करने के लिए एंड्रॉइड-बिल्डिंग Google समूह को प्रश्न भेजें।

सूंग क्या है?

मेक को बदलने के लिए सूंग बिल्ड सिस्टम को एंड्रॉइड 7.0 (नूगट) में पेश किया गया था। यह एंड्रॉइड के निर्माण को गति देने के लिए काटी जीएनयू मेक क्लोन टूल और निंजा बिल्ड सिस्टम घटक का लाभ उठाता है।

सामान्य निर्देशों के लिए एंड्रॉइड ओपन सोर्स प्रोजेक्ट (एओएसपी) में एंड्रॉइड मेक बिल्ड सिस्टम विवरण देखें और मेक से सूंग में अनुकूलित करने के लिए आवश्यक संशोधनों के बारे में जानने के लिए एंड्रॉइड.एमके राइटर्स के लिए बिल्ड सिस्टम परिवर्तन देखें।

मुख्य शब्दों की परिभाषाओं के लिए शब्दावली में बिल्ड-संबंधित प्रविष्टियाँ और संपूर्ण विवरण के लिए सूंग संदर्भ फ़ाइलें देखें।

मेक एंड सूंग तुलना

यहां सूंग कॉन्फ़िगरेशन (ब्लूप्रिंट या .bp ) फ़ाइल में इसे पूरा करने वाले सूंग के साथ मेक कॉन्फ़िगरेशन की तुलना की गई है।

उदाहरण बनाओ

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := libxmlrpc++
LOCAL_MODULE_HOST_OS := linux

LOCAL_RTTI_FLAG := -frtti
LOCAL_CPPFLAGS := -Wall -Werror -fexceptions
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/src

LOCAL_SRC_FILES := $(call \
     all-cpp-files-under,src)
include $(BUILD_SHARED_LIBRARY)

शीघ्र उदाहरण

cc_library_shared {
     name: "libxmlrpc++",

     rtti: true,
     cppflags: [
           "-Wall",
           "-Werror",
           "-fexceptions",
     ],
     export_include_dirs: ["src"],
     srcs: ["src/**/*.cpp"],

     target: {
           darwin: {
                enabled: false,
           },
     },
}

परीक्षण-विशिष्ट सूंग कॉन्फ़िगरेशन उदाहरणों के लिए, सरल बिल्ड कॉन्फ़िगरेशन देखें।

Android.bp फ़ाइल में फ़ील्ड की व्याख्या के लिए, Android.bp फ़ाइल प्रारूप देखें।

विशेष मॉड्यूल

कुछ विशेष मॉड्यूल समूहों में अद्वितीय विशेषताएं होती हैं।

डिफ़ॉल्ट मॉड्यूल

एक डिफ़ॉल्ट मॉड्यूल का उपयोग कई मॉड्यूल में समान गुणों को दोहराने के लिए किया जा सकता है। उदाहरण के लिए:

cc_defaults {
    name: "gzip_defaults",
    shared_libs: ["libz"],
    stl: "none",
}

cc_binary {
    name: "gzip",
    defaults: ["gzip_defaults"],
    srcs: ["src/test/minigzip.c"],
}

पूर्वनिर्मित मॉड्यूल

कुछ पूर्वनिर्मित मॉड्यूल प्रकार एक मॉड्यूल को उसके स्रोत-आधारित समकक्षों के समान नाम रखने की अनुमति देते हैं। उदाहरण के लिए, जब पहले से ही इसी नाम की एक cc_binary मौजूद हो तो foo नाम की एक cc_prebuilt_binary हो सकती है। इससे डेवलपर्स को अपने अंतिम उत्पाद में कौन सा संस्करण शामिल करना है यह चुनने की सुविधा मिलती है। यदि किसी बिल्ड कॉन्फ़िगरेशन में दोनों संस्करण शामिल हैं, तो प्रीबिल्ट मॉड्यूल परिभाषा में prefer ध्वज मान यह तय करता है कि किस संस्करण को प्राथमिकता है। ध्यान दें कि कुछ प्रीबिल्ट मॉड्यूल के नाम ऐसे होते हैं जो prebuilt से शुरू नहीं होते हैं, जैसे कि android_app_import

नेमस्पेस मॉड्यूल

जब तक एंड्रॉइड पूरी तरह से मेक से सूंग में परिवर्तित नहीं हो जाता, तब तक मेक उत्पाद कॉन्फ़िगरेशन को PRODUCT_SOONG_NAMESPACES मान निर्दिष्ट करना होगा। इसका मान नामस्थानों की एक स्थान-पृथक सूची होनी चाहिए जिसे सूंग m कमांड द्वारा निर्मित करने के लिए निर्यात करता है। एंड्रॉइड का सूंग में रूपांतरण पूरा होने के बाद, नेमस्पेस को सक्षम करने का विवरण बदल सकता है।

सूंग विभिन्न निर्देशिकाओं में मॉड्यूल के लिए एक ही नाम निर्दिष्ट करने की क्षमता प्रदान करता है, जब तक कि प्रत्येक मॉड्यूल को एक अलग नामस्थान में घोषित किया जाता है। एक नामस्थान इस प्रकार घोषित किया जा सकता है:

soong_namespace {
    imports: ["path/to/otherNamespace1", "path/to/otherNamespace2"],
}

ध्यान दें कि नेमस्पेस में नाम गुण नहीं होता है; इसका पथ स्वचालित रूप से इसके नाम के रूप में निर्दिष्ट हो जाता है।

प्रत्येक सूंग मॉड्यूल को पेड़ में उसके स्थान के आधार पर एक नामस्थान सौंपा गया है। प्रत्येक सूंग मॉड्यूल को वर्तमान निर्देशिका या निकटतम पूर्वज निर्देशिका में Android.bp फ़ाइल में पाए जाने वाले soong_namespace द्वारा परिभाषित नामस्थान में माना जाता है। यदि ऐसा कोई soong_namespace मॉड्यूल नहीं मिलता है, तो मॉड्यूल को अंतर्निहित रूट नेमस्पेस में माना जाता है।

यहां एक उदाहरण दिया गया है: जल्द ही नेमस्पेस एन में मॉड्यूल एम द्वारा घोषित निर्भरता डी को हल करने का प्रयास किया जाता है जो नेमस्पेस I1, I2, I3 को आयात करता है…

  1. फिर यदि D फॉर्म //namespace:module का पूर्णतः योग्य नाम है, तो निर्दिष्ट मॉड्यूल नाम के लिए केवल निर्दिष्ट नामस्थान खोजा जाता है।
  2. अन्यथा, सूंग सबसे पहले नेमस्पेस एन में घोषित डी नामक मॉड्यूल की तलाश करता है।
  3. यदि वह मॉड्यूल मौजूद नहीं है, तो सूंग नेमस्पेस I1, I2, I3… में D नामक मॉड्यूल की तलाश करता है।
  4. अंत में, सूंग रूट नेमस्पेस में दिखता है।