نظام بناء سونغ

قبل إصدار Android 7.0، استخدم Android GNU Make حصريًا لوصف وتنفيذ قواعد البناء الخاصة به. يتم دعم واستخدام نظام Make build على نطاق واسع، ولكن على نطاق Android أصبح بطيئًا وعرضة للخطأ وغير قابل للتوسع ويصعب اختباره. يوفر نظام بناء Soong المرونة المطلوبة لإصدارات Android.

لهذا السبب، من المتوقع أن يتحول مطورو النظام الأساسي من Make واعتماد Soong في أقرب وقت ممكن. أرسل الأسئلة إلى مجموعة Google الخاصة بنظام Android لتلقي الدعم.

ما هو سونغ؟

تم تقديم نظام بناء Soong في Android 7.0 (Nougat) ليحل محل Make. إنه يستفيد من أداة الاستنساخ Kati GNU Make ومكون نظام بناء Ninja لتسريع عمليات إنشاء Android.

راجع وصف Android Make Build System في مشروع Android مفتوح المصدر (AOSP) للحصول على إرشادات عامة وبناء تغييرات النظام لكتاب Android.mk للتعرف على التعديلات اللازمة للتكيف من Make إلى Soong.

راجع الإدخالات ذات الصلة بالإنشاء في المسرد للحصول على تعريفات للمصطلحات الأساسية وملفات Soong المرجعية للحصول على التفاصيل الكاملة.

جعل و سونغ المقارنة

فيما يلي مقارنة بين إجراء التكوين و 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 .

وحدات خاصة

تتمتع بعض مجموعات الوحدات الخاصة بخصائص فريدة.

الوحدات الافتراضية

يمكن استخدام وحدة الإعدادات الافتراضية لتكرار نفس الخصائص في وحدات متعددة. على سبيل المثال:

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 .

وحدات مساحة الاسم

حتى يتم تحويل Android بالكامل من Make إلى Soong، يجب أن يحدد تكوين المنتج قيمة PRODUCT_SOONG_NAMESPACES . يجب أن تكون قيمتها عبارة عن قائمة مفصولة بمسافات من مساحات الأسماء التي يصدرها Soong إلى Make ليتم بناؤها بواسطة الأمر m . بعد اكتمال تحويل Android إلى Soong، قد تتغير تفاصيل تمكين مساحات الأسماء.

يوفر Soong القدرة للوحدات النمطية الموجودة في أدلة مختلفة لتحديد نفس الاسم، طالما تم الإعلان عن كل وحدة ضمن مساحة اسم منفصلة. يمكن الإعلان عن مساحة الاسم على النحو التالي:

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

لاحظ أن مساحة الاسم لا تحتوي على خاصية اسم؛ يتم تعيين مساره تلقائيًا كاسم له.

يتم تعيين مساحة اسم لكل وحدة Soong بناءً على موقعها في الشجرة. تعتبر كل وحدة Soong موجودة في مساحة الاسم المحددة بواسطة soong_namespace الموجودة في ملف Android.bp في الدليل الحالي أو أقرب دليل سلف. إذا لم يتم العثور على وحدة soong_namespace ، فسيتم اعتبار الوحدة موجودة في مساحة الاسم الجذر الضمنية.

فيما يلي مثال: يحاول Soong حل التبعية D المعلنة بواسطة الوحدة M في مساحة الاسم N التي تستورد مساحات الأسماء I1 وI2 وI3...

  1. ثم إذا كان D اسمًا مؤهلاً بالكامل للنموذج //namespace:module ، فسيتم البحث في مساحة الاسم المحددة فقط عن اسم الوحدة النمطية المحددة.
  2. بخلاف ذلك، يبحث Soong أولاً عن الوحدة النمطية المسماة D المعلنة في مساحة الاسم N.
  3. إذا لم تكن هذه الوحدة موجودة، يبحث Soong عن وحدة تسمى D في مساحات الأسماء I1 وI2 وI3...
  4. وأخيرًا، يبحث Soong في مساحة الاسم الجذر.