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

يدعم نظام التصميم إنشاء برامج ثنائية لبنيتين مستهدفتين لوحدة المعالجة المركزية، 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 بت، تُطلب من نظام الإنشاء أيضًا تضمينها.