Sistem build mendukung binari build untuk dua arsitektur CPU target (64 bit dan 32 bit) dalam build yang sama. Ini dikenal sebagai multilib build .
Untuk pustaka statis asli dan pustaka bersama, sistem pembangunan menyiapkan aturan untuk membangun biner untuk kedua arsitektur. Konfigurasi produk ( PRODUCT_PACKAGES
), bersama dengan grafik ketergantungan, menentukan biner mana yang dibuat dan dipasang ke citra sistem.
Untuk executable dan aplikasi, sistem build hanya membangun versi 64-bit secara default, tetapi Anda dapat mengganti pengaturan ini dengan variabel BoardConfig.mk
global atau variabel cakupan modul.
Konfigurasi produk
BoardConfig.mk
menyertakan variabel berikut untuk mengonfigurasi arsitektur CPU kedua dan ABI:
-
TARGET_2ND_ARCH
-
TARGET_2ND_ARCH_VARIANT
-
TARGET_2ND_CPU_VARIANT
-
TARGET_2ND_CPU_ABI
-
TARGET_2ND_CPU_ABI2
Anda dapat melihat contoh di build/target/board/generic_arm64/BoardConfig.mk
.
Dalam build multilib, nama modul di PRODUCT_PACKAGES
mencakup biner 32-bit dan 64-bit, selama keduanya ditentukan oleh sistem build. Untuk perpustakaan yang ditarik oleh dependensi, perpustakaan 32-bit diinstal hanya jika diperlukan oleh perpustakaan 32-bit lain atau dapat dieksekusi. Hal yang sama berlaku untuk perpustakaan 64-bit.
Namun, nama modul pada baris perintah make
hanya mencakup versi 64-bit. Misalnya, setelah menjalankan lunch aosp_arm64-eng
, make libc
hanya membangun libc 64-bit. Untuk membangun libc 32-bit, Anda perlu menjalankan make libc_32
.
Definisi modul di Android.mk
Anda dapat menggunakan variabel LOCAL_MULTILIB
untuk mengonfigurasi build Anda untuk 32 bit/64 bit dan mengganti variabel TARGET_PREFER_32_BIT
global.
Setel LOCAL_MULTILIB
ke salah satu dari berikut ini:
-
"both"
membangun 32 bit dan 64 bit. -
"32"
hanya membangun 32 bit. -
"64"
hanya membangun 64 bit. -
"first"
hanya dibuat untuk arsitektur pertama (32 bit dalam perangkat 32-bit dan 64 bit dalam perangkat 64-bit). -
""
adalah default. Sistem pembangunan memutuskan arsitektur mana yang akan dibangun berdasarkan kelas modul dan variabelLOCAL_
lainnya, sepertiLOCAL_MODULE_TARGET_ARCH
danLOCAL_32_BIT_ONLY
.
Jika Anda ingin membuat modul untuk arsitektur tertentu, gunakan variabel berikut:
-
LOCAL_MODULE_TARGET_ARCH
Setel variabel ini ke daftar arsitektur, sepertiarm x86 arm64
. Jika arsitektur yang sedang dibangun ada dalam daftar itu, modul saat ini disertakan oleh sistem pembangunan. -
LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH
Variabel ini adalah kebalikan dariLOCAL_MODULE_TARGET_ARCH
. Jika arsitektur yang sedang dibangun tidak ada dalam daftar itu, modul saat ini disertakan oleh sistem pembangunan.
Ada varian kecil dari dua 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 terdaftar.
Untuk menyiapkan flag build untuk arsitektur tertentu, gunakan variabel LOCAL_
khusus arsitektur. Variabel LOCAL_
khusus arsitektur adalah variabel LOCAL_
normal dengan akhiran 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 hanya diterapkan jika biner sedang dibangun untuk arsitektur itu.
Terkadang lebih mudah untuk mengatur flag berdasarkan apakah biner saat ini sedang dibangun untuk 32 bit atau 64 bit. Gunakan variabel LOCAL_
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,
Memasang jalur
Sebelumnya, Anda dapat menggunakan LOCAL_MODULE_PATH
untuk menginstal pustaka ke lokasi selain yang default. Misalnya, LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
.
Dalam build multilib, gunakan LOCAL_MODULE_RELATIVE_PATH
sebagai gantinya:
LOCAL_MODULE_RELATIVE_PATH := hw
Dengan format ini, pustaka 64-bit dan 32-bit dipasang di tempat yang benar.
Jika Anda membuat 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.
Sumber yang dihasilkan
Dalam build multilib, jika Anda membuat file sumber ke $(local-intermediates-dir)
(atau $(intermediates-dir-for)
dengan variabel eksplisit), itu tidak bekerja dengan andal. Itu karena sumber yang dihasilkan antara diperlukan oleh build 32-bit dan 64-bit, tetapi $(local-intermediates-dir)
hanya menunjuk ke salah satu dari dua direktori perantara.
Sistem build menyediakan direktori perantara khusus, ramah multilib, untuk menghasilkan sumber. Anda dapat memanggil $(local-generated-sources-dir)
atau $(generated-sources-dir-for)
untuk mendapatkan jalur direktori. Penggunaannya mirip dengan $(local-intermediates-dir)
dan $(intermediates-dir-for)
.
Jika file sumber dibuat ke direktori khusus ini dan diambil oleh LOCAL_GENERATED_SOURCES
, file tersebut dibuat untuk 32 bit dan 64 bit dalam build multilib.
Prebuilt
Dalam build multilib, Anda tidak dapat menggunakan TARGET_ARCH
(atau bersama dengan TARGET_2ND_ARCH
) untuk memberi tahu sistem build arsitektur apa yang menjadi target biner prebuilt. Sebagai gantinya, gunakan variabel LOCAL_
LOCAL_MODULE_TARGET_ARCH
atau LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH
.
Dengan variabel-variabel ini, sistem build dapat memilih biner bawaan 32-bit yang sesuai meskipun bekerja pada build multilib 64-bit.
Jika Anda ingin menggunakan arsitektur yang dipilih untuk menghitung jalur sumber untuk biner bawaan, panggil $(get-prebuilt-src-arch)
.
Pembuatan file ODEX
Untuk perangkat 64-bit, secara default kami menghasilkan file ODEX 32-bit dan 64-bit untuk image boot dan semua pustaka Java. Untuk APK, secara default kami menghasilkan ODEX hanya untuk arsitektur 64-bit utama. Jika aplikasi akan diluncurkan dalam proses 32-bit dan 64-bit, gunakan LOCAL_MULTILIB := both
untuk memastikan bahwa file ODEX 32-bit dan 64-bit dihasilkan. Jika aplikasi memiliki library JNI 32-bit atau 64-bit, flag tersebut juga memberi tahu sistem build untuk menyertakannya.