सूंग बिल्ड सिस्टम

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

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

सूंग क्या है?

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

देखें एंड्रॉयड मेक बिल्ड सिस्टम सामान्य के लिए एंड्रॉयड ओपन सोर्स प्रोजेक्ट (AOSP) में वर्णन निर्देश और 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)

जल्द ही उदाहरण

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 फ़ाइलों सरल हैं। उनमें सशर्त या नियंत्रण प्रवाह विवरण शामिल नहीं हैं; गो में लिखे गए बिल्ड लॉजिक द्वारा सभी जटिलताओं को नियंत्रित किया जाता है। जब संभव हो, वाक्य रचना और के शब्दों Android.bp फ़ाइलों के समान हैं Bazel BUILD फ़ाइलें

मॉड्यूल

एक में एक मॉड्यूल Android.bp एक साथ फ़ाइल शुरू होता है मॉड्यूल प्रकार में सम्पत्तियों का एक समूह द्वारा पीछा name: "value", प्रारूप:

cc_binary {
    name: "gzip",
    srcs: ["src/test/minigzip.c"],
    shared_libs: ["libz"],
    stl: "none",
}

हर मॉड्यूल एक होना आवश्यक है name संपत्ति, और मूल्य सभी में अनन्य होना चाहिए Android.bp , फ़ाइलों को छोड़कर name नामस्थान और पहले से बनाए गए मॉड्यूल में संपत्ति मूल्यों, जो दोहरा सकते हैं।

srcs संपत्ति निर्दिष्ट स्रोत मॉड्यूल का निर्माण करने के लिए प्रयोग किया जाता फ़ाइलें, स्ट्रिंग की एक सूची के रूप में। आप अन्य मॉड्यूल, स्रोत फ़ाइलों का उत्पादन तरह के उत्पादन में संदर्भित कर सकते हैं genrule या filegroup , मॉड्यूल संदर्भ सिंटैक्स का उपयोग करके ":<module-name>"

वैध मॉड्यूल प्रकार और उनके गुणों की एक सूची के लिए, देखें सूंग मॉड्यूल संदर्भ

प्रकार

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

  • बूलियन्स ( true या false )
  • पूर्णांकों ( int )
  • तार ( "string" )
  • तार की सूची ( ["string1", "string2"] )
  • मैप्स ( {key1: "value1", key2: ["value2"]} )

मानचित्र में नेस्टेड मानचित्रों सहित किसी भी प्रकार के मान हो सकते हैं। सूचियों और मानचित्रों में अंतिम मान के बाद अनुगामी अल्पविराम हो सकते हैं।

ग्लोब्स

गुण है कि फ़ाइलों की एक सूची ले, इस तरह के रूप srcs , यह भी ग्लोब पैटर्न ले सकते हैं। ग्लोब पैटर्न सामान्य यूनिक्स वाइल्डकार्ड शामिल कर सकते हैं * उदाहरण के लिए, *.java । ग्लोब पैटर्न भी एक भी शामिल कर सकते हैं ** एक रास्ता तत्व है, जो शून्य या अधिक पथ तत्वों से मेल खाता है के रूप में वाइल्डकार्ड। उदाहरण के लिए, java/**/*.java दोनों से मेल खाता है java/Main.java और java/com/android/Main.java पैटर्न।

चर

एक Android.bp फ़ाइल शीर्ष स्तर के चर कार्य हो सकता है:

gzip_srcs = ["src/test/minigzip.c"],
cc_binary {
    name: "gzip",
    srcs: gzip_srcs,
    shared_libs: ["libz"],
    stl: "none",
}

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

टिप्पणियाँ

Android.bp फ़ाइलें सी शैली बहु शामिल कर सकते हैं /* */ और C ++ शैली एकल लाइन // टिप्पणी नहीं।

ऑपरेटर्स

स्ट्रिंग्स, स्ट्रिंग्स की सूची और मानचित्रों को + ऑपरेटर का उपयोग करके जोड़ा जा सकता है। पूर्णांकों का उपयोग कर अभिव्यक्त किया जा सकता + ऑपरेटर। मानचित्र को जोड़ने से दोनों मानचित्रों में चाबियों का संघ उत्पन्न होता है, दोनों मानचित्रों में मौजूद किसी भी कुंजी के मूल्यों को जोड़ देता है।

सशर्त,

सूंग में सशर्त समर्थन नहीं करता Android.bp फ़ाइलें। इसके बजाय, निर्माण नियमों में जटिलता जिसके लिए सशर्त की आवश्यकता होती है, को गो में नियंत्रित किया जाता है, जहां उच्च-स्तरीय भाषा सुविधाओं का उपयोग किया जा सकता है, और सशर्त द्वारा शुरू की गई अंतर्निहित निर्भरता को ट्रैक किया जा सकता है। अधिकांश सशर्त मानचित्र गुण में परिवर्तित हो जाते हैं, जहाँ मानचित्र में किसी एक मान का चयन किया जाता है और शीर्ष-स्तरीय गुणों में जोड़ा जाता है।

उदाहरण के लिए, आर्किटेक्चर-विशिष्ट फ़ाइलों का समर्थन करने के लिए:

cc_library {
    ...
    srcs: ["generic.cpp"],
    arch: {
        arm: {
            srcs: ["arm.cpp"],
        },
        x86: {
            srcs: ["x86.cpp"],
        },
    },
}

फ़ॉर्मेटर

सूंग खाका फ़ाइलें, के लिए इसी तरह के लिए एक विहित फ़ॉर्मेटर शामिल gofmt । करने के लिए रिकर्सिवली सभी पुनः स्वरूपित Android.bp वर्तमान निर्देशिका, चलाने में फाइल:

bpfmt -w .

विहित प्रारूप में चार-स्थान इंडेंट, एक बहु-तत्व सूची के प्रत्येक तत्व के बाद नई लाइनें और सूचियों और मानचित्रों में एक अनुगामी अल्पविराम शामिल हैं।

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

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

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

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

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

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

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

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

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

जब तक पूरी तरह से एंड्रॉयड सूंग के लिए आप से बदल देता है, मेक उत्पाद विन्यास एक का उल्लेख करना होगा PRODUCT_SOONG_NAMESPACES मूल्य। अपने मूल्य कि सूंग निर्यात के द्वारा निर्मित किया जाना सुनिश्चित करने के लिए नामस्थान के एक अंतरिक्ष अलग की गई सूची में होना चाहिए m आदेश। सूंग में Android का रूपांतरण पूरा होने के बाद, नाम स्थान को सक्षम करने का विवरण बदल सकता है।

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

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

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

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

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

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