نظام إنشاء Sumg

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

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

ما هو سونغ؟

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

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

اطّلِع على الإدخالات المتعلّقة بالإنشاء في مسرد مصطلحات لتعريفات المصطلحات الرئيسية يمكنك الاطّلاع على ملفات 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,
           },
     },
}

للاطّلاع على أمثلة ضبط تطبيق Sayg الخاصة بالاختبار، يُرجى الاطّلاع على تصميم بسيط:

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

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

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 تم تعريفها في مساحة الاسم ن.
  3. وإذا لم تكن تلك الوحدة موجودة، فسيبحث سونغ عن وحدة تسمى D في مساحات الاسم I1، I2، I3...
  4. وأخيرًا، يبحث سونغ في مساحة الاسم الجذر.