التحويل من Make إلى Sayg

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

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

ما هو Soong؟

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

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

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

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

في ما يلي مقارنة بين إعدادات Make و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)

مثال على Soong

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