فهم إصدارات 64 بت

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

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

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

تكوين المنتج

يتضمن BoardConfig.mk المتغيرات التالية لتكوين بنية وحدة المعالجة المركزية الثانية و ABI:

  • TARGET_2ND_ARCH
  • TARGET_2ND_ARCH_VARIANT
  • TARGET_2ND_CPU_VARIANT
  • TARGET_2ND_CPU_ABI
  • TARGET_2ND_CPU_ABI2

يمكنك رؤية مثال في build/target/board/generic_arm64/BoardConfig.mk .

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

قم بتعيين LOCAL_MULTILIB على أحد الخيارات التالية:

  • يبني "both" كلاً من 32 بت و 64 بت.
  • "32" يبني 32 بت فقط.
  • "64" يبني 64 بت فقط.
  • يبني "first" للبنية الأولى فقط (32 بت في أجهزة 32 بت و 64 بت في أجهزة 64 بت).
  • "" هو الافتراضي. يقرر نظام البناء البنية التي سيتم بناؤها بناءً على فئة الوحدة ومتغيرات 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 . إذا لم تكن البنية التي يتم بناؤها موجودة في تلك القائمة ، فسيتم تضمين الوحدة النمطية الحالية بواسطة نظام البناء.

هناك متغيرات ثانوية لهذين المتغيرين:

  • LOCAL_MODULE_TARGET_ARCH_WARN
  • LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH_WARN

يحذر نظام البناء في حالة تخطي الوحدة النمطية الحالية بسبب البنى المدرجة.

لإعداد علامات الإنشاء لهندسة معينة ، استخدم متغيرات LOCAL_ الخاصة بالبنية. متغير LOCAL_ الخاص بالبنية هو متغير 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
    يحدد مسار التثبيت.

مصادر مولدة

في بنية 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_2ND_ARCH ) لإخبار نظام الإنشاء ببنية الأهداف الثنائية المنشأة مسبقًا. بدلاً من ذلك ، استخدم المتغيرات LOCAL_ LOCAL_MODULE_TARGET_ARCH أو LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH .

باستخدام هذه المتغيرات ، يمكن لنظام الإنشاء اختيار ثنائي 32 بت تم إنشاؤه مسبقًا حتى لو كان يعمل على بنية متعددة الملفات ذات 64 بت.

إذا كنت تريد استخدام البنية المختارة لحساب مسار المصدر للثنائي المُنشأ مسبقًا ، فاتصل $(get-prebuilt-src-arch) .

إنشاء ملف ODEX

بالنسبة لأجهزة 64 بت ، نقوم بشكل افتراضي بإنشاء ملفات ODEX 32 بت و 64 بت لصورة التمهيد وأي مكتبات Java. بالنسبة لملفات APK ، نقوم افتراضيًا بإنشاء ODEX فقط لمعمارية 64 بت الأساسية. إذا تم تشغيل أحد التطبيقات في كل من عمليات 32 بت و 64 بت ، فاستخدم LOCAL_MULTILIB := both للتأكد من إنشاء ملفات ODEX 32 بت و 64 بت. إذا كان التطبيق يحتوي على أي مكتبات JNI 32 بت أو 64 بت ، فإن هذه العلامة تخبر نظام الإنشاء أيضًا بتضمينها.