Bangun untuk arsitektur 32-bit dan 64-bit

Sistem build mendukung pembuatan biner untuk dua arsitektur CPU target, 32 bit dan 64 bit, dalam build yang sama. Pembangunan dua target ini dikenal sebagai pembangunan multilib .

Untuk perpustakaan statis bawaan dan perpustakaan 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 diinstal pada citra sistem.

Untuk executable dan aplikasi, sistem pembangunan hanya membangun versi 64-bit secara default, namun Anda dapat mengganti pengaturan ini dengan variabel BoardConfig.mk global atau variabel cakupan modul.

Identifikasi arsitektur CPU kedua dan ABI

BoardConfig.mk menyertakan variabel berikut untuk mengonfigurasi arsitektur CPU kedua dan antarmuka biner aplikasi (ABI):

  • 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, asalkan ditentukan oleh sistem build. Untuk pustaka yang disertakan berdasarkan ketergantungan, pustaka 32-bit atau 64-bit diinstal hanya jika diperlukan oleh pustaka 32-bit atau 64-bit lain atau dapat dieksekusi.

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 .

Tentukan arsitektur modul di Android.mk

Anda dapat menggunakan variabel LOCAL_MULTILIB untuk mengonfigurasi build Anda untuk 32 bit dan 64 bit dan mengganti variabel TARGET_PREFER_32_BIT global.

Untuk mengganti TARGET_PREFER_32_BIT , setel LOCAL_MULTILIB ke salah satu dari yang berikut:

  • both membangun 32 bit dan 64 bit.
  • 32 hanya membangun 32 bit.
  • 64 hanya membangun 64 bit.
  • build first hanya untuk arsitektur pertama (32 bit di perangkat 32-bit dan 64 bit di perangkat 64-bit).

Secara default, LOCAL_MULTILIB tidak disetel dan 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 membangun 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 tersebut, modul saat ini disertakan oleh sistem pembangunan.

  • LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH - Variabel ini merupakan kebalikan dari LOCAL_MODULE_TARGET_ARCH . Jika arsitektur yang sedang dibangun not dalam daftar tersebut, modul saat ini disertakan oleh sistem pembangunan.

Ada varian kecil dari kedua variabel ini:

  • LOCAL_MODULE_TARGET_ARCH_WARN
  • LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH_WARN

Sistem pembangunan memperingatkan jika modul saat ini dilewati karena arsitektur yang terdaftar.

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 arsitektur tersebut.

Terkadang lebih mudah untuk menyiapkan tanda berdasarkan apakah biner dibuat 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,

Tetapkan jalur instalasi perpustakaan

Untuk build non-multilib, Anda dapat menggunakan LOCAL_MODULE_PATH untuk menginstal perpustakaan 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, perpustakaan 64-bit dan 32-bit dipasang di lokasi yang benar.

Jika Anda membuat file executable 32 bit dan 64 bit, gunakan salah satu variabel berikut untuk membedakan jalur instalasi:

  • LOCAL_MODULE_STEM_32, LOCAL_MODULE_STEM_64 - Menentukan nama file yang diinstal.
  • LOCAL_MODULE_PATH_32, LOCAL_MODULE_PATH_64 - Menentukan jalur instalasi.

Dapatkan direktori perantara untuk file sumber

Dalam build multilib, jika Anda membuat file sumber ke $(local-intermediates-dir) (atau $(intermediates-dir-for) dengan variabel eksplisit), itu tidak akan berfungsi dengan baik. Itu karena sumber perantara yang dihasilkan diperlukan oleh versi 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. 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 , file tersebut dibuat untuk 32 bit dan 64 bit dalam build multilib.

Tunjukkan arsitektur sistem target biner yang telah dibuat sebelumnya

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 biner bawaan 32-bit yang sesuai meskipun sistem tersebut bekerja pada build multilib 64-bit.

Jika Anda ingin menggunakan arsitektur yang dipilih untuk menghitung jalur sumber biner bawaan, panggil $(get-prebuilt-src-arch) .

Pastikan 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 pustaka Java apa pun. Untuk APK, secara default Google membuat ODEX hanya untuk arsitektur utama 64-bit. Jika aplikasi 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 pustaka JNI 32-bit atau 64-bit, tanda tersebut juga memberi tahu sistem build untuk menyertakannya.