android bp构建编译C++代码

Android BP 编译方式介绍

在 Android 构建系统中,Blueprint(简称 BP)是一种基于 JSON 的构建配置文件格式,代替了传统的 Android.mk 文件。Blueprint 文件的主要扩展名是 .bp,它是 Android 的 Soong 构建系统所使用的配置文件格式。

Blueprint 文件的作用是定义如何编译、链接和打包项目中的组件,例如库(静态库、动态库)、可执行文件、AIDL 文件、资源等。


BP 文件的基本语法

  1. 模块定义

    • 每个模块通常由一个函数调用定义,例如 cc_library_sharedcc_binary 等。
    • 每个模块有自己的属性,用于描述如何构建。
  2. 属性值

    • 属性值通常是字符串、布尔值、列表或者嵌套的结构。
  3. 注释

    • 使用 // 来添加单行注释。

常见模块类型

以下是一些常用模块类型及其用途:

  1. cc_library_shared

    • 用于定义共享库(.so 文件)。
  2. cc_library_static

    • 用于定义静态库(.a 文件)。
  3. cc_binary

    • 用于定义可执行文件。
  4. java_library

    • 用于定义 Java 库。
  5. java_binary

    • 用于定义 Java 的可执行文件(jar 文件)。

BP 文件示例

以下是一个完整的项目示例,展示了如何使用 BP 文件定义模块。

项目结构
plaintext 复制代码
my_project/
├── Android.bp       # 所有模块的配置文件
├── src/
│   ├── main.cpp     # 主程序入口
│   └── utils.cpp    # 工具代码
├── include/
│   └── utils.h      # 公共头文件
├── lib/
│   └── Android.bp   # 静态库的 BP 文件
│   └── helper.cpp   # 静态库实现
│   └── helper.h     # 静态库头文件

Android.bp 示例

顶层 Android.bp
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
bp 复制代码
// 定义静态库
cc_library_static {
    name: "libhelper",
    srcs: ["helper.cpp"],
    cflags: ["-Wall", "-Werror"],
    export_include_dirs: ["."], // 导出 include 目录以供其他模块使用
}

代码文件

src/main.cpp
cpp 复制代码
#include "utils.h"
#include <iostream>

int main() {
    std::cout << "Calling utility function..." << std::endl;
    print_hello();
    return 0;
}
src/utils.cpp
cpp 复制代码
#include "utils.h"
#include <iostream>

void print_hello() {
    std::cout << "Hello from Utils!" << std::endl;
}
include/utils.h
cpp 复制代码
#ifndef UTILS_H
#define UTILS_H

void print_hello();

#endif // UTILS_H
lib/helper.cpp
cpp 复制代码
#include "helper.h"
#include <iostream>

void helper_function() {
    std::cout << "Helper function called!" << std::endl;
}
lib/helper.h
cpp 复制代码
#ifndef HELPER_H
#define HELPER_H

void helper_function();

#endif // HELPER_H

构建步骤

  1. 准备环境

    • 确保已经安装了 Android 构建工具(如 lunchm)。

    • 在 Android 源码根目录下运行环境初始化命令:

      bash 复制代码
      source build/envsetup.sh
  2. 选择目标平台

    • 使用 lunch 选择构建目标,例如:

      bash 复制代码
      lunch aosp_arm64-userdebug
  3. 构建模块

    • 使用 m 命令构建指定模块,例如:

      bash 复制代码
      m my_executable
  4. 运行生成的可执行文件

    • 编译完成后,生成的可执行文件通常位于 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_sharedcc_library_staticcc_binary 等模块类型,可以轻松地构建动态库、静态库和可执行文件。合理地组织项目结构和配置 BP 文件,可以让构建流程更加高效和清晰。

相关推荐
安卓开发者1 小时前
Android RxJava 组合操作符实战:优雅处理多数据源
android·rxjava
星星火柴9361 小时前
关于“双指针法“的总结
数据结构·c++·笔记·学习·算法
阿华的代码王国1 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
一条上岸小咸鱼1 小时前
Kotlin 基本数据类型(三):Booleans、Characters
android·前端·kotlin
Jerry说前后端1 小时前
RecyclerView 性能优化:从原理到实践的深度优化方案
android·前端·性能优化
艾莉丝努力练剑2 小时前
【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
c语言·开发语言·数据结构·c++·学习·算法
alexhilton2 小时前
深入浅出着色器:极坐标系与炫酷环形进度条
android·kotlin·android jetpack
阿巴~阿巴~4 小时前
深入解析C++ STL链表(List)模拟实现
开发语言·c++·链表·stl·list
旺小仔.5 小时前
双指针和codetop复习
数据结构·c++·算法
jingfeng5145 小时前
C++ STL-string类底层实现
前端·c++·算法