Memahami Build 64-bit

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 variabel LOCAL_ lainnya, seperti LOCAL_MODULE_TARGET_ARCH dan LOCAL_32_BIT_ONLY .

Jika Anda ingin membuat modul untuk arsitektur tertentu, gunakan variabel berikut:

  • LOCAL_MODULE_TARGET_ARCH
    Setel variabel ini ke daftar arsitektur, seperti arm 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 dari LOCAL_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.