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

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

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

ما هو Soong؟

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

اطّلِع على وصف نظام إنشاء Android Make في مشروع Android Open Source Project (AOSP) للحصول على تعليمات عامة وتغييرات نظام الإنشاء لمؤلفي Android.mk لمعرفة التعديلات اللازمة للتبديل من Make إلى Soong.

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

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

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

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

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

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

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

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

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