Hệ thống xây dựng Soong

Trước bản phát hành Android 7.0, Android sử dụng GNU Make để mô tả và thực thi các quy tắc xây dựng của nó. Hệ thống xây dựng Make là được hỗ trợ và sử dụng rộng rãi, nhưng ở quy mô Android trở nên chậm, dễ xảy ra lỗi, không thể mở rộng và khó thử nghiệm. Chiến lược phát hành đĩa đơn Hệ thống xây dựng Soong mang lại sự linh hoạt cần thiết cho các bản dựng Android.

Vì lý do này, các nhà phát triển nền tảng cần phải chuyển từ thẻ Tạo và áp dụng Sớm nhất có thể. Gửi câu hỏi đến xây dựng android Google Group để được hỗ trợ.

Soong là gì?

Hệ thống xây dựng Soong đã được giới thiệu trong Android 7.0 (Nougat) để thay thế cho Make. Chiến dịch này tận dụng Kati GNU Tạo công cụ sao chép và hệ thống xây dựng Ninja giúp tăng tốc các bản dựng Android.

Xem Android Make Build System (Hệ thống tạo bản dựng Android) mô tả chung trong Dự án nguồn mở Android (AOSP) hướng dẫnThay đổi về hệ thống xây dựng đối với Người viết Android.mk để tìm hiểu những điểm sửa đổi cần thiết nhằm điều chỉnh từ "Make to To" sang "Sắp có".

Xem các mục liên quan đến bản dựng trong bảng chú giải thuật ngữ để biết định nghĩa của các thuật ngữ chính và Xem tệp tham khảo để biết đầy đủ thông tin.

So sánh So sánh nhanh và So sánh

Sau đây là phần so sánh giữa cấu hình Make và Soong đạt được kết quả tương tự trong tệp cấu hình Soong (Blueprint hoặc .bp).

Làm ví dụ

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := libxmlrpc++
LOCAL_MODULE_HOST_OS := linux

LOCAL_RTTI_FLAG := -frtti
LOCAL_CPPFLAGS := -Wall -Werror -fexceptions
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/src

LOCAL_SRC_FILES := $(call \
     all-cpp-files-under,src)
include $(BUILD_SHARED_LIBRARY)

Ví dụ về Soong

cc_library_shared {
     name: "libxmlrpc++",

     rtti: true,
     cppflags: [
           "-Wall",
           "-Werror",
           "-fexceptions",
     ],
     export_include_dirs: ["src"],
     srcs: ["src/**/*.cpp"],

     target: {
           darwin: {
                enabled: false,
           },
     },
}

Để biết ví dụ về cấu hình Soong dành riêng cho kiểm thử, hãy xem Cấu hình bản dựng đơn giản.

Để xem nội dung giải thích về các trường trong tệp Android.bp, hãy tham khảo Định dạng tệp Android.bp.

Mô-đun đặc biệt

Một số nhóm mô-đun đặc biệt có đặc điểm riêng.

Mô-đun mặc định

Bạn có thể dùng mô-đun mặc định để lặp lại các thuộc tính giống nhau trong nhiều mô-đun. Ví dụ:

cc_defaults {
    name: "gzip_defaults",
    shared_libs: ["libz"],
    stl: "none",
}

cc_binary {
    name: "gzip",
    defaults: ["gzip_defaults"],
    srcs: ["src/test/minigzip.c"],
}

Mô-đun tạo sẵn

Một số loại mô-đun tạo sẵn cho phép một mô-đun có cùng tên với mô-đun bản sao dựa trên nguồn. Ví dụ: có thể có cc_prebuilt_binary có tên là foo khi đã có cc_binary trùng tên. Điều này mang lại các nhà phát triển có thể linh hoạt chọn phiên bản để đưa vào của Google. Nếu một cấu hình bản dựng chứa cả hai phiên bản, thì cờ prefer trong định nghĩa mô-đun tạo sẵn sẽ cho biết phiên bản nào có mức độ ưu tiên. Xin lưu ý rằng một số mô-đun tạo sẵn có tên không bắt đầu bằng prebuilt, chẳng hạn như android_app_import.

Mô-đun không gian tên

Cho đến khi Android chuyển đổi hoàn toàn từ Make sang Soong, cấu hình sản phẩm Make phải chỉ định một giá trị PRODUCT_SOONG_NAMESPACES. phải là một danh sách không gian tên được phân tách bằng dấu cách mà Soong xuất sang Make tạo bằng lệnh m. Sau khi Android chuyển đổi sang Soong hoàn tất, chi tiết về việc bật không gian tên có thể thay đổi.

Soong cung cấp khả năng cho các mô-đun trong các thư mục khác nhau để chỉ định cùng tên, miễn là mỗi mô-đun được khai báo trong một không gian tên riêng biệt. Đáp có thể khai báo không gian tên như sau:

soong_namespace {
    imports: ["path/to/otherNamespace1", "path/to/otherNamespace2"],
}

Lưu ý một vùng chứa tên không có thuộc tính name; đường dẫn của vị trí tự động được gán làm tên.

Mỗi mô-đun Soong được gán một không gian tên dựa trên vị trí của mô-đun đó trên cây. Mỗi mô-đun Soong được coi là nằm trong không gian tên do lệnh Tìm thấy soong_namespace trong một tệp Android.bp trong thư mục hiện tại hoặc thư mục đối tượng cấp trên gần nhất. Nếu không tìm thấy mô-đun soong_namespace như vậy, thì mô-đun được coi là nằm trong không gian tên gốc ngầm ẩn.

Sau đây là một ví dụ: Soong cố gắng phân giải phần phụ thuộc D do mô-đun M khai báo trong không gian tên N nhập các không gian tên I1, I2, I3 ...

  1. Sau đó, nếu D là tên đủ điều kiện của biểu mẫu //namespace:module, thì chỉ không gian tên đã chỉ định sẽ được tìm kiếm cho tên mô-đun được chỉ định.
  2. Nếu không, Soong trước tiên sẽ tìm một mô-đun có tên D được khai báo trong không gian tên B.
  3. Nếu mô-đun đó không tồn tại, Soong sẽ tìm một mô-đun có tên là D trong không gian tên I1, I2, I3...
  4. Cuối cùng, Soong nhìn vào không gian tên gốc.