سیستم ساخت از ساخت فایلهای باینری برای دو معماری پردازنده هدف، ۳۲ بیتی و ۶۴ بیتی، در یک ساخت پشتیبانی میکند. این ساخت دو هدفه به عنوان ساخت چند کتابخانهای شناخته میشود.
برای کتابخانههای ایستا و کتابخانههای اشتراکی داخلی، سیستم ساخت، قوانینی را برای ساخت فایلهای باینری برای هر دو معماری تنظیم میکند. پیکربندی محصول ( PRODUCT_PACKAGES ) به همراه نمودار وابستگی، تعیین میکند که کدام فایلهای باینری ساخته و در تصویر سیستم نصب شوند.
برای فایلهای اجرایی و برنامهها، سیستم ساخت به طور پیشفرض فقط نسخه ۶۴ بیتی را میسازد، اما میتوانید این تنظیم را با یک متغیر سراسری BoardConfig.mk یا یک متغیر با دامنه ماژول، لغو کنید.
معماری CPU دوم و 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 مراجعه کنید.
در یک ساختار چندکتابخانهای، نام ماژولها در PRODUCT_PACKAGES هر دو نوع فایلهای باینری ۳۲ بیتی و ۶۴ بیتی را پوشش میدهد، البته تا زمانی که توسط سیستم ساخت تعریف شده باشند. برای کتابخانههایی که توسط وابستگیها گنجانده شدهاند، یک کتابخانه ۳۲ بیتی یا ۶۴ بیتی فقط در صورتی نصب میشود که توسط یک کتابخانه یا فایل اجرایی ۳۲ بیتی یا ۶۴ بیتی دیگر مورد نیاز باشد.
با این حال، نام ماژولها در خط فرمان make فقط نسخه ۶۴ بیتی را پوشش میدهد. برای مثال، پس از اجرای lunch aosp_arm64-eng ، make libc فقط libc 64 بیتی را میسازد. برای ساخت libc 32 بیتی، باید make libc_32 اجرا کنید.
تعریف معماری ماژول در Android.mk
شما میتوانید از متغیر LOCAL_MULTILIB برای پیکربندی نسخه ۳۲ بیتی و ۶۴ بیتی سیستم خود استفاده کنید و متغیر سراسری TARGET_PREFER_32_BIT نادیده بگیرید.
برای لغو TARGET_PREFER_32_BIT ، LOCAL_MULTILIB را روی یکی از موارد زیر تنظیم کنید:
-
bothنسخه ۳۲ بیتی و ۶۴ بیتی را میسازند. -
32نسخه فقط ۳۲ بیتی. - نسخه
64فقط ۶۴ بیتی است. -
firstنسخهها فقط برای معماری اول (۳۲ بیتی در دستگاههای ۳۲ بیتی و ۶۴ بیتی در دستگاههای ۶۴ بیتی) ساخته میشوند.
به طور پیشفرض، 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,
این متغیرها فقط در صورتی اعمال میشوند که یک فایل باینری برای آن معماری ساخته شود.
گاهی اوقات تنظیم پرچمها بر اساس اینکه فایل باینری برای ۳۲ بیتی یا ۶۴ بیتی ساخته میشود، آسانتر است. برای مثال، از متغیر 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
با این فرمت، هر دو کتابخانه ۶۴ بیتی و ۳۲ بیتی در مکان صحیح نصب میشوند.
اگر یک فایل اجرایی را هم به صورت ۳۲ بیتی و هم ۶۴ بیتی ایجاد میکنید، از یکی از متغیرهای زیر برای تشخیص مسیر نصب استفاده کنید:
-
LOCAL_MODULE_STEM_32, LOCAL_MODULE_STEM_64- نام فایل نصب شده را مشخص میکند. -
LOCAL_MODULE_PATH_32, LOCAL_MODULE_PATH_64- مسیر نصب را مشخص میکند.
دریافت دایرکتوری میانی برای فایلهای منبع
در یک ساختار چندکتابخانهای، اگر فایلهای منبع را در $(local-intermediates-dir) (یا $(intermediates-dir-for) با متغیرهای صریح) تولید کنید، به طور قابل اعتمادی کار نمیکند. دلیلش این است که منابع تولید شده توسط واسط، هم برای ساختار ۳۲ بیتی و هم برای ساختار ۶۴ بیتی مورد نیاز هستند، اما $(local-intermediates-dir) فقط به یکی از دو دایرکتوری واسط اشاره میکند.
سیستم ساخت، یک دایرکتوری میانی اختصاصی، سازگار با چند کتابخانه و مناسب برای تولید منابع فراهم میکند. برای بازیابی مسیر دایرکتوری میانی، از ماکروی $(local-generated-sources-dir) یا $(generated-sources-dir-for) استفاده کنید. کاربردهای این ماکروها مشابه $(local-intermediates-dir) و $(intermediates-dir-for) است.
اگر یک فایل منبع در این دایرکتوری اختصاصی ایجاد شود و توسط LOCAL_GENERATED_SOURCES دریافت شود، در یک ساختار چندکتابخانهای، هم برای ۳۲ بیتی و هم برای ۶۴ بیتی ساخته شده است.
معماری سیستم اهداف دودویی از پیش ساخته شده را نشان دهید
در یک ساختار چندکتابخانهای، نمیتوانید TARGET_ARCH یا TARGET_ARCH همراه با TARGET_2ND_ARCH برای نشان دادن معماری سیستم هدفهای دودویی از پیش ساخته شده استفاده کنید. در عوض، از متغیرهای LOCAL_ * LOCAL_MODULE_TARGET_ARCH یا LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH استفاده کنید.
با این متغیرها، سیستم ساخت میتواند حتی اگر روی یک ساخت چندکتابخانهای ۶۴ بیتی کار کند، فایل باینری از پیش ساخته شده ۳۲ بیتی مربوطه را انتخاب کند.
اگر میخواهید از معماری انتخابشده برای محاسبه مسیر منبع برای فایل باینری از پیش ساختهشده استفاده کنید، تابع $(get-prebuilt-src-arch) را فراخوانی کنید.
اطمینان از تولید فایل ODEX 32 بیتی و 64 بیتی
برای دستگاههای ۶۴ بیتی، گوگل به طور پیشفرض فایلهای ODEX 32 بیتی و 64 بیتی را برای تصویر بوت و هر کتابخانه جاوا تولید میکند. برای فایلهای APK، گوگل به طور پیشفرض ODEX را فقط برای معماری اصلی ۶۴ بیتی تولید میکند. اگر یک برنامه در هر دو فرآیند ۳۲ بیتی و ۶۴ بیتی اجرا شود، از LOCAL_MULTILIB := both استفاده کنید تا مطمئن شوید که هر دو فایل ODEX 32 بیتی و 64 بیتی تولید میشوند. اگر برنامه دارای کتابخانههای JNI 32 بیتی یا 64 بیتی باشد، آن پرچم به سیستم ساخت نیز میگوید که آنها را شامل کند.