يتيح نظام الإنشاء إنشاء حِزم ثنائية لبنيتَي وحدة معالجة مركزية مستهدفتَين، 32 بت و64 بت، في الإصدار نفسه. يُعرف هذا الإصدار الذي يستهدف نظامين أساسيين باسم إصدار multilib.
بالنسبة إلى المكتبات الثابتة والمكتبات المشتركة المضمّنة، يضبط نظام الإنشاء قواعد لإنشاء ملفات ثنائية لكلتا البنيتين. يحدّد إعداد المنتج
(PRODUCT_PACKAGES)، بالإضافة إلى الرسم البياني للمهام التابعة، الثنائيات التي سيتم إنشاؤها وتثبيتها في صورة النظام.
بالنسبة إلى الملفات التنفيذية والتطبيقات، ينشئ نظام الإنشاء إصدار 64 بت فقط بشكل تلقائي، ولكن يمكنك تجاهل هذا الإعداد باستخدام متغيّر BoardConfig.mk عام أو متغيّر على مستوى الوحدة.
تحديد بنية وحدة معالجة مركزية ثانية وواجهة ABI
يتضمّن BoardConfig.mk المتغيّرات التالية لإعداد بنية وحدة المعالجة المركزية الثانية وواجهة التطبيق الثنائية (ABI):
TARGET_2ND_ARCHTARGET_2ND_ARCH_VARIANTTARGET_2ND_CPU_VARIANTTARGET_2ND_CPU_ABITARGET_2ND_CPU_ABI2
للاطّلاع على مثال لملف makefile يستخدم هذه المتغيرات، يُرجى الرجوع إلى
build/make/target/board/generic_arm64/BoardConfig.mk.
في إصدار multilib، تغطي أسماء الوحدات في PRODUCT_PACKAGES كلاً من الثنائيات 32 بت و64 بت، طالما أنّها محددة من خلال نظام الإصدار. بالنسبة إلى المكتبات المضمّنة حسب التبعية، لا يتم تثبيت مكتبة 32 بت أو 64 بت إلا إذا كانت مطلوبة من خلال مكتبة أو ملف تنفيذي آخر 32 بت أو 64 بت.
ومع ذلك، لا تغطي أسماء الوحدات النمطية في سطر الأوامر make سوى إصدار 64 بت. على سبيل المثال، بعد تنفيذ lunch aosp_arm64-eng،
لا ينشئ make libc سوى libc 64 بت. لإنشاء مكتبة libc ذات 32 بت، عليك تنفيذ make libc_32.
تحديد بنية الوحدة في ملف Android.mk
يمكنك استخدام المتغيّر LOCAL_MULTILIB لضبط إصدارك
ليعمل على أنظمة 32 بت و64 بت، وتجاوز المتغيّر العام TARGET_PREFER_32_BIT.
لتجاوز TARGET_PREFER_32_BIT، اضبط LOCAL_MULTILIB على إحدى القيم التالية:
- تنشئ
bothكلاً من الإصدار 32 بت والإصدار 64 بت. 32لا ينشئ سوى إصدارات 32 بت.- تتضمّن إصدارات
64نظام 64 بت فقط. - يتم إنشاء حِزم
firstللبنية الأولى فقط (32 بت في الأجهزة التي تعمل بإصدار 32 بت و64 بت في الأجهزة التي تعمل بإصدار 64 بت).
لا يتم ضبط LOCAL_MULTILIB تلقائيًا، ويحدّد نظام الإصدار بنية التطبيق التي سيتم إنشاؤها استنادًا إلى فئة الوحدة ومتغيرات LOCAL_* الأخرى، مثل LOCAL_MODULE_TARGET_ARCH وLOCAL_32_BIT_ONLY.
إذا أردت إنشاء وحدة بتصميمات معمارية معيّنة، استخدِم المتغيّرات التالية:
LOCAL_MODULE_TARGET_ARCH: اضبط هذا المتغيّر على قائمة بالبُنى، مثلarm x86 arm64. إذا كانت البنية التي يتم إنشاؤها مدرَجة في تلك القائمة، سيضمّن نظام الإصدار الوحدة الحالية.
LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH: هذا المتغيّر هو عكسLOCAL_MODULE_TARGET_ARCH. إذا كان تصميم البنيةnotمدرجًا في تلك القائمة، سيضمِّن نظام الإنشاء الوحدة الحالية.
هناك صيغ بسيطة لهذين المتغيّرين:
LOCAL_MODULE_TARGET_ARCH_WARNLOCAL_MODULE_UNSUPPORTED_TARGET_ARCH_WARN
يُصدر نظام الإنشاء تحذيرًا إذا تم تخطّي الوحدة الحالية بسبب البِنى المدرَجة.
لإعداد علامات الإنشاء لبنية معيّنة، استخدِم متغيرات LOCAL_* الخاصة بالبنية حيث * لاحقة خاصة بالبنية، على سبيل المثال:
LOCAL_SRC_FILES_arm, LOCAL_SRC_FILES_x86,LOCAL_CFLAGS_arm, LOCAL_CFLAGS_arm64,LOCAL_LDFLAGS_arm, LOCAL_LDFLAGS_arm64,
لا يتم تطبيق هذه المتغيرات إلا إذا كان يتم إنشاء رمز ثنائي لهذه البنية.
في بعض الأحيان، يكون من الأسهل إعداد العلامات استنادًا إلى ما إذا كان الملف الثنائي سيتم إنشاؤه لنظام 32 بت أو 64 بت. استخدِم المتغيّر LOCAL_* مع اللاحقة _32 أو _64، على سبيل المثال:
LOCAL_SRC_FILES_32, LOCAL_SRC_FILES_64,LOCAL_CFLAGS_32, LOCAL_CFLAGS_64,LOCAL_LDFLAGS_32, LOCAL_LDFLAGS_64,
ضبط مسار تثبيت المكتبة
بالنسبة إلى الإصدار غير المتوافق مع مكتبات متعددة، يمكنك استخدام LOCAL_MODULE_PATH لتثبيت مكتبة في موقع جغرافي غير الموقع الجغرافي التلقائي. على سبيل المثال:
LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw.
ومع ذلك، في إصدار multilib، استخدِم LOCAL_MODULE_RELATIVE_PATH بدلاً من ذلك:
LOCAL_MODULE_RELATIVE_PATH := hw
باستخدام هذا التنسيق، يتم تثبيت مكتبات 64 بت و32 بت في الموقع الصحيح.
إذا أنشأت ملفًا تنفيذيًا بنظامَي 32 بت و64 بت، استخدِم أحد المتغيرات التالية للتمييز بين مسار التثبيت:
-
LOCAL_MODULE_STEM_32, LOCAL_MODULE_STEM_64: تحدّد اسم الملف المثبَّت. -
LOCAL_MODULE_PATH_32, LOCAL_MODULE_PATH_64: تحدّد مسار التثبيت.
الحصول على الدليل الوسيط لملفات المصدر
في إصدار multilib، إذا أنشأت ملفات مصدرية إلى $(local-intermediates-dir) (أو $(intermediates-dir-for) مع متغيرات صريحة)، لن يعمل ذلك بشكل موثوق. ويرجع ذلك إلى أنّ المصادر التي تم إنشاؤها بشكل وسيط مطلوبة في كل من الإصدارين 32 بت و64 بت، ولكن $(local-intermediates-dir) يشير إلى أحد الدليلين الوسيطين فقط.
يوفر نظام الإنشاء دليلاً وسيطًا مخصّصًا ومتوافقًا مع مكتبات متعددة لإنشاء المصادر. لاسترداد مسار الدليل الوسيط، استخدِم الماكرو $(local-generated-sources-dir) أو $(generated-sources-dir-for). تتشابه استخدامات وحدات الماكرو هذه مع استخدامات $(local-intermediates-dir) و$(intermediates-dir-for).
إذا تم إنشاء ملف مصدر في هذا الدليل المخصّص وتم اختياره
من خلال LOCAL_GENERATED_SOURCES، سيتم إنشاؤه لكل من الإصدارين 32 بت و64 بت
في إصدار multilib.
تحديد بنية النظام لاستهدافات الثنائيات المُنشأة مسبقًا
في إصدار multilib، لا يمكنك استخدام TARGET_ARCH أو TARGET_ARCH مع TARGET_2ND_ARCH للإشارة إلى بنية النظام المستهدَفة للثنائيات المبرمَجة مسبقًا. بدلاً من ذلك، استخدِم المتغيّرات LOCAL_*
LOCAL_MODULE_TARGET_ARCH أو
LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH.
باستخدام هذه المتغيرات، يمكن لنظام الإنشاء اختيار الثنائي المترجم مسبقًا 32 بت المناسب حتى إذا كان يعمل على إصدار 64 بت متعدد المكتبات.
إذا أردت استخدام البنية المحدّدة لاحتساب مسار المصدر للرمز الثنائي المبرمَج مسبقًا، استدعِ الدالة $(get-prebuilt-src-arch).
ضمان إنشاء ملفات ODEX بنظامَي 32 بت و64 بت
بالنسبة إلى الأجهزة التي تعمل بنظام 64 بت، تنشئ Google تلقائيًا ملفات ODEX لكل من نظام 32 بت و64 بت لصورة التشغيل وأي مكتبات Java. بالنسبة إلى حِزم APK، تنشئ Google تلقائيًا ملفات ODEX لبنية 64 بت الأساسية فقط. إذا تم تشغيل تطبيق
في كل من العمليتين 32 بت و64 بت، استخدِم LOCAL_MULTILIB := both للتأكّد
من إنشاء ملفات ODEX لكل من العمليتين 32 بت و64 بت. إذا كان التطبيق يتضمّن أي مكتبات JNI بنظام 32 بت أو 64 بت، يطلب هذا الخيار أيضًا من نظام الإنشاء تضمينها.