Make से Soong में बदलना

Android 7.0 रिलीज़ होने से पहले, Android सिर्फ़ अपने बिल्ड नियमों को बताने और उन्हें लागू करने के लिए, GNU Make का इस्तेमाल करता था. बनाएं बिल्ड सिस्टम बड़े पैमाने पर काम करता है और इस्तेमाल किया जा रहा है. हालांकि, यह Android बड़े पैमाने पर धीरे-धीरे काम कर रहा है. इसमें गड़बड़ी होने की ज़्यादा संभावना है, इसे बड़े पैमाने पर बढ़ाया नहीं जा सकता, और इसकी जांच करना मुश्किल हो गया है. Soong बिल्ड सिस्टम, Android बिल्ड के लिए ज़रूरी सुविधा देता है.

इस वजह से, प्लैटफ़ॉर्म डेवलपर को जल्द से जल्द Find My की जगह से, Soong का इस्तेमाल करना शुरू कर देना चाहिए. सहायता पाने के लिए, android-building Google ग्रुप पर सवाल भेजें.

Soong क्या है?

Soong बिल्ड सिस्टम को Android 7.0 (Nougat) में पेश किया गया था, ताकि Make की जगह इसे इस्तेमाल किया जा सके. यह Android के बिल्ड को तेज़ करने के लिए, Kati GNU Make क्लोन टूल और Ninja बिल्ड सिस्टम कॉम्पोनेंट का इस्तेमाल करता है.

सामान्य निर्देशों के लिए, Android Open Source Project (AOSP) में Android Make बिल्ड सिस्टम के बारे में जानकारी देखें. साथ ही, Make से Soong पर स्विच करने के लिए ज़रूरी बदलावों के बारे में जानने के लिए, Android.mk लिखने वालों के लिए बिल्ड सिस्टम में हुए बदलाव देखें.

मुख्य शब्दों की परिभाषाओं के लिए, ग्लॉसरी में बिल्ड से जुड़ी एंट्री देखें. पूरी जानकारी के लिए, Soong की रेफ़रंस फ़ाइलें देखें.

Make और Soong की तुलना

यहां Make कॉन्फ़िगरेशन और Soong कॉन्फ़िगरेशन की तुलना की गई है. दोनों कॉन्फ़िगरेशन, 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)

सूंग का उदाहरण

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.

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

जब तक Android, Make से Soong पर पूरी तरह से स्विच नहीं हो जाता, तब तक Make प्रॉडक्ट कॉन्फ़िगरेशन में PRODUCT_SOONG_NAMESPACES वैल्यू तय करनी होगी. इसकी वैल्यू, स्पेस से अलग किए गए नेमस्पेस की सूची होनी चाहिए. Soong, इन नेमस्पेस को Make में एक्सपोर्ट करता है, ताकि इन्हें m कमांड से बनाया जा सके. Android को Soong में बदलने की प्रोसेस पूरी होने के बाद, नेमस्पेस चालू करने की जानकारी बदल सकती है.

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

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

ध्यान दें कि नेमस्पेस में नाम प्रॉपर्टी नहीं होती. इसका पाथ, अपने-आप नाम के तौर पर असाइन हो जाता है.

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

यहां एक उदाहरण दिया गया है: Soong, नेमस्पेस N में मॉड्यूल M के ज़रिए बताई गई डिपेंडेंसी D को हल करने की कोशिश करता है. यह नेमस्पेस I1, I2, I3 को इंपोर्ट करता है…

  1. अगर D, //namespace:module फ़ॉर्म का एफ़क्यूडीएन है, तो दिए गए मॉड्यूल के नाम के लिए, सिर्फ़ दिए गए नेमस्पेस को खोजा जाता है.
  2. अगर ऐसा नहीं है, तो Soong सबसे पहले नेमस्पेस N में बताए गए D नाम के मॉड्यूल को खोजता है.
  3. अगर वह मॉड्यूल मौजूद नहीं है, तो Soong नेमस्पेस I1, I2, I3… में D नाम का मॉड्यूल खोजता है
  4. आखिर में, Soong रूट नेमस्पेस में खोजता है.