يدعم نظام البناء إنشاء ثنائيات لبنيتين مستهدفتين لوحدة المعالجة المركزية (64 بت و 32 بت) في نفس البنية. يُعرف هذا باسم بناء multilib .
بالنسبة للمكتبات الثابتة والمكتبات المشتركة الأصلية ، يقوم نظام الإنشاء بإعداد قواعد لإنشاء ثنائيات لكلا البُنى. تحدد تهيئة المنتج ( PRODUCT_PACKAGES
) ، جنبًا إلى جنب مع الرسم البياني للتبعية ، الثنائيات التي تم إنشاؤها وتثبيتها على صورة النظام.
بالنسبة للملفات التنفيذية والتطبيقات ، يقوم نظام الإنشاء ببناء الإصدار 64 بت فقط افتراضيًا ، ولكن يمكنك تجاوز هذا الإعداد باستخدام متغير BoardConfig.mk
عالمي أو متغير على نطاق الوحدة النمطية.
تكوين المنتج
يتضمن BoardConfig.mk
المتغيرات التالية لتكوين بنية وحدة المعالجة المركزية الثانية و ABI:
-
TARGET_2ND_ARCH
-
TARGET_2ND_ARCH_VARIANT
-
TARGET_2ND_CPU_VARIANT
-
TARGET_2ND_CPU_ABI
-
TARGET_2ND_CPU_ABI2
يمكنك رؤية مثال في build/target/board/generic_arm64/BoardConfig.mk
.
في بنية متعددة الملفات ، تغطي أسماء الوحدات في PRODUCT_PACKAGES
كلاً من الثنائيات 32 بت و 64 بت ، طالما تم تحديدهما بواسطة نظام الإنشاء. بالنسبة للمكتبات التي تم سحبها عن طريق التبعية ، يتم تثبيت مكتبة 32 بت فقط إذا كانت مطلوبة من قبل مكتبة 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
.
قم بتعيين LOCAL_MULTILIB
على أحد الخيارات التالية:
- يبني
"both"
كلاً من 32 بت و 64 بت. -
"32"
يبني 32 بت فقط. -
"64"
يبني 64 بت فقط. - يبني
"first"
للبنية الأولى فقط (32 بت في أجهزة 32 بت و 64 بت في أجهزة 64 بت). -
""
هو الافتراضي. يقرر نظام البناء البنية التي سيتم بناؤها بناءً على فئة الوحدة ومتغيرات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
. إذا لم تكن البنية التي يتم بناؤها موجودة في تلك القائمة ، فسيتم تضمين الوحدة النمطية الحالية بواسطة نظام البناء.
هناك متغيرات ثانوية لهذين المتغيرين:
-
LOCAL_MODULE_TARGET_ARCH_WARN
-
LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH_WARN
يحذر نظام البناء في حالة تخطي الوحدة النمطية الحالية بسبب البنى المدرجة.
لإعداد علامات الإنشاء لهندسة معينة ، استخدم متغيرات LOCAL_
الخاصة بالبنية. متغير LOCAL_
الخاص بالبنية هو متغير 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
.
في بنية متعددة الملفات ، استخدم 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 ، لا يمكنك استخدام TARGET_ARCH
(أو مع TARGET_2ND_ARCH
) لإخبار نظام الإنشاء ببنية الأهداف الثنائية المنشأة مسبقًا. بدلاً من ذلك ، استخدم المتغيرات LOCAL_
LOCAL_MODULE_TARGET_ARCH
أو LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH
.
باستخدام هذه المتغيرات ، يمكن لنظام الإنشاء اختيار ثنائي 32 بت تم إنشاؤه مسبقًا حتى لو كان يعمل على بنية متعددة الملفات ذات 64 بت.
إذا كنت تريد استخدام البنية المختارة لحساب مسار المصدر للثنائي المُنشأ مسبقًا ، فاتصل $(get-prebuilt-src-arch)
.
إنشاء ملف ODEX
بالنسبة لأجهزة 64 بت ، نقوم بشكل افتراضي بإنشاء ملفات ODEX 32 بت و 64 بت لصورة التمهيد وأي مكتبات Java. بالنسبة لملفات APK ، نقوم افتراضيًا بإنشاء ODEX فقط لمعمارية 64 بت الأساسية. إذا تم تشغيل أحد التطبيقات في كل من عمليات 32 بت و 64 بت ، فاستخدم LOCAL_MULTILIB := both
للتأكد من إنشاء ملفات ODEX 32 بت و 64 بت. إذا كان التطبيق يحتوي على أي مكتبات JNI 32 بت أو 64 بت ، فإن هذه العلامة تخبر نظام الإنشاء أيضًا بتضمينها.