نظام إنشاء Sumg

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

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

ما هو Soong؟

تم طرح نظام التصميم Soong في Android 7.0 (Nougat) ليحلّ محلّ Make. ويستفيد من أداة استنساخ Kati GNU Make وNinja لنظام الإنشاء لزيادة سرعة إنشاء إصدارات Android.

يمكنك الاطّلاع على نظام تصميم Android المشروع المفتوح المصدر لنظام Android (AOSP) للجمهور العام التعليمات أو إنشاء تغييرات في النظام لمؤلّفي Android.mk للتعرّف على التعديلات اللازمة للتكيّف مع أداة Make to Sayg.

اطّلِع على الإدخالات المتعلّقة بالإنشاء في مسرد لتعريفات المصطلحات الرئيسية يُرجى الاطّلاع على ملفات Soong المرجعية للاطّلاع على التفاصيل الكاملة.

مقارنة بين Make وSoong

في ما يلي مقارنة بين إجراء الإعداد (إنشاء الإعداد) وإنجاز الإجراء نفسه في تطبيق Sayg ملف إعداد قريبًا (مخطط أو .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 إلى Sayg، سيتم ضبط إعدادات "إنشاء المنتج" على يجب تحديد قيمة PRODUCT_SOONG_NAMESPACES. يجب أن تكون قيمة المَعلمة قائمة مفصولة بمسافات لمساحات الاسم التي تصدّرها أداة Soong إلى أداة Make لإنشاءها باستخدام الأمر m. بعد اكتمال عملية تحويل Android إلى Soong، قد تتغيّر تفاصيل تفعيل مساحات الاسماء.

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

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

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

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

في ما يلي مثال: يحاول Soong حلّ التبعية D التي تمّ الإعلان عنها من خلال الوحدة M في مساحة الاسم N التي تستورد مساحات الأسماء I1 وI2 وI3…

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