قبل إصدار Android 7.0، كان نظام Android يستخدم GNU Make حصريًا لوصف قواعد الإنشاء وتنفيذها. إنّ نظام إنشاء Make متاح ويُستخدم على نطاق واسع، ولكنّه أصبح بطيئًا وقابلًا للخطأ وغير قابل للتطوير وصعب الاختبار على نطاق Android. يقدّم نظام إنشاء Soong المرونة المطلوبة لإصدارات Android.
لهذا السبب، من المتوقّع أن يوقف مطوّرو المنصات استخدام Make ويعتمدوا Soong في أقرب وقت ممكن. أرسِل أسئلتك إلى مجموعة Google الخاصة بموضوع android-building لتلقّي الدعم.
ما هو Soong؟
تم طرح نظام التصميم Soong في Android 7.0 (Nougat) ليحلّ محلّ Make. ويستفيد من أداة استنساخ Kati GNU Make وNinja لنظام الإنشاء لزيادة سرعة إنشاء إصدارات Android.
اطّلِع على وصف نظام إنشاء Android Make في مشروع Android Open Source Project (AOSP) للحصول على تعليمات عامة وتغييرات نظام الإنشاء لمؤلفي Android.mk لمعرفة التعديلات اللازمة للتبديل من Make إلى Soong.
اطّلِع على الإدخالات ذات الصلة بالإصدار في مسرد المصطلحات للحصول على تعريفات العبارات الرئيسية وملفات Soong المرجعية للاطّلاع على التفاصيل الكاملة.
مقارنة بين Make وSoong
في ما يلي مقارنة بين إعدادات 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 بالكامل من Make إلى Soong، يجب أن تحدِّد إعدادات منتج Make قيمة 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…
- بعد ذلك، إذا كان D هو اسم مؤهَّل بالكامل من النوع
//namespace:module
، يتم فقط البحث في مساحة الاسم المحدّدة عن اسم الوحدة المحدّد. - بخلاف ذلك، يبحث Soong أولاً عن وحدة باسم D تمّ تعريفها في النطاق N.
- إذا لم تكن هذه الوحدة متوفّرة، يبحث Soong عن وحدة باسم D في مساحات الاسماء I1 وI2 وI3…
- أخيرًا، يبحث Soong في مساحة الاسم الجذر.