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