Hệ thống xây dựng hỗ trợ tạo tệp nhị phân cho 2 cấu trúc CPU mục tiêu (32 bit và 64 bit) trong cùng một bản dựng. Bản dựng có hai mục tiêu này được gọi là bản dựng multilib.
Đối với các thư viện tĩnh và thư viện dùng chung tích hợp, 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, xác định những tệp nhị phân được tạo và cài đặt vào hình ảnh hệ thống.
Đối với các 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 theo mặc định, nhưng bạn có thể ghi đè chế độ cài đặt này bằng một biến BoardConfig.mk
chung hoặc một biến có phạm vi mô-đun.
Xác định kiến trúc CPU và ABI thứ hai
BoardConfig.mk
bao gồm các biến sau để định cấu hình kiến trúc CPU thứ hai 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
Để biết ví dụ về makefile sử dụng các biến này, hãy xem build/make/target/board/generic_arm64/BoardConfig.mk
.
Trong bản dựng multilib, tên mô-đun trong PRODUCT_PACKAGES
bao gồm cả các tệp nhị phân 32 bit và 64 bit, miễn là chúng được hệ thống xây dựng xác định. Đối với các thư viện được đưa vào theo phần phụ thuộc, thư viện 32 bit hoặc 64 bit chỉ được cài đặt nếu một thư viện hoặc tệp thực thi 32 bit hoặc 64 bit khác yêu cầu.
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. Để 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ể sử dụng biến LOCAL_MULTILIB
để định cấu hình bản dựng cho 32 bit và 64 bit, đồng thời ghi đè biến TARGET_PREFER_32_BIT
chung.
Để ghi đè TARGET_PREFER_32_BIT
, hãy đặt LOCAL_MULTILIB
thành một trong những giá trị sau:
both
tạo cả 32 bit và 64 bit.32
chỉ tạo bản dựng 32 bit.64
chỉ tạo bản dựng 64 bit.first
chỉ tạo cho kiến trúc đầu tiên (32 bit trong thiết bị 32 bit và 64 bit trong thiết bị 64 bit).
Theo mặc định, LOCAL_MULTILIB
không được đặt và hệ thống xây dựng sẽ quyết định xây dựng kiến trúc nào dựa trên lớp mô-đun và các biến LOCAL_*
khác, chẳng hạn như LOCAL_MODULE_TARGET_ARCH
và LOCAL_32_BIT_ONLY
.
Nếu bạn muốn tạo mô-đun cho các cấu trúc cụ thể, hãy sử dụng các biến sau:
LOCAL_MODULE_TARGET_ARCH
– Đặt biến này thành danh sách các cấu trúc, chẳng hạn nhưarm x86 arm64
. Nếu cấu trúc đang được tạo nằm trong danh sách đó, thì mô-đun hiện tại sẽ được hệ thống xây dựng đưa vào.LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH
– Biến này ngược lại vớiLOCAL_MODULE_TARGET_ARCH
. Nếu cấu trúc đang được tạo lànot
trong danh sách đó, thì mô-đun hiện tại sẽ được hệ thống xây dựng đưa vào.
Có một số biến thể nhỏ của hai 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ác cấu trúc đượ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 các biến LOCAL_*
dành riêng cho cấu trúc, trong đó *
là một hậu tố dành riêng cho 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 một tệp nhị phân đang được tạo cho cấu trúc đó.
Đôi khi, bạn sẽ dễ dàng thiết lập cờ hơn dựa trên việc liệu tệp nhị phân có đang được tạo cho 32 bit hay 64 bit hay không. Sử dụng biến LOCAL_*
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 một thư viện vào 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 ở đúng vị trí.
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 tên tệp đã cài đặt.LOCAL_MODULE_PATH_32, LOCAL_MODULE_PATH_64
– Chỉ định đường dẫn cài đặt.
Lấy thư mục trung gian cho các tệp nguồn
Trong bản dựng multilib, nếu bạn tạo tệp nguồn thành $(local-intermediates-dir)
(hoặc $(intermediates-dir-for)
với các biến rõ ràng), thì thao tác này sẽ không hoạt động một cách đáng tin cậy. Đó là vì cả bản dựng 32 bit và 64 bit đều yêu cầu các nguồn được tạo trung gian, nhưng $(local-intermediates-dir)
chỉ trỏ đến một trong hai thư mục trung gian.
Hệ thống bản dựng cung cấp một thư mục trung gian chuyên dụng, thân thiện với multilib để tạo các nguồn. Để truy xuất đường dẫn của thư mục trung gian, hãy sử dụng macro $(local-generated-sources-dir)
hoặc $(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 chuyên dụng này và được LOCAL_GENERATED_SOURCES
chọn, thì tệp đó sẽ được tạo cho cả 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 bản dựng multilib, bạn không thể dùng TARGET_ARCH
hoặc TARGET_ARCH
kết hợp với TARGET_2ND_ARCH
để 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. 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 tệp nhị phân được tạo sẵn 32 bit tương ứng ngay cả khi đang hoạt động trên bản dựng multilib 64 bit.
Nếu bạn muốn sử dụng cấu trúc đã chọn để tính toán đường dẫn nguồn cho tệp nhị phân được 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 sẽ tạo cả tệp ODEX 32 bit và 64 bit cho hình ảnh khởi động và mọi thư viện Java. Đố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 chạy trong cả quy trình 32 bit và 64 bit, hãy dùng LOCAL_MULTILIB := both
để đảm bảo rằng cả tệp ODEX 32 bit và 64 bit đều được tạo. Nếu ứng dụng có bất kỳ thư viện JNI 32 bit hoặc 64 bit nào, thì cờ đó cũng sẽ cho hệ thống bản dựng biết để đưa các thư viện đó vào.