إنشاء إصدارات لمعماريات 32 بت و64 بت

يتيح نظام التصميم إنشاء حِزم ثنائية لبنيتَي وحدة معالجة مركزية مستهدفتَين، وهما 32 بت و64 بت، في الإصدار نفسه. يُعرف هذا الإصدار الذي يستهدف نظامَين باسم الإصدار المتوافق مع عدة مكتبات.

بالنسبة إلى المكتبات الثابتة والمكتبات المشتركة المضمّنة، يضبط نظام الإنشاء قواعد لإنشاء ملفات ثنائية لكلتا البنيتين. يحدّد إعداد المنتج (PRODUCT_PACKAGES)، بالإضافة إلى الرسم البياني للاعتمادية، الثنائيات التي سيتم إنشاؤها وتثبيتها في صورة النظام.

بالنسبة إلى الملفات التنفيذية والتطبيقات، ينشئ نظام الإنشاء إصدار 64 بت فقط تلقائيًا، ولكن يمكنك تجاهل هذا الإعداد باستخدام متغيّر BoardConfig.mk عام أو متغيّر على مستوى الوحدة.

تحديد بنية وحدة معالجة مركزية ثانية وواجهة ABI

يتضمّن BoardConfig.mk المتغيّرات التالية لإعداد بنية وحدة المعالجة المركزية الثانية وواجهة التطبيق الثنائية (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.

في إصدارات 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_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.

ومع ذلك، في إصدار 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 بت، تطلب هذه العلامة أيضًا من نظام التصميم تضمينها.