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

Trước bản phát hành Android 7.0, Android chỉ sử dụng GNU Make để mô tả và thực thi các quy tắc xây dựng của phiên bản này. Hệ thống xây dựng Make được hỗ trợ và sử dụng rộng rãi, nhưng ở quy mô của Android trở nên chậm, dễ xảy ra lỗi, không thể mở rộng và khó kiểm thử. Hệ thống xây dựng Soong mang đến tính 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 nên chuyển từ Make và áp dụng Soong càng sớm càng tốt. Gửi câu hỏi đến Nhóm Google android-building để đượ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. Phiên bản này tận dụng công cụ sao chép Kati GNU Make và thành phần hệ thống xây dựng Ninja để tăng tốc các bản dựng Android.

Hãy xem nội dung mô tả Android Make Build System (Hệ thống xây dựng Android Make) trong Dự án nguồn mở Android (AOSP) để biết hướng dẫn chung và Các thay đổi hệ thống xây dựng cho Android.mk Writers nhằm tìm hiểu những sửa đổi cần thiết để thích ứng từ Make sang Soong.

Hãy xem các mục liên quan đến bản dựng trong bảng thuật ngữ để nắm được định nghĩa của các thuật ngữ chính và tham khảo các tệp tham khảo Soong để biết đầy đủ thông tin.

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

Dưới đây là thông tin so sánh giữa cấu hình Make và Soong thực hiện điều 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 các 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 các mô-đun có cùng tên với các mô-đun dựa trên nguồn của mô-đun đó. Ví dụ: có thể có một cc_prebuilt_binary có tên là foo khi đã có cc_binary trùng tên. Nhờ đó, nhà phát triển có thể linh hoạt lựa chọn phiên bản để đưa vào sản phẩm cuối cùng. Nếu cấu hình bản dựng chứa cả hai phiên bản, thì giá trị 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. Giá trị của lớp này 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 sẽ được tạo bằng lệnh m. Sau khi Android chuyển đổi sang Soong hoàn tất, thông tin chi tiết về việc bật không gian tên có thể thay đổi.

Soong cho phép các mô-đun trong nhiều thư mục chỉ định cùng một tên, miễn là mỗi mô-đun được khai báo trong một không gian tên riêng. Bạn có thể khai báo không gian tên như sau:

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

Xin lưu ý rằng một không gian tên không có thuộc tính tên; đường dẫn của không gian tên đó sẽ 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 được xác định bằng soong_namespace có trong 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, mô-đun sẽ được coi là nằm trong không gian tên gốc ngầm ẩn.

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

  1. Khi đó, 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 mới được tìm kiếm tên mô-đun đã chỉ định.
  2. Nếu không, trước tiên, Soong sẽ tìm một mô-đun có tên D được khai báo trong không gian tên N.
  3. Nếu mô-đun đó không tồn tại, Soong sẽ tìm một mô-đun có tên 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.