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 được hỗ trợ và sử dụng rộng rãi, nhưng ở quy mô của Android, hệ thống này trở nên chậm, dễ gặp lỗi, không thể mở rộng và khó kiểm thử. 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 nhóm Google android-building để được hỗ trợ.

Soong là gì?

Hệ thống xây dựng Soong đã ra mắt 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.

Hãy xem nội dung mô tả về 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à Thay đổi hệ thống xây dựng cho Trình viết Android.mk để tìm hiểu về các sửa đổi cần thiết để chuyển đổi từ Make sang Soong.

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

So sánh Make và Soong

Dưới đây là thông tin so sánh về cấu hình Make với Soong thực hiện cùng một việc trong tệp cấu hình Soong (Bản thiết kế 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.

Để biết 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ể sử dụng mô-đun mặc định để lặp lại cùng một thuộc tính 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ó một cc_prebuilt_binary tên là foo khi đã có một cc_binary có cùng tên. Điều này giúp nhà phát triển linh hoạt chọn phiên bản để đưa vào sản phẩm cuối cùng. 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 giá trị PRODUCT_SOONG_NAMESPACES. Giá trị của thuộc tính này phải là danh sách các không gian tên được phân tách bằng dấu cách mà Soong xuất sang Make để được 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"],
}

Xin lưu ý rằng 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 chỉ định làm tên.

Mỗi mô-đun Soong được chỉ định một không gian tên dựa trên vị trí của mô-đun đó trong cây. Mỗi mô-đun Soong được coi là nằm trong không gian tên do soong_namespace xác định trong tệp Android.bp trong thư mục hiện tại hoặc thư mục gốc 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à 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à một tên đủ điều kiện ở dạng //namespace:module, thì chỉ không gian tên được chỉ định mới đượ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.