android bp构建编译C++代码
Android BP 编译方式介绍
在 Android 构建系统中,Blueprint
(简称 BP)是一种基于 JSON 的构建配置文件格式,代替了传统的 Android.mk
文件。Blueprint
文件的主要扩展名是 .bp
,它是 Android 的 Soong 构建系统所使用的配置文件格式。
Blueprint
文件的作用是定义如何编译、链接和打包项目中的组件,例如库(静态库、动态库)、可执行文件、AIDL 文件、资源等。
BP 文件的基本语法
-
模块定义:
- 每个模块通常由一个函数调用定义,例如
cc_library_shared
、cc_binary
等。 - 每个模块有自己的属性,用于描述如何构建。
- 每个模块通常由一个函数调用定义,例如
-
属性值:
- 属性值通常是字符串、布尔值、列表或者嵌套的结构。
-
注释:
- 使用
//
来添加单行注释。
- 使用
常见模块类型
以下是一些常用模块类型及其用途:
-
cc_library_shared
:- 用于定义共享库(
.so
文件)。
- 用于定义共享库(
-
cc_library_static
:- 用于定义静态库(
.a
文件)。
- 用于定义静态库(
-
cc_binary
:- 用于定义可执行文件。
-
java_library
:- 用于定义 Java 库。
-
java_binary
:- 用于定义 Java 的可执行文件(
jar
文件)。
- 用于定义 Java 的可执行文件(
BP 文件示例
以下是一个完整的项目示例,展示了如何使用 BP 文件定义模块。
项目结构
my_project/
├── Android.bp # 所有模块的配置文件
├── src/
│ ├── main.cpp # 主程序入口
│ └── utils.cpp # 工具代码
├── include/
│ └── utils.h # 公共头文件
├── lib/
│ └── Android.bp # 静态库的 BP 文件
│ └── helper.cpp # 静态库实现
│ └── helper.h # 静态库头文件
Android.bp 示例
顶层 Android.bp
// 定义共享库
cc_library_shared {
name: "my_shared_lib",
srcs: ["src/utils.cpp"],
include_dirs: ["include"],
// 编译选项
cflags: ["-Wall", "-Werror"],
shared_libs: ["libhelper"], // 依赖的共享库
}
// 定义可执行文件
cc_binary {
name: "my_executable",
srcs: ["src/main.cpp"],
include_dirs: ["include"],
// 链接所需的库
shared_libs: ["my_shared_lib"], // 依赖的共享库
static_libs: ["libhelper"], // 依赖的静态库
}
lib/Android.bp
// 定义静态库
cc_library_static {
name: "libhelper",
srcs: ["helper.cpp"],
cflags: ["-Wall", "-Werror"],
export_include_dirs: ["."], // 导出 include 目录以供其他模块使用
}
代码文件
src/main.cpp
#include "utils.h"
#include <iostream>
int main() {
std::cout << "Calling utility function..." << std::endl;
print_hello();
return 0;
}
src/utils.cpp
#include "utils.h"
#include <iostream>
void print_hello() {
std::cout << "Hello from Utils!" << std::endl;
}
include/utils.h
#ifndef UTILS_H
#define UTILS_H
void print_hello();
#endif // UTILS_H
lib/helper.cpp
#include "helper.h"
#include <iostream>
void helper_function() {
std::cout << "Helper function called!" << std::endl;
}
lib/helper.h
#ifndef HELPER_H
#define HELPER_H
void helper_function();
#endif // HELPER_H
构建步骤
-
准备环境:
- 确保已经安装了 Android 构建工具(如
lunch
和m
)。 - 在 Android 源码根目录下运行环境初始化命令:
source build/envsetup.sh
- 确保已经安装了 Android 构建工具(如
-
选择目标平台:
- 使用
lunch
选择构建目标,例如:lunch aosp_arm64-userdebug
- 使用
-
构建模块:
- 使用
m
命令构建指定模块,例如:m my_executable
- 使用
-
运行生成的可执行文件:
- 编译完成后,生成的可执行文件通常位于
out/target/product/<platform>/system/bin/
目录下。
- 编译完成后,生成的可执行文件通常位于
重要属性说明
-
name
:
模块的名称,必须唯一。 -
srcs
:
模块的源文件列表。 -
include_dirs
:
指定头文件目录。 -
shared_libs
:
指定模块所依赖的共享库。 -
static_libs
:
指定模块所依赖的静态库。 -
cflags
:
指定编译时的 C/C++ 标志。 -
export_include_dirs
:
导出头文件目录,供其他模块使用。
总结
通过使用 Android 的 BP 文件(Android.bp
),可以方便地定义模块及其依赖关系。使用 cc_library_shared
、cc_library_static
和 cc_binary
等模块类型,可以轻松地构建动态库、静态库和可执行文件。合理地组织项目结构和配置 BP 文件,可以让构建流程更加高效和清晰。