Android 安卓 Soong构建系统——Blueprint Android.bp配置文件解析
文章目录
- Android.bp起源
- Android.bp文件结构
- 如何编写Android.bp文件
- 实例详解
- 实例1
- 实例2
- 常见问题解答
- 1. 如何确定使用哪种模块类型?
- 2. 如何指定模块的依赖项?
- 其他疑问可参考官方文档
参考文章:Android.bp 语法和使用

Android.bp起源
早期的Android系统采用的是Makefile(Android.mk)作为其构建系统。这是一种广泛应用于Unix和Linux环境中的构建工具,它依赖于一系列以文本形式编写的指令(称为Makefiles)来自动构建程序。
然而,随着Android项目的规模逐渐扩大,Makefile开始显得不够灵活,而且构建速度相对较慢。特别是在处理复杂的依赖关系和条件编译时,Makefile的语法也显得过于复杂和笨重。
因此,Google决定开发一个新的构建系统——Soong,它使用Go语言编写,专门针对Android项目进行了优化。Soong引入了一种新的配置文件格式:Blueprint,即我们现在所说的Android.bp。
Android.bp是Blueprint配置文件的一种特殊形式,专门用于定义Android源代码树中的构建目标。Blueprint最初是由Google为其Soong构建系统开发的,并在Android Nougat(7.0)版本中首次引入。
Blueprint的设计理念是简单、易读、易写,它基于声明式语法,只需要描述要做什么,而不需要指定如何做。这使得配置文件更加简洁,便于开发者理解和维护。
Android.bp文件采用类似JSON的语法,但更为简洁。它主要包括模块类型、模块名称和模块属性等部分,用于定义如何构建一个模块。
自从引入Android.bp文件以来,Android的构建过程已经变得更加简单和高效。Android.bp提供了一种灵活的方式来配置构建参数,支持各种不同类型的构建目标,如二进制文件、库文件、测试用例等。
同时,由于Android.bp文件的语法简单明了,新手开发者也能快速上手。对于大型项目来说,使用Android.bp可以显著提升构建性能,减少构建时间,提高开发效率。
Android.bp文件结构
Android.bp文件通常包含以下部分:
-
模块类型:如
cc_binary,cc_library等,定义了模块的类型。 -
模块名称:通过
name字段定义,是模块的唯一标识。 -
模块属性:这些属性可用于控制模块的构建行为。例如,
srcs属性指定了源代码文件,deps属性则指定了模块的依赖项。
如何编写Android.bp文件
一个基本的Android.bp文件可能看起来像这样:
cc_binary {name: "my_module",srcs: ["my_module.c"],deps: ["my_dependency"],
}
在这个例子中,cc_binary是模块类型,表示要构建的是一个C/C++可执行文件。name属性定义了模块名称,srcs属性指定了源代码文件,而deps属性则列出了依赖的模块。
实例详解
实例1
下面是一个更复杂的Android.bp文件示例,它涵盖了更多模块属性:
cc_library {name: "libmylibrary",srcs: ["my_file.cpp"],cflags: ["-Wall", "-Werror"],export_include_dirs: ["include"],static_libs: ["libmystaticlib"],shared_libs: ["libmysharedlib"],
}
在这个例子中,cflags属性用于指定编译器标志,export_include_dirs属性定义了其他模块可以访问的头文件目录,而static_libs和shared_libs属性则分别列出了静态库和共享库的依赖项。
实例2
//
// Copyright (C) 2008 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//// This makefile supplies the rules for building a library of JNI code for
// use by our example of how to bundle a shared library with an APK.package {default_applicable_licenses: ["Android-Apache-2.0"],
}cc_library_shared {name: "libsimplejni",// All of the source files that we will compile.srcs: ["native.cpp"],// All of the shared libraries we link against.shared_libs: ["liblog"],// No static libraries.static_libs: [],cflags: ["-Wall","-Werror",],header_libs: ["jni_headers"],stl: "none",sdk_version: "current",
}
这是一个用于构建 Android 平台上 JNI (Java Native Interface) 代码库的 android.bp 文件。Android.bp 是 Android 的构建系统 Soong 使用的脚本语言,用于描述如何构建源代码。
以下是各个部分的解读:
-
Copyright和License部分:此部分指定了此文件的版权信息和许可证信息,说明该文件遵循 Apache License 2.0 许可证。 -
package部分:此处指定了默认适用的许可证,即 Android-Apache-2.0。 -
cc_library_shared部分:定义了一个名为 “libsimplejni” 的共享 C/C++ 库。-
name: "libsimplejni":定义了库的名称为 libsimplejni。 -
srcs: ["native.cpp"]:要编译的源文件列表,这里只有一个文件 “native.cpp”。 -
shared_libs: ["liblog"]:要链接的共享库列表,这里只链接了一个名为 “liblog” 的库。 -
static_libs: []:静态库列表为空,表示没有需要链接的静态库。 -
cflags: ["-Wall", "-Werror"]:要传递给 C/C++ 编译器的选项,“-Wall” 开启所有警告,“-Werror” 将所有警告视为错误。 -
header_libs: ["jni_headers"]:头文件库列表,包含了 “jni_headers”。 -
stl: "none":指定不使用任何 STL (Standard Template Library) 库。 -
sdk_version: "current":指定了 SDK 版本为当前版本。
-
常见问题解答
1. 如何确定使用哪种模块类型?
模块类型取决于你要构建的项目。例如,如果你正在构建一个C/C++的可执行文件,应该使用cc_binary;如果你正在构建一个Java库,应该使用java_library。
2. 如何指定模块的依赖项?
你可以在deps属性中列出所有直接依赖的模块名称。Soong构建系统将自动处理这些依赖项,并确保在构建当前模块之前先构建它们。
其他疑问可参考官方文档
Android官方文档
相关文章:
Android 安卓 Soong构建系统——Blueprint Android.bp配置文件解析
文章目录 Android.bp起源Android.bp文件结构如何编写Android.bp文件实例详解实例1实例2 常见问题解答1. 如何确定使用哪种模块类型?2. 如何指定模块的依赖项?其他疑问可参考官方文档 参考文章:Android.bp 语法和使用 Android.bp起源 早期的A…...
【Redis】SSM整合Redis注解式缓存的使用
【Redis】SSM整合Redis&注解式缓存的使用 一、SSM整合Redis1.2.配置文件spring-redis.xml1.3.修改applicationContext.xml1.4.配置redis的key生成策略 二、Redis的注解式开发及应用场景2.1.什么是Redis注解式2.实列测试 三、Redis中的击穿、穿透、雪崩的三种场景 一、SSM整…...
lua中的循环 while、for、repeat until三种循环方式、pairs和ipairs区别
lua中的循环 while、for、repeat until三种循环方式、pairs和ipairs区别 介绍for循环参数ipairs和pairs whilerepeat until总结 介绍 这里我用while、for、repeat until分别输出1-20之间的奇数 ,具体的语法可以看下面的代码 for循环 参数 定义一个初始值为start…...
Linux 进程的管道通信
文章目录 无名管道pipe有名管道 进程之间的通信:Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间。任何一个进程的全局变量在另外一个进程中都看不到,所以进程之间不能相互访问,要交换数据必须通过…...
OpenGL和Vulkan比较
比较 见参考 参考 Reference GuidesCopyright 2022-2023 The Khronos Group Inc. :: Vulkan Documentation ProjectDifference Between OpenGL vs VulkanVulkan与OpenGL对比——Vulkan的全新渲染架构 图形程序接口:OpenGL、OpenCL、Vulkan、OpenGL ES、WebGL…...
OpenCV入门3:像素操作
在OpenCV中,图像的像素值是以一个多维数组的形式表示的。上一篇已经介绍了cv::Mat类。对于图像中的每一个像素,可以通过Mat对象中的at<type>(i,j)函数(type可以是uchar、int等)获得Mat对象的像素值。 访问像素值࿱…...
使用内网穿透工具,远程测试本地接口
学习目标: 目标 含义: 内网穿透工具是一种能够帮助没有公网IP或者动态IP用户进行远程访问内网应用的工具。通过内网穿透,用户无论身处任何网络环境,都可以方便地访问企业内部的ERP、OA、CRM等应用。内网穿透工具还支持默认的Htt…...
uniapp小程序才到第五层就报错navigateto:fail webview count limit exceed
错误截图 原因 小程序官方描述是说可以跳转10层,但是使用uniapp开发的程序在小程序中才运行到第五层就报错了,原因是因为没有设置appId。如果设置了就正常了。...
【C++】map set
map & set 一、关联式容器二、键值对三、树形结构的关联式容器1. set(1)set 的介绍(2)set 的使用 2. multiset3. map(1)map 的介绍(2)map 的使用 4. multimap 四、map 和 set 的…...
正点原子嵌入式linux驱动开发——Linux Regmap驱动
在前面学习I2C和SPI驱动的时候,针对I2C和SPI设备寄存器的操作都是通过相关的API函数进行操作的。这样Linux内核中就会充斥着大量的重复、冗余代码,但是这些本质上都是对寄存器的操作,所以为了方便内核开发人员统一访问I2C/SPI设备的时候&…...
京东商品详情API,页面信息采集,优惠券信息获取
京东开放平台提供了API接口来访问京东商品详情。通过这个接口,您可以获取到商品的详细信息,如商品名称、价格、库存量、描述等。额外还附加一个优惠券信息接口。代码如下: 京东获得JD商品详情 API 优惠券接口 公共参数 名称类型必须描述keyString是调…...
Visual Studio 2022 + OpenCV 4.5.2 安装与配置教程
目录 OpenCV的下载与配置Visual Studio 2022的配置新建工程新建文件新建项目属性表环境配置测试先写一个输出将OpenCV的动态链接库添加到项目的 x64 | Debug下测试配置效果 Other OpenCV的下载与配置 参考这个OpenCV的下载与环境变量的配置: Windows10CLionOpenCV4…...
docker 安装 mysql (单体架构)
文章归档:https://www.yuque.com/u27599042/coding_star/nckzqa73g47hgz3x 查询 MySQL 镜像 docker search mysql拉取 MySQL 镜像 docker pull mysql在宿主机创建映射目录 mkdir -p \ /home/docker/mysql/log \ /home/docker/mysql/data \ /home/docker/mysql/co…...
城市内涝怎么预警?万宾科技内涝积水监测仪
在城市运行过程中,城市内涝问题频繁出现,影响城市管理水平的提升,也会进一步减缓城市基础设施建设。尤其近几年来,城市内涝灾害频繁出现,在沿海地区内涝所带来的安全隐患成为城市应急管理部门的心头大患。城市内涝的背…...
Spring基础(2):放弃XML,走向注解
上一篇并没有实际地带大家去看源码,而是介绍了两个概念: BeanDefinitionBeanPostProcessor 当然,我介绍得非常笼统,不论是BeanDefinition还是BeanPostProcessor其实都有着较为复杂的继承体系,种类也很多。作为Spring…...
【线性代数】分块矩阵总结
...
Redis-命令操作Redis->redis简介,redis的安装(Linux版本windows版本),redis的命令
redis简介redis的安装(Linux版本&windows版本)redis的命令 1.redis简介 Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。 它支持字符串、哈…...
17、Python虚拟环境:为何要用虚拟环境、如何使用virtualenv
文章目录 在Python开发中,虚拟环境是一个独立的目录树,可以在其中安装Python模块。每个虚拟环境都有自己的Python二进制文件和一组安装的库。使用虚拟环境的主要原因是为了避免项目间的依赖冲突,允许每个项目有其特定的依赖,而不影响全局安装的模块。 为何要用虚拟环境 依…...
elasticSearch 接口实现查询热词统计
前面讲过使用elasticsearch可视化工具可以直接写语法查询如下: GET robot-demand/_search { "size":10, //查询多少条数据 "aggs":{ "hot_words":{ "terms":{ "field": "title" } }…...
10年测试经验分享:新手如何找到适合自己的软件测试项目?
每一个测试新手(特别是自学测试的人)来说,往往不知道到哪里去找项目练手,这应该是最大的困扰了。 实话讲,这个目前没有非常好的、直接的解决办法,不过在这我可以结合我自己之前的一些工作经历,…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化
iOS 应用的发布流程一直是开发链路中最“苹果味”的环节:强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说,这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发(例如 Flutter、React Na…...
LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》
🧠 LangChain 中 TextSplitter 的使用详解:从基础到进阶(附代码) 一、前言 在处理大规模文本数据时,特别是在构建知识库或进行大模型训练与推理时,文本切分(Text Splitting) 是一个…...
数据库——redis
一、Redis 介绍 1. 概述 Redis(Remote Dictionary Server)是一个开源的、高性能的内存键值数据库系统,具有以下核心特点: 内存存储架构:数据主要存储在内存中,提供微秒级的读写响应 多数据结构支持&…...
