نظام إنشاء Sumg

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

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

ما هو سونغ؟

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

يمكنك الاطّلاع على وصف Android Make Build System في "المشروع المفتوح المصدر لنظام Android" (AOSP) للحصول على تعليمات عامة و إنشاء تغييرات في النظام لمكتب Android.mk للتعرّف على التعديلات المطلوبة للتكيّف من تطبيق Make to Sumg.

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

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

في ما يلي مقارنة بين إعداد "إنشاء" و"سينغ" الذي ينجز النتيجة نفسها في ملف إعداد 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,
           },
     },
}

للحصول على أمثلة ضبط Manyg الخاصة بالاختبار، يُرجى الاطّلاع على إعدادات بسيطة التصميم.

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

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

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

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

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

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

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