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

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

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

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

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

يتضمّن 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 بت، تُطلب من نظام الإنشاء أيضًا تضمينها.