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, 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ử. 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ế Make. Công cụ này tận dụng công cụ nhân bản GNU Make Kati và thành phần hệ thống xây dựng Ninja để tăng tốc các bản dựng của Android.
Hãy xem nội dung mô tả về 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 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 thực hiện và so sánh sớm
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.
Để 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ác đặc điểm riêng biệt.
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ô-đun có cùng tên với các mô-đun dựa trên nguồn tương ứng. 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. 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 một 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ẽ chỉ định 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, 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 một 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 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 được xác định theo 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, 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…
- 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. - 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.
- Nếu mô-đun đó không tồn tại, Soong sẽ tìm một mô-đun có tên là D trong các không gian tên I1, I2, I3…
- Cuối cùng, Soong sẽ tìm trong không gian tên gốc.