Hiểu các bản dựng 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 (64 bit và 32 bit) trong cùng một bản dựng. Đây được biết đến như là một bản dựng nhiều liên kết.

Đối với thư viện tĩnh gốc và thư viện chia sẻ, hệ thống xây dựng 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 mã nhị phân nào được tạo và cài đặt cho 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 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 phạm vi mô-đun.

Cấu hình sản phẩm

BoardConfig.mk bao gồm các biến sau để định cấu hình kiến ​​trúc CPU thứ hai và ABI:

  • TARGET_2ND_ARCH
  • TARGET_2ND_ARCH_VARIANT
  • TARGET_2ND_CPU_VARIANT
  • TARGET_2ND_CPU_ABI
  • TARGET_2ND_CPU_ABI2

Bạn có thể xem một ví dụ trong build/target/board/generic_arm64/BoardConfig.mk .

Trong một phiên bản nhiềulib, tên mô-đun trong PRODUCT_PACKAGES bao gồm cả hai mã nhị phân 32-bit và 64-bit, miễn là chúng được xác định bởi hệ thống xây dựng. Đối với các thư viện được kéo vào bởi sự phụ thuộc, thư viện 32 bit chỉ được cài đặt nếu nó được yêu cầu bởi thư viện 32 bit khác hoặc tệp thực thi. Điều này cũng đúng với các thư viện 64-bit.

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 .

Định nghĩa 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 / 64 bit và ghi đè biến TARGET_PREFER_32_BIT chung.

Đặt LOCAL_MULTILIB thành một trong các giá trị sau:

  • "both" xây dựng cả 32 bit và 64 bit.
  • "32" chỉ xây dựng 32 bit.
  • "64" chỉ xây dựng 64 bit.
  • "first" chỉ xây dựng 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).
  • "" là mặc định. Hệ thống xây dựng quyết định kiến ​​trúc sẽ 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 bao gồm.
  • LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH
    Biến này đối lập với LOCAL_MODULE_TARGET_ARCH . Nếu kiến ​​trúc đang được xây dựng không có trong danh sách đó, mô-đun hiện tại sẽ được hệ thống xây dựng bao gồm.

Có những biến thể nhỏ của hai biến số này:

  • LOCAL_MODULE_TARGET_ARCH_WARN
  • LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH_WARN

Hệ thống xây dựng 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. Biến LOCAL_ dành riêng cho kiến ​​trúc là một biến LOCAL_ bình thường có hậu tố 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 hiện đang được xây dựng cho kiến ​​trúc đó.

Đôi khi, việc thiết lập cờ dễ dàng hơn dựa trên việc hệ nhị phân hiện đang được xây dựng cho 32 bit hay 64 bit. Sử dụng biến LOCAL_ với 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,

Cài đặt đường dẫn

Trước đây, 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 .

Trong một bản dựng nhiềulib, hãy sử dụng LOCAL_MODULE_RELATIVE_PATH để thay thế:

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 tệp thi hành 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.

Nguồn đã tạo

Trong một bản dựng multilib, nếu bạn tạo các 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 một cách đáng tin cậy. Đó là bởi vì 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 người dùng để tạo nguồn. Bạn có thể gọi $(local-generated-sources-dir) hoặc $(generated-sources-dir-for) để lấy đường dẫn của thư mục. Việc sử dụng chúng tương tự như $(local-intermediates-dir)$(intermediates-dir-for) .

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

Bản dựng sẵn

Trong một bản dựng multilib, bạn không thể sử dụng TARGET_ARCH (hoặc cùng với TARGET_2ND_ARCH ) để cho hệ thống xây dựng biết kiến ​​trúc 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 dựng sẵn 32-bit tương ứng ngay cả khi nó đang hoạt động trên bản dựng đa kênh 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) .

Tạo tệp ODEX

Đối với các thiết bị 64-bit, theo mặc định, chúng tôi tạo cả tệp ODEX 32-bit và 64-bit 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, chúng tôi chỉ tạo ODEX cho kiến ​​trúc 64-bit chính. Nếu một ứng dụng sẽ được khởi chạy trong cả quy trình 32 bit và 64 bit, hãy sử dụng LOCAL_MULTILIB := both để đảm bảo rằng cả hai 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 cho hệ thống xây dựng bao gồm chúng.