يدعم نظام التصميم إنشاء برامج ثنائية لبنيتين مستهدفتين لوحدة المعالجة المركزية، 32 بت و64 بت، في الإصدار نفسه. يُعرف هذا الإصدار الثنائي المستهدف باسم إنشاء إصدارات متعددة من ليب:
بالنسبة إلى المكتبات الثابتة المضمَّنة والمكتبات المشتركة، يتمّ إعداد نظام التصميم
لإنشاء برامج ثنائية لكلتا الهياكل. تحدِّد إعدادات المنتج
(PRODUCT_PACKAGES
) مع الرسم البياني للمهام التابعة
الثنائية التي يتم إنشاؤها وتثبيتها في صورة النظام.
بالنسبة إلى الملفات التنفيذية والتطبيقات، لا ينشئ نظام الإنشاء سوى الإصدار 64 بت تلقائيًا، ولكن يمكنك إلغاء هذا الإعداد باستخدام متغيّر BoardConfig.mk
شامل أو متغيّر على مستوى الوحدة.
تحديد بنية وحدة المعالجة المركزية الثانية وواجهة التطبيق الثنائية (ABI)
يتضمّن BoardConfig.mk
المتغيّرات التالية لضبط بنية وحدة المعالجة المركزية (CPU)
الثانية وواجهة التطبيق الثنائية (ABI):
TARGET_2ND_ARCH
TARGET_2ND_ARCH_VARIANT
TARGET_2ND_CPU_VARIANT
TARGET_2ND_CPU_ABI
TARGET_2ND_CPU_ABI2
بالنسبة إلى ملف makefile الذي يستخدم هذه المتغيرات، راجع
build/make/target/board/generic_arm64/BoardConfig.mk
في إصدار متعدد العناصر، تظهر أسماء الوحدات في غلاف 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_WARN
LOCAL_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
.
ومع ذلك، في عملية إنشاء مكتبة متعددة، استخدِم 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
- لتحديد مسار التثبيت
الحصول على دليل وسيط للملفات المصدر
في إصدار متعدد العناصر، إذا أنشأت ملفات مصدر
$(local-intermediates-dir)
(أو $(intermediates-dir-for)
مع متغيرات واضحة)، فإنه لا يعمل بشكل موثوق. وهي تعني
لأن المصادر التي يتم إنشاؤها الوسيطة مطلوبة من خلال إصداري 32 بت
إصدارات 64 بت، لكن $(local-intermediates-dir)
يشير إلى واحد فقط من
الدليلين المتوسطين.
يوفر نظام التصميم نظامًا مخصصًا ومتوافقًا مع ميزات متعددة
دليل وسيط لإنشاء المصادر. لاسترداد مسار directory
المتوسّط، استخدِم الماكرو
$(local-generated-sources-dir)
أو
$(generated-sources-dir-for)
. تتشابه استخدامات وحدات الماكرو هذه مع
"$(local-intermediates-dir)
" و$(intermediates-dir-for)
"
إذا تم إنشاء ملف مصدر في هذا الدليل المخصّص واختَرته LOCAL_GENERATED_SOURCES
، سيتم إنشاؤه لكل من الإصدار 32 بت والإصدار 64 بت
في إصدار مكتبة متعددة.
الإشارة إلى بنية النظام لأهداف الثنائيات المُنشأة مسبقًا
في الإصدار المتعدد التنسيقات، لا يمكنك استخدام 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 بت، تُطلب من نظام الإنشاء أيضًا تضمينها.