当前位置: 首页 > news >正文

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 文件定义模块。

项目结构
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

构建步骤

  1. 准备环境

    • 确保已经安装了 Android 构建工具(如 lunchm)。
    • 在 Android 源码根目录下运行环境初始化命令:
      source build/envsetup.sh
      
  2. 选择目标平台

    • 使用 lunch 选择构建目标,例如:
      lunch aosp_arm64-userdebug
      
  3. 构建模块

    • 使用 m 命令构建指定模块,例如:
      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 文件,可以让构建流程更加高效和清晰。

相关文章:

  • arxiv论文信息爬取与论文pdf下载
  • C语言——结构体、联合体/共用体、枚举类型、typedef关键字
  • 系统架构设计师—软件工程基础篇—软件开发方法
  • 笔记本电脑本地部署ollama大模型(显存不足调用CUDA Unified Memory方法)
  • AI应用开发 4 - Langchain应用开发
  • JavaWeb后端基础(6)
  • 【网络编程】之TCP实现客户端远程控制服务器端及断线重连
  • 软考高级信息系统项目管理师笔记-第4章信息系统管理
  • 【一些技术成长的思考】
  • 高频Postman接口测试面试题
  • pytorch-gpu版本安装(英伟达gpu驱动安装)
  • VSCode知名主题带毒 安装量900万次
  • Mapmost SDK for WebGL 全新升级——解锁 3DGS 新能力!
  • ThinkPHP使用phpword读取模板word文件并添加表格
  • SparkSQL全之RDD、DF、DS ,UDF、架构、资源划分、sql执行计划、调优......
  • 开放鸿蒙OpenHarmony 5.0.0 Release 兼容性测试实战经验分享
  • 【Vue.js 中的生命周期钩子有哪些?】
  • 探秘基带算法:从原理到5G时代的通信变革【四】Polar 编解码(一)
  • 批量提取 Word 文档中的图片
  • vite创建vue项目
  • 上海市第二十届青少年科技节启动:为期半年,推出百余项活动
  • 马上评|重病老人取款身亡,如何避免类似悲剧?
  • 澎湃与七猫联合启动百万奖金征文,赋能非虚构与现实题材创作
  • 竞彩湃|欧联杯决赛前,曼联、热刺继续划水?
  • 马上评|训斥打骂女儿致死,无暴力应是“管教”底线
  • 圆桌丨新能源车超充技术元年,专家呼吁重视电网承载能力可能面临的结构性挑战