ساخت برای معماری های 32 بیتی و 64 بیتی

سیستم ساخت از ساخت باینری برای دو معماری CPU هدف 32 بیتی و 64 بیتی در یک ساخت پشتیبانی می کند. این ساخت دو هدفه به عنوان ساخت چندلیب شناخته می شود.

برای کتابخانه های استاتیک داخلی و کتابخانه های مشترک، سیستم ساخت قوانینی را برای ساختن باینری ها برای هر دو معماری تنظیم می کند. پیکربندی محصول ( PRODUCT_PACKAGES )، همراه با نمودار وابستگی، تعیین می کند که کدام باینری ها در تصویر سیستم ساخته و نصب شوند.

برای فایل های اجرایی و برنامه ها، سیستم ساخت تنها نسخه 64 بیتی را به طور پیش فرض ایجاد می کند، اما می توانید این تنظیم را با یک متغیر جهانی BoardConfig.mk یا یک متغیر با محدوده ماژول لغو کنید.

معماری دوم CPU و 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 مراجعه کنید.

در ساخت 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 بیت در یک ساخت چندلیبی ساخته شده است.

معماری سیستم اهداف باینری از پیش ساخته شده را نشان می دهد

در ساخت چندلیبی، نمی توانید از 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 بیتی را برای تصویر بوت و هر کتابخانه جاوا تولید می‌کند. برای فایل‌های APK، به‌طور پیش‌فرض Google ODEX را فقط برای معماری 64 بیتی اولیه تولید می‌کند. اگر برنامه ای در هر دو فرآیند 32 بیتی و 64 بیتی راه اندازی شده است، از LOCAL_MULTILIB := both استفاده کنید تا مطمئن شوید که فایل های ODEX 32 بیتی و 64 بیتی تولید می شوند. اگر برنامه دارای کتابخانه‌های JNI 32 بیتی یا 64 بیتی باشد، آن پرچم به سیستم ساخت می‌گوید که آنها را نیز شامل شود.

،

سیستم ساخت از ساخت باینری برای دو معماری CPU هدف 32 بیتی و 64 بیتی در یک ساخت پشتیبانی می کند. این ساخت دو هدفه به عنوان ساخت چندلیب شناخته می شود.

برای کتابخانه های استاتیک داخلی و کتابخانه های مشترک، سیستم ساخت قوانینی را برای ساختن باینری ها برای هر دو معماری تنظیم می کند. پیکربندی محصول ( PRODUCT_PACKAGES )، همراه با نمودار وابستگی، تعیین می کند که کدام باینری ها در تصویر سیستم ساخته و نصب شوند.

برای فایل های اجرایی و برنامه ها، سیستم ساخت تنها نسخه 64 بیتی را به طور پیش فرض ایجاد می کند، اما می توانید این تنظیم را با یک متغیر جهانی BoardConfig.mk یا یک متغیر با محدوده ماژول لغو کنید.

معماری دوم CPU و 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 مراجعه کنید.

در ساخت 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 بیت در یک ساخت چندلیبی ساخته شده است.

معماری سیستم اهداف باینری از پیش ساخته شده را نشان می دهد

در ساخت چندلیبی، نمی توانید از 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 بیتی را برای تصویر بوت و هر کتابخانه جاوا تولید می‌کند. برای فایل‌های APK، به‌طور پیش‌فرض Google ODEX را فقط برای معماری 64 بیتی اولیه تولید می‌کند. اگر برنامه ای در هر دو فرآیند 32 بیتی و 64 بیتی راه اندازی شده است، از LOCAL_MULTILIB := both استفاده کنید تا مطمئن شوید که فایل های ODEX 32 بیتی و 64 بیتی تولید می شوند. اگر برنامه دارای کتابخانه‌های JNI 32 بیتی یا 64 بیتی باشد، آن پرچم به سیستم ساخت می‌گوید که آنها را نیز شامل شود.