Android 7.0 रिलीज़ होने से पहले, Android सिर्फ़ अपने बिल्ड नियमों को बताने और उन्हें लागू करने के लिए, GNU Make का इस्तेमाल करता था. Make बिल्ड सिस्टम का इस्तेमाल और इसे काम करने की सुविधा, कई प्लैटफ़ॉर्म पर उपलब्ध है. हालांकि, Android के स्केल पर यह धीमा हो गया, गड़बड़ियों का खतरा बढ़ गया, इसे बड़े पैमाने पर इस्तेमाल नहीं किया जा सका, और इसकी जांच करना मुश्किल हो गया. कॉन्टेंट बनाने सूंग बिल्ड सिस्टम Android बिल्ड के लिए ज़रूरी सुविधा देता है.
इसलिए, प्लैटफ़ॉर्म डेवलपर को जल्द से जल्द Make से स्विच करके, Soong का इस्तेमाल करना चाहिए. सहायता पाने के लिए, android-building Google ग्रुप पर सवाल भेजें.
Soong क्या है?
Make की जगह सूंग का बिल्ड सिस्टम इस्तेमाल करने के लिए, Android 7.0 (Nougat) में नया सिस्टम पेश किया गया था. यह रणनीति, काटी जीएनयू क्लोन टूल और Ninja बिल्ड सिस्टम बनाएं Android के बिल्ड की रफ़्तार बढ़ाने के लिए कॉम्पोनेंट का इस्तेमाल किया जा सकता है.
देखें Android मेक बिल्ड सिस्टम Android ओपन सोर्स प्रोजेक्ट (AOSP) में दी गई जानकारी निर्देश और Android.mk लेखकों के लिए सिस्टम में बदलाव बनाएं देखें.
मुख्य शब्दों की परिभाषाओं के लिए, ग्लॉसरी में बिल्ड से जुड़ी एंट्री देखें. पूरी जानकारी के लिए, Soong की रेफ़रंस फ़ाइलें देखें.
बनाएं और सूंग की तुलना करें
यहां बताया गया है कि 'मेक कॉन्फ़िगरेशन' और सूंग के इस काम को कैसे पूरा कर रहे हैं
सूंग कॉन्फ़िगरेशन (ब्लूप्रिंट या .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)
Soong का उदाहरण
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"],
}
पहले से बने मॉड्यूल
पहले से बने कुछ मॉड्यूल टाइप की मदद से, मॉड्यूल का नाम सोर्स पर आधारित मॉड्यूल के नाम जैसा ही रखा जा सकता है. उदाहरण के लिए, अगर foo
नाम का cc_binary
पहले से मौजूद है, तो foo
नाम का cc_prebuilt_binary
भी हो सकता है. इससे, डेवलपर को यह चुनने की सुविधा मिलती है कि उनके फ़ाइनल प्रॉडक्ट में कौनसा वर्शन शामिल करना है. अगर किसी बिल्ड कॉन्फ़िगरेशन में दोनों वर्शन शामिल हैं, तो पहले से बनाए गए मॉड्यूल की परिभाषा में prefer
फ़्लैग की वैल्यू से यह तय होता है कि किस वर्शन को प्राथमिकता दी जाए.
ध्यान दें कि पहले से बने कुछ मॉड्यूल के नाम ऐसे होते हैं जो prebuilt
से शुरू नहीं होते,
जैसे कि android_app_import
.
नेमस्पेस मॉड्यूल
जब तक Android, Make से Soong पर पूरी तरह से स्विच नहीं हो जाता, तब तक Make प्रॉडक्ट कॉन्फ़िगरेशन में PRODUCT_SOONG_NAMESPACES
वैल्यू तय करनी होगी. यह
मान, नेमस्पेस की स्पेस से अलग की गई सूची में होना चाहिए, जिसे सूंग 'मेक' में एक्सपोर्ट करता है
को m
कमांड से बनाया जाना चाहिए. Android के सूंग में बदलने की प्रक्रिया पूरी होने के बाद,
नेमस्पेस चालू करने की जानकारी बदल सकती है.
सूंग अलग-अलग डायरेक्ट्री में मॉड्यूल की सुविधा देता है, ताकि एक ही नाम, जब तक हर मॉड्यूल एक अलग नेमस्पेस में बताया गया हो. ऐप्लिकेशन नेमस्पेस का एलान इस तरह किया जा सकता है:
soong_namespace {
imports: ["path/to/otherNamespace1", "path/to/otherNamespace2"],
}
ध्यान दें कि नेमस्पेस में नाम प्रॉपर्टी नहीं होती; इसका पाथ अपने-आप असाइन किया गया है.
हर सूंग मॉड्यूल को पेड़ में उसकी जगह के आधार पर एक नेमस्पेस असाइन किया जाता है.
हर Soong मॉड्यूल को नेमस्पेस में माना जाता है, जो मौजूदा डायरेक्ट्री या सबसे नज़दीकी पैरंट डायरेक्ट्री में Android.bp
फ़ाइल में मिले soong_namespace
से तय होता है. अगर ऐसा कोई soong_namespace
मॉड्यूल नहीं मिलता है, तो मॉड्यूल को डिफ़ॉल्ट रूट नेमस्पेस में माना जाता है.
यहां एक उदाहरण दिया गया है: सूंग, मॉड्यूल M के ज़रिए बताए गए डिपेंडेंसी D को ठीक करने की कोशिश करता है नेमस्पेस N में, जो नेमस्पेस I1, I2, I3 इंपोर्ट करता है...
- अगर D,
//namespace:module
फ़ॉर्म का एफ़क्यूडीएन है, तो दिए गए मॉड्यूल के नाम के लिए, सिर्फ़ दिए गए नेमस्पेस को खोजा जाता है. - अगर ऐसा नहीं है, तो Soong सबसे पहले नेमस्पेस N में बताए गए D नाम के मॉड्यूल को खोजता है.
- अगर वह मॉड्यूल मौजूद नहीं है, तो सूंग नेमस्पेस I1, I2, I3...
- आखिर में, Soong रूट नेमस्पेस में खोजता है.