Trước khi 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 bản dựng. 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 dự kiến sẽ chuyển từ Make sang sử 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ề 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 thực hiện và so sánh sớm
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,
},
},
}
Để xem ví dụ về cấu hình Soong dành riêng cho kiểm thử, hãy xem phần 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ộ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
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 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 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 quá trình chuyển đổi của Android 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 cung cấp khả năng cho các mô-đun trong các thư mục khác nhau 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 biệt. 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 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 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 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 nhìn vào không gian tên gốc.