Xây dựng cho kiến ​​trúc 32 bit và 64 bit

Hệ thống xây dựng hỗ trợ xây dựng các tệp nhị phân cho hai kiến ​​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 hai mục tiêu này được gọi là bản dựng đa mục tiêu .

Đối với các thư viện tĩnh tích hợp và thư viện dùng chung, hệ thống xây dựng sẽ thiết lập các quy tắc để xây dựng các tệp nhị phân cho cả hai kiến ​​trúc. Cấu hình sản phẩm ( PRODUCT_PACKAGES ), cùng với biểu đồ phụ thuộc, xác định tệp nhị phân nào đượ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ỉ xây dựng phiên bản 64 bit theo mặc định, nhưng bạn có thể ghi đè cài đặt này bằng biến BoardConfig.mk chung hoặc biến trong phạm vi mô-đun.

Xác định kiến ​​trúc CPU thứ hai và ABI

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 ứ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ề tệp tạo tệp 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 nhiều lib, tên mô-đun trong PRODUCT_PACKAGES bao gồm cả nhị phân 32 bit và 64 bit, miễn là chúng được hệ thống bản dựng xác định. Đối với các thư viện được bao gồm trong phần phụ thuộc, thư viện 32 bit hoặc 64 bit chỉ được cài đặt nếu thư viện 32 bit hoặc 64 bit khác hoặc thư viện có thể thực thi đượ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ỉ xây dựng libc 64-bit. Để xây dựng libc 32 bit, bạn cần chạy make libc_32 .

Xác định kiến ​​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 của mình 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 các tùy chọn sau:

  • both xây dựng cả 32 bit và 64 bit.
  • 32 bản dựng chỉ có 32 bit.
  • 64 bản dựng chỉ có 64 bit.
  • bản dựng first chỉ dành cho kiến ​​trúc đầu tiên (32 bit ở thiết bị 32 bit và 64 bit ở thiết bị 64 bit).

Theo mặc định, LOCAL_MULTILIB không được đặt và hệ thống xây dựng quyết định kiến ​​trúc nào sẽ được xây dựng dựa trên lớp mô-đun và các biến LOCAL_ * khác, chẳng hạn như LOCAL_MODULE_TARGET_ARCHLOCAL_32_BIT_ONLY .

Nếu bạn muốn xây dựng mô-đun của mình cho các kiến ​​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 kiến ​​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ì 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ới LOCAL_MODULE_TARGET_ARCH . Nếu kiến ​​trúc đang được xây dựng 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ó các 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 kiến ​​trúc được liệt kê.

Để thiết lập cờ xây dựng cho một kiến ​​trúc cụ thể, hãy sử dụng các biến LOCAL_ * dành riêng cho kiến ​​trúc, trong đó * là hậu tố dành riêng cho kiến ​​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 xây dựng cho kiến ​​trúc đó.

Đôi khi, việc thiết lập cờ dựa trên việc nhị phân đang được xây dựng cho 32 bit hay 64 bit sẽ dễ dàng hơn. 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 có multilib, bạn có thể sử dụng LOCAL_MODULE_PATH để cài đặ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 đa cấp, thay vào đó 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 xây dựng 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 tin nguồn

Trong bản dựng đa cấp, 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ì nó không hoạt động đáng tin cậy. Đó là do các nguồn được tạo trung gian được yêu cầu bởi cả bản dựng 32 bit và 64 bit, nhưng $(local-intermediates-dir) chỉ trỏ đến một trong hai thư mục trung gian.

Hệ thống xây dựng cung cấp một thư mục trung gian chuyên dụng, thân thiện với nhiều lib để tạo 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)$(intermediates-dir-for) .

Nếu một tệp nguồn được tạo vào thư mục chuyên dụng này và được LOCAL_GENERATED_SOURCES chọn, thì tệp nguồn đó được tạo cho cả 32 bit và 64 bit trong bản dựng đa cấp.

Chỉ ra kiến ​​trúc hệ thống của các mục tiêu nhị phân dựng sẵn

Trong bản dựng nhiều lib, bạn không thể sử dụng TARGET_ARCH hoặc TARGET_ARCH kết hợp với TARGET_2ND_ARCH để biểu thị kiến ​​trúc hệ thống của các mục tiêu nhị phân dựng 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 dựng sẵn 32 bit tương ứng ngay cả khi nó đang hoạt động trên bản dựng đa cấp 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 dựng 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 thiết bị 64 bit, theo mặc định, Google 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 khởi chạy ở cả quy trình 32 bit và 64 bit, hãy sử 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, cờ đó cũng yêu cầu hệ thống xây dựng đưa chúng vào.