Android 安卓 Soong构建系统——Blueprint Android.bp配置文件解析

news2024/12/24 1:16:27

文章目录

    • 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文件通常包含以下部分:

  1. 模块类型:如cc_binary, cc_library等,定义了模块的类型。

  2. 模块名称:通过name字段定义,是模块的唯一标识。

  3. 模块属性:这些属性可用于控制模块的构建行为。例如,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_libsshared_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 使用的脚本语言,用于描述如何构建源代码。

以下是各个部分的解读:

  1. CopyrightLicense 部分:此部分指定了此文件的版权信息和许可证信息,说明该文件遵循 Apache License 2.0 许可证。

  2. package 部分:此处指定了默认适用的许可证,即 Android-Apache-2.0。

  3. 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官方文档

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

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

相关文章

Python二级 每周练习题25

如果你感觉有收获,欢迎给我打赏 ———— 以激励我输出更多优质内容 练习一: 运算规则如下: (1) 若该数是偶数,,则变为原数的一半 (2) 若该数是奇数,则变为原数的3倍加1 (3) 重复 (1) (2),直到该数变为1。 编写程序实…

Gradle笔记 二 Gradle的基础Groovy

学习Groovy的必要性 首先Gradle是由Groovy写成的,而且构建脚本的语法都遵循Groovy的语法,所以要学好Gradle的前提是要基本了解Groovy的语法。 Groovy 简介 在某种程度上,Groovy可以被视为Java的一种脚本化改良版,Groovy也是运行在JVM上&am…

什么是微服务?与分布式又有什么区别?

什么是微服务,我们先从传统的单体结构进行了解,对两者进行对比。 单体结构 单体结构是一种传统的软件架构模式,它将应用程序划分为一组相互依赖的模块和组件。这些模块和组件通常都是构建在同一个平台上的,并且紧密耦合在一起。…

本地生活商家想选择靠谱的服务商就这样做,还可以借助批量剪辑来进一步提升营销价值

本地生活商家怎么选择靠谱的服务商? 在抖音本地生活的赛道里,商家除了花精力去搭建自己的团队之外,还可以选择和服务商合作,来实现商单的分发与销售,那么如何和服务商建立合作呢? 今天,来为商…

MG-Soft MIB Browser使用教程

图片 MG-Soft公司是一家老牌的监控工具,是目前全球领先的网络管理,SNMP监控的领导厂商; 我发现很多客户都在使用该软件,比如近期参加的某大型企业招标测试就使用的该软件,该软件比我之前写的ireasoning MIB Browser …

做什么数据表格啊,要做就做数据可视化

是一堆数字更易懂,还是图表更易懂?很明显是图表,特别是数据可视化图表。数据可视化是一种将大量数据转化为视觉形式的过程,通过图形、图表、图像等方式呈现数据,以便更直观地理解和分析。 数据可视化更加生动、形象地…

文件怎么加密丨4种文件加密方法盘点

一 、如何给word文件加密? 1. 打开word,点击“文件”。 2. 点击“信息”,选择“保护文档”,并选择“用密码进行加密”。 3. 在弹出的小窗口,我们可以添加密码,并点击确定即可。 二、如何给excel表格进行加…

什么是数据库?数据库有哪些基本分类和主要特点?

数据库是以某种有组织的方式存储的数据集合。本文从数据库的基本概念出发,详细解读了数据库的主要类别和基本特点,并就大模型时代备受瞩目的数据库类型——向量数据库进行了深度剖析,供大家在了解数据库领域的基本概念时起到一点参考作用。 …

Linux 服务器监控

服务器几乎与任何 IT 基础设施密不可分,Linux 是服务器兼容性最强的开源操作系统,因为它具有灵活性、一致性和安全性。大多数 Linux 服务器都设置了以下 Linux 操作系统的任何变体:Red Hat Enterprise Linux (RHEL)、D…

分享5款有趣的软件,你都知道吗?

​ 今天我想分享几个有趣但或许不那么多人知道的软件,各位喜欢的朋友可以自行下载呢。 1.文本比较软件——Diffchecker ​ Diffchecker是一款在线文本比较软件,可以找出两个文本文件之间的差异。Diffchecker可以比较文本、代码、PDF、Word等多种格式的…

day10-内核实验项目概述与内核信号

1.在系统中什么是信号,都有什么信号 2.在系统接收到信号后,他是如何处理的 3.信号作用 信号处理流程: _system_call: call _sys_call_table(,%eax,4) sys_signal sys_signal int sys_signal(int signum, long handler, long restorer) {/…

打造工业数字基础设施坚实底座,麒麟信安参展2023工业软件生态大会

11月5日,2023工业软件生态大会在深圳揭开帷幕。以“共建新一代工业软件体系,引领制造业高质量发展”为主题,本次大会邀请政府、高校、行业专家和企业代表齐聚一堂,展示工业全产业链前沿技术、创新产品和解决方案,围绕核…

零代码编程:用ChatGPT批量合并文件夹

一个文件夹里面有很多个子文件夹,其中一些是互相配对的,比如: 动物寓言王国_合作力量大 (上)国英语版 动物寓言王国_合作力量大 (下)国英语版 动物寓言王国-狮子与猎狗 (上&#…

出现 Daemons using outdated libraries 的解决方法

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 使用apt安装某些包的时候,弹出如下界面: Daemons using outdated libraries的选择框 并问我需要重启的服务,which services should be restarted? 不知什么情况,选择esc之后,所安装的包并没有成功!于是深入剖析 2.…

falsk框架中安装flask-mysqldb报错解决方案

错误示例 我的是py37版本,无法直接安装flask-mysqldb pip install flask-mysqldb报错如下 解决方案 先去第三方库 https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient 下载mysqlclient 这个是我的版本 mysqlclient-1.4.6-cp37-cp37m-win_amd64.whl 下…

麒麟信安协办 | 2023工业控制系统产业大会隆重举办

11月3日,由中国高科技产业化研究会、湖南省科学技术协会、国防科技大学、湖南大学、中南大学共同主办,工业控制系统产业联盟、长沙经济技术开发区管委会等单位共同承办,麒麟信安等单位协办的“2023 工业控制系统产业大会”在长沙召开。此次会…

中创|多家AI大模型获批上线,“百模”大战已打响,掀起新一轮AI风暴!

9个AI大模型获批上线 “百模”大战已正式打响 拼算法、争数据、卷算力...... 大模型们到底该比拼什么? 它们将给生活和产业变革 带来哪些惊喜和挑战? 今年8月,8家大模型备案通过,百度、字节、智谱华章、商汤、中科院、百川智…

Mach Systems—总线接口转换工具

产品概述 在汽车研发过程中,需要大量的总线数据支持,总线转换工具可以将总线数据转换为我们计算机常见接口,达到总线监视、采集、仿真等目的。MACH SYSTEMS来自于捷克的一家公司,专注于嵌入式和车载网络转换,为LIN、S…

麒麟信安加入“工业操作系统创新伙伴计划”,并亮相2023第三届工控中国大会新品发布会

11月1日-3日,2023第三届工控中国大会在苏州太湖国际会议中心举办。本届大会以“生态链接 智控未来 筑基新型工业化”为主题,由中国电子信息产业发展研究院、中国工业经济联合会、国家智能制造专家委员会、国家产业基础专家委员会、江苏省工业和信息化厅、…

【23真题】易!题源全部定位!带讲解!

今天分享的是23年长春理工大学808的信号与系统试题及解析。 本套试卷难度分析:22年长春理工808考研真题,我也发布过,若有需要,戳这里自取!本套试题内容难度中等偏下,题量较少,没有选择填空题&a…