devlinux
Bài viết này cung cấp kiến thức chuyên sâu về Android.bp và Soong Build System trong Android Open Source Project (AOSP), bao gồm:
Trong các phiên bản AOSP cũ, Android.mk (dựa trên GNU Make) là công cụ build chính. Tuy nhiên, với sự phát triển của dự án, các hạn chế của Makefile dần lộ rõ:
Để khắc phục, Google đã giới thiệu Soong, một hệ thống build hiện đại, dựa trên Blueprint, giúp:
Android.bp là tệp cấu hình module trong Soong, tương tự như Android.mk nhưng có cú pháp rõ ràng hơn, dạng JSON-like. Các tệp này định nghĩa các bước cần thiết để biên dịch, liên kết, và đóng gói module trong AOSP.
Đặc điểm | Android.mk | Android.bp |
---|---|---|
Cú pháp |
GNU Make | JSON-like (Blueprint DSL) |
Tính dễ đọc |
Khó với dự án lớn | Dễ đọc và dễ hiểu |
Công cụ build |
make | ninja và soong_build |
Khả năng mở rộng |
Giới hạn | Dễ mở rộng |
cc_library_shared {
name: "example_lib",
srcs: ["example.cpp"],
shared_libs: ["libc", "libm"],
include_dirs: ["include"],
}
Giải thích:
Tệp Android.bp được chia thành các module, mỗi module đại diện cho một thành phần trong dự án như thư viện, chương trình thực thi, hoặc tài nguyên.
Trường | Mô tả |
---|---|
name |
Tên module, được sử dụng khi build hoặc liên kết. |
srcs |
Danh sách file nguồn. |
deps |
Các module phụ thuộc. |
include_dirs |
Các thư mục chứa file header cần thiết. |
Cho phép định nghĩa các giá trị chung cho nhiều module.
cc_defaults {
name: "example_defaults",
include_dirs: ["common/include"],
}
cc_binary {
name: "example_binary",
defaults: ["example_defaults"],
srcs: ["main.cpp"],
}
Sử dụng file nhị phân có sẵn thay vì biên dịch.
prebuilt_binary {
name: "prebuilt_tool",
srcs: ["tool_binary"],
}
Biến để tái sử dụng cấu hình.
cc_binary {
name: "example_binary",
srcs: ["main.cpp"],
cflags: ["-DDEBUG"],
}
Để bắt đầu, cần chuẩn bị môi trường và tạo thư mục chứa mã nguồn cho module mới. Di chuyển đến thư mục mã nguồn của Android và hiện các bước sau:
mkdir -p external/helloworld
cd external/helloworld
Viết mã nguồn bằng C++ hoặc Java cho module của bạn. Dưới đây là một ví dụ đơn giản với C++:
hello_world.cpp
#include <iostream>
int main() {
std::cout << "Hello, World!" << std::endl;
return 0;
}
Tạo một tệp Android.bp trong thư mục dự án. Đây là cấu hình build cho module.
Android.bp
cc_binary {
name: "hello_world",
srcs: ["hello_world.cpp"],
}
Tệp trên định nghĩa một binary module hello_world, sử dụng mã nguồn từ hello_world.cpp.
Trước khi build module, cần thiết lập môi trường build của AOSP.
source build/envsetup.sh
lunch aosp_rpi4_car-ap3a-userdebug
Thực hiện build module hello_world bằng lệnh.
m hello_world
Sau khi build thành công, module sẽ được đặt tại vị trí:
out/target/product/<target>/system/bin/hello_world
Log lỗi:
error: cannot find source file: hello_world.cpp
Android.bp
cc_binary {
name: "hello_world",
srcs: ["correct_path/hello_world.cpp"]
}
Log lỗi:
error: undefined reference to `some_function`
Android.bp
cc_binary {
name: "hello_world",
srcs: ["hello_world.cpp"],
shared_libs: ["libdependency"],
}
Log lỗi:
error: Android.bp: invalid field name
devlinux
0 Bình luận