Theo thiết kế, các tệp Android.bp
rất đơn giản. Chúng không chứa các câu lệnh có điều kiện hoặc câu lệnh luồng kiểm soát; mọi độ phức tạp đều được xử lý bằng logic bản dựng được viết bằng Go.
Mô-đun
Một mô-đun trong tệp Android.bp
bắt đầu bằng một loại mô-đun, theo sau là một tập hợp các thuộc tính ở định dạng name: "value",
:
cc_binary {
name: "gzip",
srcs: ["src/test/minigzip.c"],
shared_libs: ["libz"],
stl: "none",
}
Mỗi mô-đun phải có một thuộc tính name
và giá trị phải là duy nhất trên tất cả các tệp Android.bp
, ngoại trừ các giá trị thuộc tính name
trong không gian tên và các mô-đun dựng sẵn có thể lặp lại.
Thuộc tính srcs
chỉ định các tệp nguồn dùng để tạo mô-đun, dưới dạng danh sách các chuỗi. Bạn có thể tham chiếu đầu ra của các mô-đun khác tạo ra tệp nguồn, chẳng hạn như genrule
hoặc filegroup
, bằng cách sử dụng cú pháp tham chiếu mô-đun ":<module-name>"
.
Để xem danh sách các loại mô-đun hợp lệ và thuộc tính của chúng, hãy xem Tài liệu tham khảo về mô-đun Soong.
Loại
Các biến và thuộc tính được nhập mạnh, với các biến dựa trên động dựa trên lần chỉ định đầu tiên và các thuộc tính được đặt tĩnh theo loại mô-đun. Các loại được hỗ trợ là:
- Boolean (
true
hoặcfalse
) - Số nguyên (
int
) - Chuỗi (
"string"
) - Danh sách chuỗi (
["string1", "string2"]
) - Bản đồ (
{key1: "value1", key2: ["value2"]}
)
Bản đồ có thể chứa các giá trị thuộc bất kỳ loại nào, kể cả bản đồ lồng nhau. Danh sách và bản đồ có thể có dấu phẩy thừa sau giá trị cuối cùng.
Globs
Các thuộc tính lấy danh sách tệp, chẳng hạn như srcs
, cũng có thể lấy các mẫu glob. Mẫu glob có thể chứa ký tự đại diện UNIX thông thường *
, ví dụ: *.java
. Mẫu glob cũng có thể chứa một ký tự đại diện **
duy nhất dưới dạng một phần tử đường dẫn, khớp với không hoặc nhiều phần tử đường dẫn. Ví dụ: java/**/*.java
khớp với cả mẫu java/Main.java
và java/com/android/Main.java
.
Biến
Tệp Android.bp
có thể chứa các phép gán biến cấp cao nhất:
gzip_srcs = ["src/test/minigzip.c"],
cc_binary {
name: "gzip",
srcs: gzip_srcs,
shared_libs: ["libz"],
stl: "none",
}
Các biến được giới hạn trong phần còn lại của tệp mà chúng được khai báo, cũng như mọi tệp Bản thiết kế con. Các biến là bất biến, ngoại trừ một trường hợp: chúng có thể được thêm vào bằng một phép gán +=
, nhưng chỉ trước khi chúng được tham chiếu.
Bình luận
Tệp Android.bp
có thể chứa nhận xét nhiều dòng theo kiểu C /* */
và nhận xét một dòng theo kiểu C++ //
.
Toán tử
Bạn có thể thêm chuỗi, danh sách chuỗi và bản đồ bằng toán tử +.
Bạn có thể tính tổng các số nguyên bằng toán tử +
. Việc thêm một bản đồ sẽ tạo ra hợp của các khoá trong cả hai bản đồ, thêm các giá trị của bất kỳ khoá nào có trong cả hai bản đồ.
Mô-đun mặc định
Nhà phát triển có thể sử dụng một mô-đun mặc định để lặp lại các thuộc tính tương tự 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 dựng 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 tương ứng dựa trên nguồn. Ví dụ: có thể có một cc_prebuilt_binary
có 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 chọn phiên bản để đưa vào sản phẩm cuối cùng của mình. 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 được tạo sẵn sẽ quyết định phiên bản nào đượ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 cho phép 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. Nhà phát triển có thể khai báo một không gian tên:
soong_namespace {
imports: ["path/to/otherNamespace1", "path/to/otherNamespace2"],
}
Lưu ý rằng không gian tên không có thuộc tính name
; đườ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
ở thư mục hiện tại hoặc thư mục tổ tiên gần nhất. Nếu không tìm thấy mô-đun soong_namespace
nào như vậy, thì mô-đun đó sẽ được coi là nằm trong không gian tên gốc ngầm ẩn.
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…
- Sau đó, nếu D là một tên đủ điều kiện có dạng
//namespace:module
, thì chỉ không gian tên được chỉ định mới được tìm kiếm theo tên mô-đun được chỉ định. - Nếu không, 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 D trong các không gian tên I1, I2, I3...
- Soong tìm kiếm trong không gian tên gốc.
Điều kiện
Soong không hỗ trợ các điều kiện trong tệp Android.bp
. Thay vào đó, độ phức tạp trong các quy tắc xây dựng đòi hỏi các điều kiện sẽ được xử lý trong Go, nơi có thể sử dụng các tính năng ngôn ngữ cấp cao và các phần phụ thuộc ngầm do các điều kiện đưa ra có thể được theo dõi. Hầu hết các điều kiện đều được chuyển đổi thành một thuộc tính bản đồ, trong đó một trong các giá trị trong bản đồ được chọn và thêm vào các thuộc tính cấp cao nhất.
Ví dụ: để hỗ trợ các tệp dành riêng cho từng cấu trúc:
cc_library {
...
srcs: ["generic.cpp"],
arch: {
arm: {
srcs: ["arm.cpp"],
},
x86: {
srcs: ["x86.cpp"],
},
},
}
Trình định dạng
Soong có một trình định dạng chuẩn cho các tệp Blueprint, tương tự như gofmt. Để định dạng lại đệ quy tất cả các tệp Android.bp
trong thư mục hiện tại, hãy chạy:
bpfmt -w .
Định dạng chuẩn bao gồm thụt lề 4 dấu cách, dòng mới sau mỗi phần tử của danh sách có nhiều phần tử và dấu phẩy ở cuối trong danh sách và bản đồ.