Android之Android.bp文件格式语法(一百八十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀
优质专栏:多媒体系统工程师系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:Android之Android.bp文件格语法。

2.Android.bp介绍

  • Android.bp(Build Configuration File)是Android编译系统中的一种配置文件格式,用于定义模块(Module)及其依赖关系,以及模块的构建配置选项。Android.bp文件是Android编译系统中的核心部分,它替代了之前的Android.mk文件,提供了更加灵活和高效的模块管理方式。
  • Android.bp文件的基本结构如下:
  • 注释:以“//”开头的单行注释,用于说明和描述模块的属性和配置。
  • 包名(Package):模块所属的包名,用于唯一标识一个模块。包名通常包含公司或组织域名的反向拼写,例如:com.example.module。
  • 模块名(Module):模块的名称,用于在包内唯一标识一个模块。模块名通常为小写字母和下划线的组合,例如:my_module。
  • 依赖(Dependencies):模块依赖的其他模块,用于指定模块间的依赖关系。依赖可以分为两种类型:硬件依赖(hard)和软件依赖(soft)。硬件依赖表示模块需要特定硬件才能正常运行,而软件依赖表示模块可以运行在任意硬件上。
  • 特性(Features):模块提供的特性,用于描述模块的功能和特性。特性可以包含多个键值对,例如:features { hardware = “x86”; system-image = “api-level-29”; }上述代码表示该模块支持x86架构,并使用api-level-29的系统镜像。
  • 编译配置(Compile Configuration):模块的编译配置选项,用于指定编译时使用的工具链、编译器选项等。编译配置可以包含多个键值对,例如:cflags += “-Wall -Wextra”; include-dirs += “src/main/cpp”;上述代码表示在编译模块时添加了额外的编译警告,并包含了src/main/cpp目录下的头文件。
  • 源文件(Srcs and Headers):模块的源文件和头文件列表,用于指定模块的编译输入。可以指定单个文件或使用通配符匹配多个文件,例如:srcs = [“main.cpp”, “src/main/cpp/my_file.cpp”]; headers = [“include/my_module.h”];上述代码表示模块的主要源文件为main.cpp和src/main/cpp/my_file.cpp,头文件为include/my_module.h。
  • 编译规则(Compilation Rules):模块的编译规则,用于指定如何编译模块的源文件。编译规则可以包含多个键值对,例如:clang++ { target-os = [“android”, “linux”]; target-arch = [“x86”, “arm64-v8a”]; }上述代码表示模块支持Android和Linux操作系统,以及x86和arm64-v8a架构。
  • 生成文件(Generated Files):模块编译过程中生成的文件,用于指定编译输出。可以指定单个文件或使用通配符匹配多个文件,例如:generated-sources = “src/main/cpp/MyGenerator.java”;上述代码表示编译过程中生成的Java源文件为src/main/cpp/MyGenerator.java。
  • Android.bp文件通过描述模块的依赖关系、特性、编译配置等信息,为Android编译系统提供了更加灵活和高效的模块管理方式。使用Android.bp文件可以简化模块的编译过程,提高编译速度,并减少出错率。随着Android编译系统的不断演进,Android.bp文件格式也将不断完善和优化,以满足日益复杂的Android应用和系统构建需求。

3.Android.bp文件格式模块

Android.bp 文件很简单。它们不包含任何条件语句,也不包含控制流语句;
所有复杂问题都由用 Go 编写的构建逻辑处理。
Android.bp 文件的语法和语义都尽可能与 Bazel BUILD 文件类似。

<1>.模块

Android.bp 文件中的模块以模块类型开头,后跟一组 name: “value”, 格式的属性:

cc_binary {name: "gzip",srcs: ["src/test/minigzip.c"],shared_libs: ["libz"],stl: "none",
}

每个模块都必须具有 name 属性,并且相应值在所有 name 文件中必须是唯一的,仅有两个例外情况是命名空间和预构建模块中的 Android.bp 属性值,这两个值可能会重复。

srcs 属性以字符串列表的形式指定用于构建模块的源文件。您可以使用模块引用语法 “:” 来引用生成源文件的其他模块的输出,如 genrule 或 filegroup。

<2>.类型

变量和属性是强类型,变量根据第一项赋值动态变化,属性由模块类型静态设置。支持的类型为:布尔值(true 或 false)
整数 (int)
字符串 ("string")
字符串列表 (["string1", "string2"])
映射 ({key1: "value1", key2: ["value2"]})
映射可以包含任何类型的值,包括嵌套映射。列表和映射可能在最后一个值后面有终止逗号。

<3>.Glob

接受文件列表的属性(例如 srcs)也可以采用 glob 模式。
glob 模式可以包含普通的 UNIX 通配符 *,例如 *.java。glob 模式还可以包含单个 ** 通配符作为路径元素,与零个或多个路径元素匹配。
例如,java/**/*.java 同时匹配 java/Main.java 和 java/com/android/Main.java 模式。

<4>.变量

Android.bp 文件可能包含顶级变量赋值:

gzip_srcs = ["src/test/minigzip.c"],
cc_binary {name: "gzip",srcs: gzip_srcs,shared_libs: ["libz"],stl: "none",
}

变量的作用域限定在声明它们的文件的其余部分,以及所有子 Blueprint 文件。变量是不可变的,但有一个例外情况:可以使用 += 赋值将变量附加到别处,但只能在引用它们之前附加。

<5>.注释

Android.bp 文件可以包含 C 样式的多行 /* */ 注释以及 C++ 样式的单行 // 注释。

<6>.运算符

可以使用 + 运算符附加字符串、字符串列表和映射。
可以使用 + 运算符对整数求和。附加映射会生成两个映射中键的并集,并附加在两个映射中都存在的所有键的值。

<7>.条件语句

Soong 不支持 Android.bp 文件中的条件语句。但是,编译规则中需要条件语句的复杂问题将在 Go(在这种语言中,您可以使用高级语言功能,并且可以跟踪条件语句引入的隐式依赖项)中处理。大多数条件语句都会转换为映射属性,其中选择了映射中的某个值并将其附加到顶级属性。

要支持特定于架构的文件,请使用以下命令:

cc_library {...srcs: ["generic.cpp"],arch: {arm: {srcs: ["arm.cpp"],},x86: {srcs: ["x86.cpp"],},},
}

<8>.格式设置工具

Soong 包含一个针对 Blueprint 文件的规范格式设置工具,类似于 gofmt。如需以递归方式重新设置当前目录中所有 Android.bp 文件的格式,运行以下命令:

# bpfmt -w .

规范格式包括缩进四个空格、多元素列表的每个元素后面有换行符,以及列表和映射末尾有英文逗号。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue学习106-120

创建项目p106 router&#xff0c;store和app.vue不用删 清一下router里的路由配置 vant组件库p107 目标&#xff1a;认识第三方vue组件库vant-ui&#xff08;cv战士&#xff09; 封装好了的组件整合在一起就是组件库 http://vant-contrib.gitee.io/vant/v2/#/zh-CN/ vue2用va…

2024.02.13作业

21. c 22. b 23. b 5先出栈意味着1234都在栈内&#xff0c;此时1不能比2&#xff0c;3先出栈 24. b, c, d: 10, 12, 120 25. 2, 5 26. 数组越界&#xff0c;可能出现段错误 27. 0, 41 28. 1, 320 29. *a *b; *b *a - *b; *a - *b; 30. 0x801005&#xff1b;0x8…

计算机设计大赛 深度学习YOLOv5车辆颜色识别检测 - python opencv

文章目录 1 前言2 实现效果3 CNN卷积神经网络4 Yolov56 数据集处理及模型训练5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习YOLOv5车辆颜色识别检测 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0…

Java实现贫困地区人口信息管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 人口信息管理模块2.2 精准扶贫管理模块2.3 特殊群体管理模块2.4 案件信息管理模块2.5 物资补助模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 人口表3.2.2 扶贫表3.2.3 特殊群体表3.2.4 案件表3.2.5 物资补助表 四…

Spring Boot开启SSL/Https进行交互。

为2个springboot工程开启进行SSL进行交互的认证步骤 //哪个犬玩意举报我侵权的? 一、认证步骤 1、 为服务器生成证书 keytool -genkey -v -alias testServer -keyalg RSA -keystore E:\ssl\testServer.p12 -validity 36500 2、 为客户端生成证书 keytool -genkey -v -alias…

幻兽帕鲁连接游戏时提示:Format Error Example: 127.0.0.1:7777 怎么办?

检查你在连接游戏时&#xff0c;输入的内容是否正确&#xff0c;一般格式为&#xff1a;幻兽帕鲁游戏服务器公网IP:8211 例如&#xff0c;你的幻兽帕鲁游戏服务器公网IP为&#xff1a;12.13.14.15&#xff0c;那么&#xff0c;你在连接游戏时需要输入12.13.14.15:8211&#xff…

NARF关键点检测及SAC-IA粗配准

一、生成对应深度图 C #include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/common/io.h> #include <pcl/range_image/range_image.h> #include <pcl/visualization/range_image_visualizer.h>…

动态内存管理:new和delete的底层探索

之前我们在C语言上是学过malloc和calloc还要realloc等函数来在堆上获取相应的内存&#xff0c;但是这些函数是存在缺陷的&#xff0c;今天引入对new和delete的学习&#xff0c;来了解new和delete的底层实现。 首先就是在C中我们为什么要对内存进行区域的分块&#xff1f; 答案…

SpaCy的使用例子总结

当使用Spacy进行自然语言处理时&#xff0c;常见的用例包括文本分词、命名实体识别、词性标注、句法分析等。下面是一些常见的使用例子及相应的代码&#xff1a; 文本分词&#xff08;Tokenization&#xff09;&#xff1a; 将文本划分成单词或标点符号等基本单元。 import …

数据分析 — Pandas 分组聚合

目录 一、函数应用和映射1、apply2、map 二、汇总和描述统计1、计算平均值2、计算中位数3、计算总和4、找到最小值5、找到最大值6、计算标准差7、计算方差8、计算非空值的数量9、生成摘要统计信息10、计算唯一值的频率 三、str 属性1、str.len()2、str.lower() 和 str.upper()3…

【数据结构】单调栈

参考&#xff1a;算法学习笔记(67): 单调栈 单调栈用来查找比当前元素大的第一个元素&#xff08;可以修改成比当前元素小的第一个元素&#xff09; 要注意下方代码中栈中存的是下标不是值 stack<int> stk; // 存的是还没有确定下一个比自身大的元素的元素下标 for (i…

ChatGPT高效提问—prompt实践(漏洞风险分析-重构建议-识别内存泄漏)

ChatGPT高效提问—prompt实践&#xff08;漏洞风险分析-重构建议-识别内存泄漏&#xff09; 1.1 漏洞和风险分析 ChatGPT还可以帮助开发人员预测代码的潜在风险&#xff0c;识别其中的安全漏洞&#xff0c;而不必先运行它&#xff0c;这可以让开发人员及早发现错误&#xff0…

【vscode】在vscode中如何导入自定义包

只需要额外添加这两条语句即可&#xff1a; import os,sys sys.path.append("../..") 需要注意的是&#xff0c;ipynb 文件打开的工作目录是文件本身的路径&#xff0c;而 py 文件打开的工作路径是 vscode 打开的路径。 相比较而言 pycharm 中创建好项目之后并不…

FT2232调试记录(2)

FT2232调试记录 &#xff08;1&#xff09;获取当前连接的FTDI设备通道个数:&#xff08;2&#xff09;获取当前连接的设备通道的信息:&#xff08;3&#xff09;配置SPI的通道:&#xff08;4&#xff09;如何设置GPIO:&#xff08;5&#xff09;DEMO测试&#xff1a; FT2232调…

代码随想录刷题第32天

今天继续贪心算法的学习。第一题是买卖股票的最佳时机https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/description/&#xff0c;题目很唬人&#xff0c;但事实上就是遍历一遍数组&#xff0c;求出所有利润为正的情况加和就行&#xff0c;代码很简单。 clas…

【阅读笔记】空域保边降噪《Side Window Filtering》

1、保边滤波背景 保边滤波器的代表包括双边滤波、引导滤波&#xff0c;但是这类滤波器有一个问题&#xff0c;它们均将待处理的像素点放在了方形滤波窗口的中心。但如果待处理的像素位于图像纹理或者边缘&#xff0c;方形滤波核卷积的处理结果会导致这个边缘变模糊。 基于这个…

揭秘 2024 春晚刘谦魔术——代码还原

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、魔术大概流程 二、代码实现各个步骤 2.1 partition&#xff08;对半撕牌&#xff09; 2.2 bottom&#xff08;将 n 张牌置底…

仿生学是什么,举出一些通俗的应用案例和应用算法?比如蝙蝠和雷达,鸟和飞机,鱼和船属于仿生学吗?灰狼算法、蚁群算法、麻雀算法属于仿生学吗?除了这些案例还有哪些?

问题描述&#xff1a;仿生学是什么&#xff0c;举出一些通俗的应用案例和应用算法&#xff1f;比如蝙蝠和雷达&#xff0c;鸟和飞机&#xff0c;鱼和船属于仿生学吗&#xff1f;灰狼算法、蚁群算法、麻雀算法属于仿生学吗&#xff1f;除了这些案例还有哪些&#xff1f; 问题解…

基于微信小程序的智能社区服务小程序,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

谈谈Lombok的坑

Lombok 是一个 Java 库&#xff0c;通过注解的方式在编译时自动为类生成 getter、setter、equals、hashCode 等方法&#xff0c;以简化代码和提高开发效率。本文主要谈谈代码简化背后的代价。 引入Lombok之前是怎么做的 IDE中添加getter/setter, toString等代码&#xff1a; …