Sistem build mendukung pembuatan biner untuk dua arsitektur CPU target, 32 bit dan 64 bit, dalam build yang sama. Build dua target ini dikenal sebagai build multilib.
Untuk library statis bawaan dan library bersama, sistem build menyiapkan
aturan untuk mem-build biner untuk kedua arsitektur. Konfigurasi produk
(PRODUCT_PACKAGES
), bersama dengan grafik dependensi, menentukan
biner dibangun dan
diinstal ke {i>image<i} sistem.
Untuk file yang dapat dieksekusi dan aplikasi, sistem build hanya mem-build versi 64-bit secara
default, tetapi Anda dapat mengganti setelan ini dengan variabel
BoardConfig.mk
global atau variabel cakupan modul.
Mengidentifikasi arsitektur CPU dan ABI kedua
BoardConfig.mk
menyertakan variabel berikut untuk mengonfigurasi arsitektur CPU
dan antarmuka biner aplikasi (ABI) kedua:
TARGET_2ND_ARCH
TARGET_2ND_ARCH_VARIANT
TARGET_2ND_CPU_VARIANT
TARGET_2ND_CPU_ABI
TARGET_2ND_CPU_ABI2
Untuk contoh makefile yang menggunakan variabel ini, lihat
build/make/target/board/generic_arm64/BoardConfig.mk
.
Dalam build multilib, nama modul di PRODUCT_PACKAGES
mencakup
biner 32-bit dan 64-bit, selama ditentukan oleh sistem
build. Untuk library yang disertakan oleh dependensi, library 32-bit atau 64-bit
diinstal hanya jika diperlukan oleh
perpustakaan 32-bit atau 64-bit lain atau
file yang dapat dieksekusi.
Namun, nama modul pada command line make
hanya mencakup
Versi 64-bit. Misalnya, setelah menjalankan lunch aosp_arm64-eng
,
make libc
hanya membangun libc 64-bit. Untuk
mem-build libc 32-bit, Anda harus menjalankan make libc_32
.
Menentukan arsitektur modul di Android.mk
Anda dapat menggunakan variabel LOCAL_MULTILIB
untuk mengonfigurasi build
untuk 32 bit dan 64 bit serta mengganti variabel TARGET_PREFER_32_BIT
global.
Untuk mengganti TARGET_PREFER_32_BIT
, setel LOCAL_MULTILIB
ke salah satu
berikut ini:
both
mem-build 32 bit dan 64 bit.32
hanya mem-build 32 bit.64
hanya membangun 64 bit.first
hanya di-build untuk arsitektur pertama (32 bit di perangkat 32-bit dan 64 bit di perangkat 64-bit).
Secara default, LOCAL_MULTILIB
tidak ditetapkan dan sistem build memutuskan
arsitektur mana yang akan dibuat berdasarkan class modul dan variabel
LOCAL_*
lainnya, seperti LOCAL_MODULE_TARGET_ARCH
dan LOCAL_32_BIT_ONLY
.
Jika ingin membangun modul untuk arsitektur tertentu, gunakan metode berikut variabel:
LOCAL_MODULE_TARGET_ARCH
- Tetapkan variabel ini ke daftar arsitektur, sepertiarm x86 arm64
. Jika arsitektur yang sedang dibuat ada dalam daftar tersebut, modul saat ini akan disertakan oleh sistem build.LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH
- Variabel ini kebalikan dariLOCAL_MODULE_TARGET_ARCH
. Jika arsitektur yang dibangun adalahnot
dalam daftar itu, modul saat ini disertakan oleh sistem build.
Ada varian kecil dari kedua variabel ini:
LOCAL_MODULE_TARGET_ARCH_WARN
LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH_WARN
Sistem build akan memperingatkan jika modul saat ini dilewati karena arsitektur yang tercantum.
Untuk menyiapkan flag build untuk arsitektur tertentu, gunakan
variabel LOCAL_*
khusus arsitektur dengan
*
adalah akhiran khusus arsitektur, misalnya:
LOCAL_SRC_FILES_arm, LOCAL_SRC_FILES_x86,
LOCAL_CFLAGS_arm, LOCAL_CFLAGS_arm64,
LOCAL_LDFLAGS_arm, LOCAL_LDFLAGS_arm64,
Variabel-variabel ini diterapkan hanya jika biner sedang dibangun untuk tentang arsitektur ini.
Terkadang lebih mudah untuk menyiapkan flag berdasarkan apakah biner
di-build untuk 32-bit atau 64-bit. Menggunakan LOCAL_*
variabel dengan akhiran _32
atau _64
, misalnya:
LOCAL_SRC_FILES_32, LOCAL_SRC_FILES_64,
LOCAL_CFLAGS_32, LOCAL_CFLAGS_64,
LOCAL_LDFLAGS_32, LOCAL_LDFLAGS_64,
Tetapkan jalur penginstalan library
Untuk build non-multilib, Anda dapat menggunakan LOCAL_MODULE_PATH
untuk menginstal library
ke lokasi selain lokasi default. Misalnya, LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
.
Namun, dalam build multilib, gunakan LOCAL_MODULE_RELATIVE_PATH
sebagai gantinya:
LOCAL_MODULE_RELATIVE_PATH := hw
Dengan format ini, library 64-bit dan 32-bit diinstal di lokasi yang benar.
Jika Anda mem-build file yang dapat dieksekusi sebagai 32 bit dan 64 bit, gunakan salah satu variabel berikut untuk membedakan jalur penginstalan:
LOCAL_MODULE_STEM_32, LOCAL_MODULE_STEM_64
- Menentukan nama file yang diinstal.LOCAL_MODULE_PATH_32, LOCAL_MODULE_PATH_64
- Menentukan jalur penginstalan.
Mendapatkan direktori perantara untuk file sumber
Dalam build multilib, jika Anda menghasilkan file sumber untuk
$(local-intermediates-dir)
(atau $(intermediates-dir-for)
dengan variabel eksplisit), model ini tidak berfungsi dengan baik. Hal ini
karena sumber yang dihasilkan perantara diperlukan oleh build 32-bit dan
64-bit, tetapi $(local-intermediates-dir)
hanya mengarah ke salah satu
dari dua direktori perantara.
Sistem build menyediakan layanan lingkungan khusus,
perantara untuk menghasilkan sumber. Untuk mengambil jalur direktori
perantara, gunakan
makro $(local-generated-sources-dir)
atau
$(generated-sources-dir-for)
. Penggunaan makro ini mirip dengan
$(local-intermediates-dir)
dan $(intermediates-dir-for)
.
Jika file sumber dibuat ke
direktori khusus ini dan diambil
oleh LOCAL_GENERATED_SOURCES
, dibuat untuk 32 bit dan 64 bit
dalam build multilib.
Menunjukkan arsitektur sistem target biner bawaan
Dalam build multilib, Anda tidak dapat menggunakan TARGET_ARCH
, atau TARGET_ARCH
yang digabungkan dengan
TARGET_2ND_ARCH
, untuk menunjukkan arsitektur sistem target biner
bawaan. Sebagai gantinya, gunakan variabel LOCAL_*
LOCAL_MODULE_TARGET_ARCH
atau
LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH
.
Dengan variabel-variabel ini, sistem build dapat memilih antarmuka 32-bit biner bawaan meskipun berfungsi pada build multilib 64-bit.
Jika Anda ingin menggunakan arsitektur yang dipilih untuk menghitung jalur sumber untuk
biner bawaan, panggil $(get-prebuilt-src-arch)
.
Memastikan pembuatan file ODEX 32-bit dan 64-bit
Untuk perangkat 64-bit, secara default Google membuat file ODEX
32-bit dan 64-bit untuk image booting dan library Java apa pun. Untuk APK, secara default Google
menghasilkan ODEX hanya
untuk arsitektur 64-bit utama. Jika aplikasi diluncurkan
dalam proses 32-bit dan 64-bit, gunakan LOCAL_MULTILIB := both
untuk memastikan
file ODEX 32-bit dan 64-bit akan dihasilkan. Jika aplikasi memiliki library JNI 32-bit
atau 64-bit, flag tersebut juga akan memberi tahu sistem build untuk menyertakannya.