تصميم للبنيات 32 بت و64 بت، التصميم للبنيات 32 بت و64 بت

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

بالنسبة للمكتبات الثابتة المضمنة والمكتبات المشتركة، يقوم نظام البناء بإعداد قواعد لإنشاء ثنائيات لكلا البنيتين. يحدد تكوين المنتج ( 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.

الإشارة إلى بنية النظام للأهداف الثنائية المعدة مسبقًا

في البنية متعددة الأجزاء، لا يمكنك استخدام TARGET_ARCH أو TARGET_ARCH مع TARGET_2ND_ARCH للإشارة إلى بنية النظام للأهداف الثنائية المعدة مسبقًا. بدلاً من ذلك، استخدم المتغيرات LOCAL_ * LOCAL_MODULE_TARGET_ARCH أو LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH .

باستخدام هذه المتغيرات، يمكن لنظام البناء اختيار الملف الثنائي المطابق 32 بت الذي تم إنشاؤه مسبقًا حتى لو كان يعمل على بنية multilib 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 بت، فإن هذه العلامة تخبر نظام الإنشاء أيضًا بتضمينها.