安卓bp文件详解

概念

Android.bp文件是安卓构建系统(Android Build System)中使用的构建描述文件,它用于定义Android项目中的模块、库、应用等构建规则,该文件使用 Blueprint 语言,是 Soong 构建系统的一部分。
Soong则是专为Android编译而设计的工具,Blueprint只是解析文件的形式,而Soong则解释内容的含义,最终转换成Ninja文件。Android.bp文件用类似JSON的简洁声明来描述需要构建的模块。
Android.bp的出现就是为了替换Android.mk文件。bp跟mk文件不同,它是纯粹的配置,没有分支、循环等流程控制,不能做算数逻辑运算。如果需要控制逻辑,那么只能通过Go语言编写。
Android.mk可以引用Android.bp中的模块,反之Android.bp不能引用Android.mk中的模块。
Android.bp 文件首先是 Android 系统的一种编译配置文件,是用来代替原来的 Android.mk文件的。在 Android7.0 以前,Android都是使用make来组织各模块的编译,对应的编译配置文件就是Android.mk。
在 Android7.0 开始,Google 引入了 ninja 和 kati 来编译,为啥引入ninja因为随着 Android 越来越庞大,module 越来越多,编译时间也越来越久,而使用 ninja 在编译的并发处理上较 make 有很大的提升。Ninja 的配置文件就是Android.bp,Android 系统使用 Blueprint 和 Soong 工具来解析 Android.bp 转换生成 ninja文件。为了兼容老的 mk 配置文件,Android 当初也开发了 Kati 工具来转换 mk 文件生成ninja。

1.1 Ninja
ninja是一个编译框架,会根据相应的ninja格式的配置文件进行编译,但是ninja文件一般不会手动修改,而是通过将Android.bp文件转换成ninja格文件来编译。

1.2 Android.bp
Android.bp的出现就是为了替换Android.mk文件。bp跟mk文件不同,它是纯粹的配置,没有分支、循环等流程控制,不能做算数逻辑运算。如果需要控制逻辑,那么只能通过Go语言编写。

1.3 Soong
Soong类似于之前的Makefile编译系统的核心,负责提供Android.bp语义解析,并将之转换成Ninja文件。Soong还会编译生成一个androidmk命令,用于将Android.mk文件转换为Android.bp文件,不过这个转换功能仅限于没有分支、循环等流程控制的Android.mk才有效。

1.4 Blueprint
Blueprint是生成、解析Android.bp的工具,是Soong的一部分。Soong负责Android编译而设计的工具,而Blueprint只是解析文件格式,Soong解析内容的具体含义。Blueprint和Soong都是由Golang写的项目,从Android 7.0,prebuilts/go/目录下新增Golang所需的运行环境,在编译时使用。

1.5 Kati
kati是专为Android开发的一个基于Golang和C++的工具,主要功能是把Android中的Android.mk文件转换成Ninja文件。代码路径是build/kati/,编译后的产物是ckati。

Android.bp的主要作用

模块定义
Android.bp 文件用于定义 Android 项目中的模块,这些模块可以是共享库、可执行文件、静态库等。每个模块都有其自己的属性和规则,用于描述模块的构建过程和依赖关系。

依赖关系
在 Android.bp 文件中,你可以指定一个模块依赖于其他模块,定义了模块之间的依赖关系。这包括依赖于其他库、系统库、源代码文件等。

构建规则
通过 Android.bp 文件,你可以指定模块的构建规则,包括编译选项、链接选项、源文件列表等。这使得开发者可以配置模块的构建过程。

模块属性
对每个模块,你可以定义一系列属性,这些属性包括模块的名称、类型、源文件列表、编译选项、依赖项等。这些属性在构建过程中用于指导构建系统。

插件支持
Android.bp 文件支持插件,这使得开发者可以自定义构建规则,添加额外的构建步骤或其他功能。

模块的可配置性
通过 Android.bp 文件,你可以定义模块的可配置属性,允许构建系统在不同的场景或设备上使用不同的配置。
在整个 Android 构建系统中,Android.bp 文件是非常重要的一部分,它提供了一种灵活且可扩展的方式来定义和配置 Android 项目的构建过程。这样的设计使得 Android 构建系统能够适应不同的硬件、设备和项目需求。

Android.mk 文件转换成 Android.bp

一.在工程源码中:
1.source build/envsetup.sh
2.lunch  xxx 
3.make  androidmk 

生成androidmk转换工具,路径为:/out/soong/host/linux-x86/bin/androidmk

二.直接把你要转换的Android.mk 文件放置到此目录下,然后执行命令:
androidmk   Android.mk  >  Android.bp

编译不同类型的模块

1.1、编译成Java库
会把aidl java 等文件编译成 .jar 库

Android.mk
include $(BUILD_JAVA_LIBRARY)

Android.bp
java_library {
......
}
1.2、编译成Java静态库
Android.mk
include $(BUILD_STATIC_JAVA_LIBRARY)

Android.bp
java_library_static {
......
}
1.3、编译成App应用
Android.mk
include $(BUILD_PACKAGE)

Android.bp
android_app {
......
}
1.4、编译成Native动态库
Android.mk
include $(BUILD_SHARED_LIBRARY)

Android.bp
cc_library_shared {
......
}
1.5、编译成Native静态库
Android.mk
include $(BUILD_STATIC_LIBRARY)

Android.bp
cc_library_static {
......
}
1.6、编译成Native执行程序
Android.mk
include $(BUILD_EXECUTABLE)

Android.bp
cc_binary {
......
}
1.7、编译成头文件库
Android.mk
include $(BUILD_HEADER_LIBRARY)

Android.bp
cc_library_headers {
......
}

文件路径

2.1、本地头文件路径
Android.mk
LOCAL_C_INCLUDES := 

Android.bp
local_include_dirs: ["xxx", ...]
2.2、导出的头文件路径
Android.mk
LOCAL_EXPORT_C_INCLUDE_DIRS := 

Android.bp
export_include_dirs: ["xxx", ...]
2.3、资源文件路径
Android.mk
LOCAL_RESOURCE_DIR := 

Android.bp
resource_dirs: ["xxx", ...]

库依赖

3.1、依赖的静态库
Android.mk
LOCAL_STATIC_LIBRARIES := 

Android.bp
static_libs: ["xxx", "xxx", ...]
3.2、依赖的动态库
Android.mk
LOCAL_SHARED_LIBRARIES := 

Android.bp
shared_libs: ["xxx", "xxx", ...]
3.3、依赖的头文件库
Android.mk
LOCAL_HEADER_LIBRARIES := 

Android.bp
header_libs: ["xxx", "xxx", ...]
3.4、依赖的Java库
Android.mk
LOCAL_STATIC_JAVA_LIBRARIES := 

Android.bp
static_libs: ["xxx", "xxx", ...]

安装到不同分区中

4.1、安装到vendor中
Android.mk
LOCAL_VENDOR_MODULE := true
        or
LOCAL_PROPRIETARY_MODULE := true

Android.bp
proprietary: true
    or
vendor: true

⚠️ 注意:
LOCAL_PROPRIETARY_MODUL,true控制生成路径到vendor/lib,false就是system/lib LOCAL_CLANG,clang:true来指定默认编译器为Clang,Android 8.0后不需要指定,默认是Clang
4.2、安装到product中
Android.mk
LOCAL_PRODUCT_MODULE := true

Android.bp
product_specific: true
4.3、安装到odm中
Android.mk
LOCAL_ODM_MODULE := true

Android.bp
device_specific: true

编译参数

5.1、C flags
Android.mk
LOCAL_CFLAGS := 

Android.bp
cflags: ["xxx", "xxx", ...]
5.2、Cpp flags
Android.mk
LOCAL_CPPFLAGS := 

Android.bp
cppflags: ["xxx", "xxx", ...]
5.3、Java flags
Android.mk
LOCAL_JAVACFLAGS := 

Android.bp
javacflags: ["xxx", "xxx", ...]

语法

Android.bp 文件是 Soong 构建系统中的构建描述文件,用于配置 Android 项目的构建规则。以下是 Android.bp 文件的主要语法要点:
模块类型定义:
使用 module_type 字段指定模块的类型,例如 module_type: “android_library” 或 module_type: “android_app”。
模块名定义:
使用 name 字段指定模块的名称,例如 name: “MyLibrary”。
模块属性:
使用各种字段来定义模块的属性,例如 srcs(源文件列表)、cflags(编译选项)、include_dirs(包含目录)等。
例如:

默认属性集:
使用 defaults 字段引用一个默认属性集,以便继承一组默认的属性。例如:

模块依赖关系:
使用 deps 字段指定模块的依赖关系,即依赖于其他模块。例如:

可选依赖关系:
使用 optional_uses_libs 字段指定可选的依赖关系。例如:

构建配置块:
使用 build 字段定义一个构建配置块,其中可以包含 target、host 或 device 等不同配置。例如:

构建工具配置:
使用 tool 字段配置构建过程中使用的工具。例如:

标记特定模块属性:
使用 tags 字段给模块打标签,以便在其他模块中引用。例如:

架构相关配置:
使用 arch 字段指定特定的架构相关配置。例如:

变量和函数:
可以使用变量和函数来简化配置。例如:

命名空间:

使用 namespace 字段来定义一个命名空间,将一组模块组织在同一个命名空间下。例如:

模块分隔:
使用 group 字段将一组模块组织在同一个分组中,以便对它们应用相同的配置。例如:

源文件通配符:
使用通配符指定源文件,例如 srcs: [“src/**/*.c”],表示匹配 src 目录及其所有子目录下的所有 .c 文件。

条件语句:
使用条件语句来根据不同的条件执行不同的配置。例如:

标签过滤:
使用 required 和 host_required 字段指定模块的标签过滤条件。例如:

模块替代:
使用 overrides 字段指定被当前模块替代的其他模块。例如:

私有模块属性:
使用 private 字段指定私有属性,这些属性只能在同一 Android.bp 文件中的其他属性块中使用。例如:

自动生成的源文件:
使用 generated_sources 字段指定由构建系统自动生成的源文件。例如:

构建工具:
使用 tool 字段指定使用的构建工具及其配置。例如:

这些语法要点提供了 Android.bp 文件中一些常见的配置选项和结构。要了解更多详细信息,可以查阅官方 Soong 构建系统文档,该文档提供了全面的语法和配置选项说明,以及更多实际的示例。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/449976.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue+elementUI用户修改密码的前端验证

用户登录后修改密码,密码需要一定的验证规则。旧密码后端验证是否正确;前端验证新密码的规范性,新密码规范为:6-16位,至少含数字/字母/特殊字符中的两种;确认密码只需要验证与新密码是否一致; 弹…

VMware17.5.1导入x.ova格式虚拟机

1、用的是2024年2月发布的VMware17.5.1 pro、导入的是VisualBox制作的ova。 2、VMware导入ova后,能正常进入虚拟机,并正常运行。 3、注意导入过程中会提示一个选择窗口,务必要点击“重试”,不要点击取消。

【JAVA重要知识 | 第七篇】Java异常知识总结(声明、抛出、捕获异常)

7.Java异常知识总结(声明、抛出、捕获异常) 7.1异常定义 在程序运行过程中,如果JVM检测出一个不可能执行的操作时,就会出现运行时错误(runtime error)。在Java中,运行时错误会作为异常抛出。异…

Power Apps 学习笔记 -- Action

文章目录 1. Action 简介2. Action 配置3. 待补充 1. Action 简介 Action基础教程 : Action概述 操作Action: 1. 操作Action类似于工作流Workflow,提供一些重用性的操作,允许工作流或其他Web服务端点调用(例如javascript). 2. Action 类似于c#当中的一个…

【电路笔记】-晶体管作为开关

晶体管作为开关 文章目录 晶体管作为开关1、概述2、截止区域3、饱和区域4、示例5、晶体管开关类型及应用5.1 数字逻辑晶体管开关5.2 PNP晶体管开关5.3 达林顿晶体管开关6、总结1、概述 晶体管开关可用于通过使用处于饱和或截止状态的晶体管来打开或关闭低压直流设备(例如 LED…

基于PLC的轨检小车控制器设计

摘要: 本文提出了轨道检测车的总体设计方案,首先设计出轨检车总体结构,轨检车主要结构有纵梁、横梁、行走机构、导向机构、支撑架、控制计算机、电机等组成。接着对电机进行选型,选择合适的步进电机及与其相匹配的驱动器来给轨检…

web端功能测试

web端功能测试 web项目环境说明环境的定义环境(服务器)的组成面试题:你们公司有几套环境 熟悉商城项目信息来源商城项目的核心业务商城项目的核心功能模块 测试流程的应用01需求评审02计划编写03设计用例04用例执行05缺陷管理06测试报告 商城项目测试01发货业务02评…

【CV论文阅读】【计算机视觉中的Transformer应用综述】(1)

0.论文摘要 摘要——自然语言任务的Transformer model模型的惊人结果引起了视觉社区的兴趣,以研究它们在计算机视觉问题中的应用。在它们的显著优点中,与递归网络例如长短期记忆(LSTM)相比,Transformer能够模拟输入序…

基于ACM32 MCU的两轮车充电桩方案介绍,有利于打造高效安全的电池管理

随着城市化进程的加快、人们生活水平的提高和节能环保理念的普及,越来越多的人选择了电动车作为代步工具,而两轮电动车的出行半径较短,需要频繁充电,因此在城市中设置两轮车充电桩就非常有必要了。城市中的充电桩不仅能解决两轮车…

二叉搜索树迭代器

题目链接 二叉搜索树迭代器 题目描述 注意点 初始指向根节点next()指向中序遍历中的下一个节点 解答思路 先中序遍历将节点存储到队列中,根据队列先进先出的特点,在调用next()方法时,返回队尾对应的节点并弹出即可 代码 class BSTIter…

SQLiteC/C++接口详细介绍-sqlite3类(一)

上一篇:SQLiteC/C接口简介 下一篇:SQLiteC/C接口详细介绍(二) 引言: SQLite C/C 数据库接口是一个流行的SQLite库使用形式,它允许开发者在C和C代码中嵌入 SQLite 基本功能的解决方案。通过 SQLite C/C 数据…

项目案例:多标签文本分类技术在司法行业的应用与挑战

一、引言 随着法律案件数量的激增以及对案件信息快速准确处理的需求日益迫切,司法行业对多标签文本分类技术的应用需求日益增长。本文将介绍多标签文本分类技术在司法行业的具体应用案例,探讨其如何助力法律专业人士处理繁杂的案件资料,优化…

pycharm全局搜索时切换到了繁体和出现乱码的解决方案

看别人代码过程中免不了使用全局 搜索 按照往常 “CtrlShiftF”进行全局搜索即可 但是第一次出现了繁体字,后面还出现乱码的情况了! 1.繁体字解决方案 所以在 “设置-时间和语言-输入法选项-拼音选项-按键快捷键” 中修改 1.设置 2. 时间和语言 3.输…

Spring Cloud集成nacos配置中心

1.添加Nacos Config依赖 打开nacos-config-demo的pom.xml文件并添加以下两个依赖项 项目的配置文件中通常包括数据库连接配置项、日志输出配置项、Redis连接配置项、服务注册配置项等内容,如spring-cloud-alibaba-nacos-config-base-demo项目中就包含数据库连接配置…

Node.js作用

Node.js可以开发应用 开发服务器应用 开发工具类应用 开发桌面端应用

电脑怎样改变ip地址?三种方法任你选

更改电脑的IP地址是一个常见的需求,有时候我们可能需要调整网络设置以解决连接问题或保护隐私等。那么,电脑怎样改变ip地址?以下是几种简单快捷的方法任你选。 一、通过控制面板更改IP地址 在Windows操作系统中,可以通过控制面板…

代码生成器之如何快速生成后端接口?

前言 在现代软件开发中,重复性的增删改查逻辑代码的编写往往非常耗时且容易出错。为了提高开发效率,减少手动维护的成本,代码生成器就成为了一个非常重要的工具,本文小编就将为大家介绍一下如何利用一个开源项目快速生成数据接口…

vulhub中Weblogic SSRF漏洞复现

Weblogic中存在一个SSRF漏洞,利用该漏洞可以发送任意HTTP请求,进而攻击内网中redis、fastcgi等脆弱组件。 访问http://your-ip:7001/uddiexplorer/,无需登录即可查看uddiexplorer应用。 SSRF漏洞测试 SSRF漏洞存在于http://your-ip:7001/ud…

如何利用WebRTC构建点对点的即时通讯工具

在当今竞争激烈的商业环境中,企业越来越需要构建自己的即时通讯工具来提升内部沟通效率和信息安全,减少第三方工具依赖带来的潜在风险,并能与自身的行业业务深入融合。 拥有专用的通讯平台能够加快信息的流动,提升工作协同和任务执…

傅里叶变换算法和Python代码实现

傅立叶变换是物理学家、数学家、工程师和计算机科学家常用的最有用的工具之一。本篇文章我们将使用Python来实现一个连续函数的傅立叶变换。 我们使用以下定义来表示傅立叶变换及其逆变换。 设 f: ℝ → ℂ 是一个既可积又可平方积分的复值函数。那么它的傅立叶变换&#xff…