建構系統支援在同一個版本中,為兩個目標 CPU 架構 (32 位元和 64 位元) 建構二進位檔。這種兩個目標的版本稱為多重程式庫版本。
針對內建靜態資料庫和共用程式庫,建構系統會設定規則,為這兩種架構建構二進位檔。產品設定 (PRODUCT_PACKAGES
) 與依附元件圖表一同決定系統映像檔應建構及安裝哪些二進位檔。
對於執行檔和應用程式,建構系統僅會依照
但您可以使用全域設定覆寫這項設定
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
。
在多重程式庫建構作業中,只要建構系統定義了 PRODUCT_PACKAGES
中的模組名稱,就會涵蓋 32 位元和 64 位元二進位檔。對於依附元件所包含的程式庫,只有在其他 32 位元或 64 位元程式庫或可執行檔需要時,才會安裝 32 位元或 64 位元程式庫。
不過,make
指令列中的模組名稱僅涵蓋
64 位元版本。舉例來說,執行 lunch aosp_arm64-eng
後,make libc
只會建構 64 位元 libc。如要建構 32 位元 libc,您必須執行 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,
設定程式庫安裝路徑
針對非 multilib 版本,您可以使用 LOCAL_MODULE_PATH
安裝程式庫
到預設位置以外的位置。例如 LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
。
不過,在多重程式庫建構中,請改用 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
:指定安裝路徑。
取得來源檔案的中繼目錄
在多重程式庫建構作業中,如果您將來源檔案產生至 $(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 位元 multilib 版本上運作也一樣。
如果您想使用所選架構來計算預先建構二進位檔的原始路徑,請呼叫 $(get-prebuilt-src-arch)
。
確保產生 32 位元和 64 位元 ODEX 檔案
針對 64 位元裝置,Google 預設會同時產生 32 位元和 64 位元 ODEX。
適用於開機映像檔和任何 Java 程式庫的檔案APK 預設使用 Google
只會針對主要 64 位元架構產生 ODEX。應用程式啟動時
針對 32 位元和 64 位元程序,請使用 LOCAL_MULTILIB := both
來確保
所產生的 32 位元和 64 位元 ODEX 檔案。如果應用程式有任何 32 位元或 64 位元 JNI 程式庫,這個標記也會指示建構系統納入這些程式庫。