Google is committed to advancing racial equity for Black communities. See how.
این صفحه به‌وسیله ‏Cloud Translation API‏ ترجمه شده است.
Switch to English

سیستم ساخت سونگ

قبل از انتشار اندروید 7.0 ، اندروید به طور انحصاری از GNU Make برای توصیف و اجرای قوانین ساخت خود استفاده کرده است. سیستم ساخت ساخت به طور گسترده ای پشتیبانی و استفاده می شود ، اما در مقیاس اندروید کند ، مستعد خطا ، غیر قابل مقیاس و آزمایش دشوار شد. سیستم ساخت Soong انعطاف پذیری لازم برای ساخت آندروید را فراهم می کند.

به همین دلیل ، انتظار می رود توسعه دهندگان پلت فرم در اسرع وقت از Make استفاده کرده و Soong را اتخاذ کنند. برای دریافت پشتیبانی ، به Google Group سازنده android س questions ال ارسال کنید.

سونگ چیست؟

سیستم ساخت Soong در اندروید 7.0 (نوقا) جایگزین Make شد. این ابزار از Kati GNU Make clone tool و Ninja build جز system سیستم برای سرعت بخشیدن به ساخت آندروید استفاده می کند.

برای کسب دستورالعمل های کلی ، به شرح سیستم ساخت Android Make Build در پروژه منبع باز Android (AOSP) و ایجاد تغییرات سیستم برای Android.mk Writers مراجعه کنید تا درباره تغییرات مورد نیاز جهت سازگاری از Make به Soong اطلاعات کسب کنید.

برای جزئیات کامل به ورودی های مربوط به ساخت واژه نامه برای تعریف اصطلاحات اصلی و پرونده های مرجع Soong مراجعه کنید.

مقایسه کنید و سونگ مقایسه کنید

در اینجا مقایسه Make configuration با Soong وجود دارد که همان را در یک فایل پیکربندی Soong (Blueprint یا .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,
           },
     },
}

برای مثالهای پیکربندی Soong مختص آزمون به پیکربندی ساخت ساده مراجعه کنید.

قالب فایل Android.bp

با طراحی ، فایل های Android.bp ساده هستند. آنها حاوی عبارات شرطی یا کنترل کننده جریان نیستند. تمام پیچیدگی ها با منطق ساخت نوشته شده در Go کنترل می شوند. در صورت امکان ، نحو و معنای فایلهای 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>" .

برای لیستی از انواع ماژول های معتبر و خصوصیات آنها ، به منابع ماژول Soong مراجعه کنید .

انواع

متغیرها و خصوصیات به شدت تایپ می شوند ، متغیرها براساس اولین تخصیص به صورت پویا تنظیم می شوند و خصوصیات از نظر نوع ماژول از نظر آماری تنظیم می شوند. انواع پشتیبانی شده عبارتند از:

  • Booleans ( true یا false )
  • اعداد صحیح ( int )
  • رشته ها ( "string" )
  • لیست رشته ها ( ["string1", "string2"] )
  • نقشه ها ( {key1: "value1", key2: ["value2"]} )

نقشه ها ممکن است از هر نوع ، از جمله نقشه های تو در تو ، مقادیری داشته باشند. لیست ها و نقشه ها ممکن است بعد از آخرین مقدار با کاما عقب باشند.

گلوب

srcs که لیستی از پرونده ها مانند srcs می گیرند می توانند از الگوهای glob نیز استفاده کنند. الگوهای Glob می توانند شامل کارت عادی وحشی UNIX * ، به عنوان مثال *.java . الگوهای Glob همچنین می توانند شامل یک wildcard ** به عنوان یک عنصر مسیر باشند که با عناصر صفر یا بیشتر مساوی باشد. به عنوان مثال ، 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",
}

متغیرها در قسمت باقیمانده پرونده ای که در آن اعلان شده اند ، و همچنین سایر پرونده های Blueprint در دسترس هستند. متغیرها با یک استثنا تغییرناپذیر هستند: می توانند با انتساب += به آنها پیوست شوند ، اما فقط قبل از اینکه به آنها ارجاع شود.

نظرات

Android.bp فایل های می تواند شامل C به سبک چند خطی /* */ و C ++ به سبک تک خط // نظر.

اپراتورها

رشته ها ، لیست رشته ها و نقشه ها را می توان با استفاده از عملگر + پیوست کرد. عدد صحیح را می توان با استفاده از عملگر + جمع بندی کرد. با افزودن نقشه ، اتحاد کلیدها در هر دو نقشه ایجاد می شود و مقادیر کلیدهای موجود در هر دو نقشه را به هم اضافه می کند.

مشروط

سونگ از مشروط در پرونده های Android.bp پشتیبانی نمی کند. در عوض ، پیچیدگی در قوانین ساخت که به شرط های شرطی نیاز دارند ، در Go که در آن می توان از ویژگی های سطح سطح بالا زبان استفاده کرد و وابستگی های ضمنی معرفی شده توسط شرطی ها پیگیری می شوند ، در Go مورد استفاده قرار می گیرند. بیشتر شرطی ها به یک ویژگی نقشه تبدیل می شوند ، جایی که یکی از مقادیر موجود در نقشه انتخاب شده و به خصوصیات سطح بالا اضافه می شود.

به عنوان مثال ، برای پشتیبانی از پرونده های خاص معماری:

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

قالب ساز

Soong شامل یک قالب بندی متعارف برای پرونده های Blueprint ، مشابه 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_binary با همان نام وجود دارد ، می تواند یک cc_prebuilt_binary به نام foo وجود داشته باشد. این به توسعه دهندگان این انعطاف را می دهد تا انتخاب کنند کدام نسخه را در محصول نهایی خود قرار دهند. اگر یک پیکربندی ساخت شامل هر دو نسخه، prefer ارزش پرچم در ماژول ارائه میشود دیکته تعریف که نسخه دارای اولویت است. توجه داشته باشید که برخی از ماژول های پیش ساخته نام هایی دارند که با prebuilt شروع نمی شوند ، مانند android_app_import .

ماژول های فضای نام

تا زمانی که Android به طور کامل از Make به Soong تبدیل شود ، در پیکربندی محصول Make باید مقدار PRODUCT_SOONG_NAMESPACES مشخص شود. مقدار آن باید لیستی از فضاهای نامی باشد که Soong صادر می کند تا توسط دستور m ساخته شود. پس از اتمام تبدیل Android به Soong ، جزئیات فعال کردن فضاهای نام ممکن است تغییر کند.

Soong این امکان را برای ماژول ها در فهرست های مختلف فراهم می کند تا یک نام را مشخص کنند ، به شرطی که هر ماژول در یک فضای نام جداگانه اعلام شود. یک فضای نامی را می توان به این صورت اعلام کرد:

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

توجه داشته باشید که فضای نام دارای ویژگی نام نیست. مسیر آن به طور خودکار به عنوان نام آن تعیین می شود.

هر ماژول Soong بر اساس موقعیت خود در درخت یک فضای نام اختصاص داده می شود. در نظر گرفته می شود که هر یک از ماژول های Soong در فضای نامی باشد که توسط soong_namespace موجود در یک فایل Android.bp در فهرست فعلی یا نزدیکترین فهرست اجداد موجود است. اگر چنین ماژول soong_namespace پیدا soong_namespace ، ماژول در فضای نام ریشه ضمنی در نظر گرفته می شود.

مثالی در اینجا وجود دارد: Soong تلاش می کند تا وابستگی D اعلام شده توسط ماژول M را در فضای نام N وارد کند که فضاهای نام I1 ، I2 ، I3 را وارد می کند

  1. اگر D یک نام کاملاً واجد شرایط از فرم //namespace:module ، فقط فضای نام مشخص شده برای نام ماژول مشخص شده جستجو می شود.
  2. در غیر این صورت ، سونگ ابتدا به دنبال ماژولی به نام D اعلام شده در namespace N می گردد.
  3. اگر آن ماژول وجود نداشته باشد ، سونگ در فضاهای نام I1 ، I2 ، I3 به دنبال ماژولی به نام D می گردد.
  4. سرانجام ، سونگ به فضای نام ریشه نگاه می کند.