Hệ thống xây dựng hỗ trợ việc tạo tệp nhị phân cho hai cấu trúc CPU mục tiêu, 32 bit và 64 bit, nằm trong cùng một bản dựng. Bản dựng hai mục tiêu này được gọi là bản dựng multilib.
Đối với thư viện tĩnh và thư viện dùng chung tích hợp sẵn, hệ thống xây dựng sẽ thiết lập
các quy tắc để tạo tệp nhị phân cho cả hai cấu trúc. Cấu hình sản phẩm
(PRODUCT_PACKAGES
), cùng với biểu đồ phần phụ thuộc, sẽ xác định
tệp nhị phân được tạo và cài đặt vào hình ảnh hệ thống.
Đối với tệp thực thi và ứng dụng, hệ thống xây dựng chỉ tạo phiên bản 64 bit bằng cách
Mặc định, nhưng bạn có thể ghi đè cài đặt này bằng
Biến BoardConfig.mk
hoặc biến ở phạm vi mô-đun.
Xác định cấu trúc CPU và ABI thứ hai
BoardConfig.mk
bao gồm các biến sau để định cấu hình CPU thứ hai
cấu trúc và giao diện nhị phân của ứng dụng (ABI):
TARGET_2ND_ARCH
TARGET_2ND_ARCH_VARIANT
TARGET_2ND_CPU_VARIANT
TARGET_2ND_CPU_ABI
TARGET_2ND_CPU_ABI2
Để xem ví dụ về tệp makefile sử dụng các biến này, hãy xem
build/make/target/board/generic_arm64/BoardConfig.mk
.
Trong một bản dựng multilib, tên mô-đun trong PRODUCT_PACKAGES
bao gồm
cả tệp nhị phân 32 bit và 64 bit, miễn là bản dựng đã xác định các tệp này
hệ thống. Đối với các thư viện có trong phần phụ thuộc, thư viện 32 bit hoặc 64 bit được
chỉ được cài đặt khi ứng dụng được yêu cầu bởi một thư viện 32 bit hay 64 bit khác hoặc
tệp thực thi.
Tuy nhiên, tên mô-đun trên dòng lệnh make
chỉ bao gồm
Phiên bản 64 bit. Ví dụ: sau khi chạy lunch aosp_arm64-eng
,
make libc
chỉ tạo libc 64 bit. Người nhận
tạo libc 32 bit, bạn cần chạy make libc_32
.
Xác định cấu trúc mô-đun trong Android.mk
Bạn có thể dùng biến LOCAL_MULTILIB
để định cấu hình bản dựng
cho phiên bản 32 bit và 64 bit, đồng thời ghi đè biến TARGET_PREFER_32_BIT
toàn cục.
Để ghi đè TARGET_PREFER_32_BIT
, hãy đặt LOCAL_MULTILIB
thành một trong
sau:
both
tạo cả phiên bản 32 bit và 64 bit.32
chỉ tạo bản 32 bit.64
chỉ tạo bản 64 bit.first
chỉ xây dựng cho kiến trúc đầu tiên (32 bit trên các thiết bị 32 bit) và 64 bit trong thiết bị 64 bit).
Theo mặc định, LOCAL_MULTILIB
không được thiết lập và hệ thống xây dựng sẽ quyết định
dựa trên lớp mô-đun và
Biến LOCAL_*
, chẳng hạn như LOCAL_MODULE_TARGET_ARCH
và LOCAL_32_BIT_ONLY
.
Nếu bạn muốn xây dựng mô-đun cho các cấu trúc cụ thể, hãy sử dụng phương thức sau biến:
LOCAL_MODULE_TARGET_ARCH
– Đặt biến này thành danh sách cấu trúc, chẳng hạn nhưarm x86 arm64
. Nếu kiến trúc đang được xây dựng nằm trong danh sách đó, thì giá trị mô-đun hiện tại có trong hệ thống xây dựng.LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH
– Biến này ngược vớiLOCAL_MODULE_TARGET_ARCH
. Nếu kiến trúc đang được xây dựng lànot
trong danh sách đó, mô-đun hiện tại nằm trong hệ thống xây dựng.
Có các biến thể nhỏ của 2 biến này:
LOCAL_MODULE_TARGET_ARCH_WARN
LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH_WARN
Hệ thống xây dựng sẽ cảnh báo nếu mô-đun hiện tại bị bỏ qua do được liệt kê.
Để thiết lập cờ bản dựng cho một cấu trúc cụ thể, hãy sử dụng
biến LOCAL_*
theo cấu trúc cụ thể, trong đó
*
là một hậu tố dành riêng cho từng cấu trúc, ví dụ:
LOCAL_SRC_FILES_arm, LOCAL_SRC_FILES_x86,
LOCAL_CFLAGS_arm, LOCAL_CFLAGS_arm64,
LOCAL_LDFLAGS_arm, LOCAL_LDFLAGS_arm64,
Các biến này chỉ được áp dụng nếu bạn đang tạo tệp nhị phân cho biến đó cấu trúc.
Đôi khi, việc thiết lập cờ sẽ dễ dàng hơn dựa trên việc tệp nhị phân có
được xây dựng cho 32 bit hoặc 64 bit. Sử dụng LOCAL_*
biến có hậu tố _32
hoặc _64
, ví dụ:
LOCAL_SRC_FILES_32, LOCAL_SRC_FILES_64,
LOCAL_CFLAGS_32, LOCAL_CFLAGS_64,
LOCAL_LDFLAGS_32, LOCAL_LDFLAGS_64,
Đặt đường dẫn cài đặt thư viện
Đối với bản dựng không phải multilib, bạn có thể dùng LOCAL_MODULE_PATH
để cài đặt thư viện
sang một vị trí khác với vị trí mặc định. Ví dụ: LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
.
Tuy nhiên, trong bản dựng multilib, hãy sử dụng LOCAL_MODULE_RELATIVE_PATH
:
LOCAL_MODULE_RELATIVE_PATH := hw
Với định dạng này, cả thư viện 64 bit và 32 bit đều được cài đặt trong vị trí chính xác.
Nếu bạn tạo một tệp thực thi ở cả 32 bit và 64 bit, hãy sử dụng một trong các biến sau để phân biệt đường dẫn cài đặt:
LOCAL_MODULE_STEM_32, LOCAL_MODULE_STEM_64
– Chỉ định các phiên bản đã cài đặt tên tệp.LOCAL_MODULE_PATH_32, LOCAL_MODULE_PATH_64
– Chỉ định đường dẫn cài đặt.
Nhận thư mục trung gian cho các tệp nguồn
Trong một bản dựng multilib, nếu bạn tạo các tệp nguồn để
$(local-intermediates-dir)
(hoặc $(intermediates-dir-for)
)
với các biến rõ ràng), nó không hoạt động ổn định. Đó là
vì các nguồn được tạo trung gian
bắt buộc phải có cả phiên bản 32 bit và
Bản dựng 64 bit, nhưng $(local-intermediates-dir)
chỉ trỏ đến một trong
2 thư mục trung gian.
Hệ thống xây dựng cung cấp một thư viện
thư mục trung gian để tạo nguồn. Để truy xuất trung gian
đường dẫn của thư mục, hãy sử dụng
$(local-generated-sources-dir)
hoặc
Macro $(generated-sources-dir-for)
. Việc sử dụng các macro này tương tự như
$(local-intermediates-dir)
và $(intermediates-dir-for)
.
Nếu một tệp nguồn được tạo cho thư mục dành riêng này và được chọn
của LOCAL_GENERATED_SOURCES
, nên ứng dụng này được tạo cho cả phiên bản 32 bit và 64 bit
trong bản dựng multilib.
Cho biết cấu trúc hệ thống của các mục tiêu nhị phân được tạo sẵn
Trong một bản dựng multilib, bạn không thể sử dụng TARGET_ARCH
hoặc kết hợp TARGET_ARCH
với
TARGET_2ND_ARCH
, để cho biết kiến trúc hệ thống của thư viện tạo sẵn
mục tiêu nhị phân. Thay vào đó, hãy sử dụng các biến LOCAL_*
LOCAL_MODULE_TARGET_ARCH
hoặc
LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH
.
Với các biến này, hệ thống xây dựng có thể chọn phiên bản 32 bit tương ứng tệp nhị phân tạo sẵn ngay cả khi tệp đó đang hoạt động trên bản dựng multilib 64 bit.
Nếu bạn muốn sử dụng kiến trúc đã chọn để tính toán đường dẫn nguồn cho
tệp nhị phân tạo sẵn, hãy gọi $(get-prebuilt-src-arch)
.
Đảm bảo tạo tệp ODEX 32 bit và 64 bit
Đối với các thiết bị 64 bit, theo mặc định, Google tạo cả ODEX 32 bit và 64 bit
các tệp cho hình ảnh khởi động và bất kỳ thư viện Java nào. Đối với APK, theo mặc định, Google
chỉ tạo ODEX cho kiến trúc 64 bit chính. Nếu một ứng dụng được phát hành
trong cả quy trình 32 bit và 64 bit, hãy sử dụng LOCAL_MULTILIB := both
để đảm bảo
cả hai tệp ODEX 32 bit và 64 bit đều được tạo. Nếu ứng dụng có bất kỳ phiên bản 32 bit nào
hoặc thư viện JNI 64 bit, cờ đó cũng yêu cầu hệ thống xây dựng đưa các thư viện đó vào.