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 文件,可以让构建流程更加高效和清晰。

相关推荐
萌の鱼8 小时前
leetcode 48. 旋转图像
数据结构·c++·算法·leetcode
wanjiazhongqi9 小时前
哈希表和STL —— unorderde_set/unordered_map【复习笔记】
数据结构·c++·哈希算法·散列表
小镇学者9 小时前
【c++】macos查看c++版本号
开发语言·c++
mahuifa9 小时前
C++(Qt)软件调试---Windows 性能分析器WPA(28)
c++·windows·性能分析·wpa·wpr
wuqingshun31415910 小时前
蓝桥杯 团建
c语言·数据结构·c++·算法·蓝桥杯·深度优先
levitgu11 小时前
西电应用密码学与网络安全实验通关指南
c++·经验分享·安全·ai·密码学·rsa·实验
tkokof111 小时前
崩溃(Crash)简记
数据结构·c++·ue5·ue4·crash
程序员架构笔记11 小时前
15. C++多线程编程-网络编程-GUI编程(如Qt)学习建议
c++
胖虎111 小时前
Android 布局系列(五):GridLayout 网格布局的使用
android·网格布局·安卓布局·gridlayout
原来是猿12 小时前
蓝桥备赛(六)- C/C++输入输出
c语言·开发语言·c++