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

Android.bp入门指南之浅析Android.bp文件

在这里插入图片描述

文章目录

  • Android.bp文件是什么?
    • Android.bp的主要作用
      • 模块定义
      • 依赖关系
      • 构建规则
      • 模块属性
      • 插件支持
      • 模块的可配置性
  • 为什么会引入Android.bp
  • 语法
  • 例子

Android.bp文件是什么?

Android.bp 文件是 Android 构建系统(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.bp 文件的一些主要作用:

模块定义

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

依赖关系

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

构建规则

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

模块属性

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

插件支持

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

模块的可配置性

通过 Android.bp 文件,你可以定义模块的可配置属性,允许构建系统在不同的场景或设备上使用不同的配置。

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

为什么会引入Android.bp

Android.bp 文件是Android构建系统中引入的一种构建文件,用于替代之前的Makefile和其他构建描述文件。主要的原因包括:

构建系统的现代化: 传统的Makefile构建系统在复杂项目中的管理和维护上存在一些困难,特别是随着Android项目的复杂性的增加。Soong构建系统和Android.bp文件的引入旨在提供更现代、可扩展、易维护的构建系统。

模块化和可配置性: Android.bp 文件引入了模块化的构建方式,允许将Android项目拆分为多个模块,并为每个模块定义独立的构建规则。这种模块化的设计使得开发者能够更好地组织项目结构,提高代码的可维护性。同时,Android.bp 文件支持配置属性,允许根据不同的设备或条件进行灵活的配置。

性能和并发构建: Soong构建系统和Android.bp文件的设计旨在提高构建系统的性能。它支持并发构建,可以更高效地利用多核处理器,并在大型项目中减少构建时间。

支持新的Android平台特性: 随着Android平台的不断演进,新的构建需求和特性不断涌现。Soong和Android.bp文件的引入使得构建系统更容易适应这些新的需求,包括对新的硬件架构、系统组件等的支持。

Android.bp 文件的引入是为了提供一个更先进、可扩展和高效的Android构建系统,以满足复杂Android项目的构建需求,并使得构建过程更具灵活性和性能优势。

语法

Android.bp 文件是 Soong 构建系统中的构建描述文件,用于配置 Android 项目的构建规则。以下是 Android.bp 文件的主要语法要点:

模块类型定义:
使用 module_type 字段指定模块的类型,例如 module_type: “android_library” 或 module_type: “android_app”。

模块名定义:
使用 name 字段指定模块的名称,例如 name: “MyLibrary”。

模块属性:
使用各种字段来定义模块的属性,例如 srcs(源文件列表)、cflags(编译选项)、include_dirs(包含目录)等。
例如:

srcs: ["file1.c", "file2.c"],
cflags: ["-Wall", "-Werror"],

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

defaults: ["my_defaults"],

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

deps: ["lib1", "lib2"],

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

optional_uses_libs: ["optional_lib1", "optional_lib2"],

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

build: {target: {cflags: ["-O2"],},device: {cflags: ["-DDEVICE_BUILD"],},
},

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

tool: {yacc: ["my_yacc_tool"],
},

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

tags: ["my_tag"],

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

arch: {arm64: {cflags: ["-march=armv8-a"],},x86: {cflags: ["-march=x86-64"],},
},

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

my_var = "my_value";
my_func = {name: "my_function",args: ["arg1", "arg2"],
};

命名空间:

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

namespace {module_type: "my_namespace_type",name: "my_namespace",srcs: ["namespace_file1.c", "namespace_file2.c"],
}

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

group {name: "my_group",srcs: ["group_file1.c", "group_file2.c"],
}

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

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

if (my_condition) {// 针对条件为真时的配置srcs: ["file_condition_true.c"],
} else {// 针对条件为假时的配置srcs: ["file_condition_false.c"],
}

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

required: ["my_required_tag"],
host_required: ["my_host_required_tag"],

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

overrides: ["my_overridden_module"],

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

private: {my_private_var: "private_value",
}

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

generated_sources: ["generated_file1.c", "generated_file2.c"],

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

tool: {aidl: {flags: ["-Ipath/to/aidl/include"],},
},

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

例子

android_app {name: "TvLocalMediaPlayer",defaults: ["xxx_DexPreOptVariant_defaults"],srcs: ["src/**/*.java","src/**/*.kt"],resource_dirs: ["res"],optional_uses_libs: ["javax.obex",],static_libs: ["com.mediatek.exoplayerlib","com.mediatek.tv.oneworld.basic","com.mediatek.tv.oneworld.tvapi","extservice_api","com.mediatek.tv.agent.settingspqdb.lib","com.mediatek.tv.oneworld.systemapi","com.mediatek.xxxPhoto","androidx.recyclerview_recyclerview","androidx.preference_preference","androidx.appcompat_appcompat","androidx.leanback_leanback-preference","androidx.leanback_leanback","androidx.lifecycle_lifecycle-runtime","androidx.lifecycle_lifecycle-common","com.mediatek.tv.common.views"],certificate: "platform",platform_apis: true,privileged: true,system_ext_specific: true,optimize: {proguard_flags_files: ["proguard.flags"],},overrides: ["LiveTv"],
}

这个 Android.bp 文件是一个用于构建 Android 应用程序模
块的配置文件,采用 Soong 构建系统的语法。以下是对文件中的各个部分的详细解释:

android_app 模块类型:

android_app 是 Android 构建系统中用于定义 Android 应用程序模块的一种模块类型。
这个模块类型表示一个Android应用程序,它将编译成一个APK文件。
模块的基本信息:

name: “TvLocalMediaPlayer”:指定应用程序模块的名称为 “TvLocalMediaPlayer”。
defaults: [“xxx_DexPreOptVariant_defaults”]:引用了一个名为 “xxx_DexPreOptVariant_defaults” 的默认配置。
源代码和资源文件:

srcs: [“src//*.java", "src//*.kt”]:指定了Java和Kotlin源代码文件的路径,这些文件将被编译成应用程序的可执行代码。
resource_dirs: [“res”]:指定了资源文件的路径,这些资源文件将被包含在最终的APK中。
可选使用的库:

optional_uses_libs: [“javax.obex”]:指定了一个可选使用的库,即 javax.obex。如果该库可用,则将其链接到应用程序中。
静态库依赖关系:

static_libs 部分列举了应用程序依赖的静态库模块。这些库模块将被链接到应用程序中。
例如,“com.mediatek.exoplayerlib”、“com.mediatek.tv.oneworld.basic” 等。
证书和平台相关属性:

certificate: “platform”:指定应用程序使用平台证书进行签名,这是 Android 平台的标准做法。
platform_apis: true:表明该应用程序使用了 Android 平台的 API。
privileged: true:表明该应用程序是特权应用,可能需要更高的系统权限。
system_ext_specific: true:

system_ext_specific: true:表明该应用程序是专门为 System Ext 分区设计的,System Ext 是 Android 10 引入的一个扩展系统分区。

优化配置:
optimize 部分定义了一些优化配置。
proguard_flags_files: [“proguard.flags”]:指定了 ProGuard 优化的配置文件。

overrides: [“LiveTv”]:
overrides 部分列举了该应用程序覆盖的其他模块,这里是 “LiveTv”。这意味着当前应用程序可能包含或修改了 “LiveTv” 模块的一些功能。


结束语
Flutter是一个由Google开发的开源UI工具包,它可以让您在不同平台上创建高质量、美观的应用程序,而无需编写大量平台特定的代码。我将学习和深入研究Flutter的方方面面。从基础知识到高级技巧,从UI设计到性能优化,欢饮关注一起讨论学习,共同进入Flutter的精彩世界!

相关文章:

Android.bp入门指南之浅析Android.bp文件

文章目录 Android.bp文件是什么?Android.bp的主要作用模块定义依赖关系构建规则模块属性插件支持模块的可配置性 为什么会引入Android.bp语法例子 Android.bp文件是什么? Android.bp 文件是 Android 构建系统(Android Build System&#xff…...

2024年美赛 (D题ICM)| 湖流网络水位控制 |数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2022年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题。 让我们来看看美赛的D题! 完整内容可以在文章末尾领…...

安卓网格布局GridLayout

<?xml version"1.0" encoding"utf-8"?> <GridLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android:layout_width"match_parent"android:la…...

DHCP简介

定义 动态主机配置协议DHCP&#xff08;Dynamic Host Configuration Protocol&#xff09;是一种用于集中对用户IP地址进行动态管理和配置的技术。即使规模较小的网络&#xff0c;通过DHCP也可以使后续增加网络设备变得简单快捷。 DHCP是在BOOTP&#xff08;BOOTstrap Protoc…...

Hadoop生态系统中一些关键组件的详细解析

1. Hadoop核心组件 HDFS&#xff08;Hadoop Distributed File System&#xff09;: 分布式文件存储系统。提供高吞吐量的数据访问&#xff0c;非常适合用于大规模数据集。有高容错性&#xff0c;通过在多个节点间复制数据块来实现。 MapReduce: 一种编程模型&#xff0c;用于在…...

功能强大的开源数据中台系统 DataCap 2024.01.1 发布

推荐一套基于 SpringBoot 开发的简单、易用的开源权限管理平台&#xff0c;建议下载使用: https://github.com/devlive-community/authx 推荐一套为 Java 开发人员提供方便易用的 SDK 来与目前提供服务的的 Open AI 进行交互组件&#xff1a;https://github.com/devlive-commun…...

Redis的bitmap使用不当,我内存爆了

背景 最近发现Redis的内存持续暴涨&#xff0c; 涨的有点吓人&#xff0c;机器都快扛不住了&#xff0c;不得不进行Redis内存可视化分析&#xff0c;发现大量的String类型的大key 经分析&#xff0c;最近上线了页面UV的统计&#xff0c;那目前如何做的呢&#xff1f; 通过访…...

基于python的新闻爬虫

咱们这个任务啊&#xff0c;就是要从一个指定的网站上&#xff0c;抓取新闻内容&#xff0c;然后把它们整整齐齐地保存到本地。具体来说&#xff0c;就是要去光明网的板块里&#xff0c;瞅瞅里面的新闻&#xff0c;把它们一条条地保存下来。 首先&#xff0c;咱得有个网址&…...

C#基础题

值类型和引用类型之间的区别是什么&#xff1f; 值类型在内存中存储实际值&#xff0c;而引用类型存储对对象的引用。值类型在栈上分配内存&#xff0c;而引用类型在堆上分配内存。值类型是不可变的&#xff0c;而引用类型是可变的。值类型的大小是固定的&#xff0c;而引用类型…...

AI大语言模型学习笔记之三:协同深度学习的黑魔法 - GPU与Transformer模型

Transformer模型的崛起标志着人类在自然语言处理&#xff08;NLP&#xff09;和其他序列建模任务中取得了显著的突破性进展&#xff0c;而这一成就离不开GPU&#xff08;图形处理单元&#xff09;在深度学习中的高效率协同计算和处理。 Transformer模型是由Vaswani等人在2017年…...

c++阶梯之auto关键字与范围for

auto关键字&#xff08;c11&#xff09; 1. auto关键字的诞生背景 随着程序的逐渐复杂&#xff0c;程序代码中用到的类型也越来越复杂。譬如&#xff1a; 类型难以拼写&#xff1b;含义不明确容易出错。 比如下面一段代码&#xff1a; #include <string> #include &…...

第八篇:node模版引擎Handlebars及他的高级用法(动态参数)

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! ​ 目录 &#x1f4d8; 引言&#xff1a; &#x1f…...

css3 属性 backface-visibility 的实践应用

backface-visibility 是一个用于控制元素在面对屏幕不同方向时的可见性的CSS3特性。它有两个可能的值&#xff1a; visible&#xff1a;当元素不面向屏幕&#xff08;即背面朝向用户&#xff09;时&#xff0c;元素的内容是可以被看到的。hidden&#xff1a;当元素不面向屏幕…...

嵌入式学习第十七天

C语言小项目&#xff1a; 制作俄罗斯方块小游戏&#xff08;全部&#xff09; 主函数部分 #include <stdio.h> #include <unistd.h> #include <string.h> #include <signal.h> #include <stdlib.h> #include <time.h> #include "b…...

使用Python的Turtle模块简单绘制烟花效果

import turtle import random# 初始化屏幕 screen turtle.Screen() screen.bgcolor("black") screen.title("烟花模拟")# 创建一个Turtle来绘制烟花 firework turtle.Turtle() firework.hideturtle() firework.speed(0) # 设置绘图速度为最快# 绘制烟花…...

数学建模-退火算法和遗传算法

退火算法和遗传算法 一&#xff0e;退火算法 退火算法Matlab程序如下&#xff1a; [W]xlsread(D:100个目标经度纬度);>> x[W(:,1)];>> y[W(:,2)];>> w[x y];;d1[70, 40];>> w[d1;w;d1]ww*pi/180;%角度化成弧度dzeros(102);%距离矩阵初始化for i1:101…...

Qt开源版 vs 商业版 详细比较!!!!

简单整理Qt开源版与商业版有哪些差别&#xff0c;仅供参考。 简单对比 开源版商业版许可证大部分采用对商业使用不友好的LGPLv3具备商业许可证保护代码专有许可证相关大部分模块使用LGPLv3和部分模块使用GPL组成仅第三方开源组件使用Qt的其他许可证Qt模块功能支持支持技术支持…...

华为云CodeArts Snap荣获信通院优秀大模型案例及两项荣誉证书

2024年1月25日&#xff0c;中国人工智能产业发展联盟智能化软件工程工作组&#xff08;AI for Software Engineering&#xff0c;下文简称AI4SE&#xff09;在京召开首届“AI4SE创新巡航”活动。在活动上&#xff0c;华为云大模型辅助系统测试代码生成荣获“2023AI4SE银弹优秀案…...

小程序的应用、页面、组件生命周期(超全版)

小程序生命周期 应用的生命周期 onLaunch: 初始化小程序完成时触发&#xff0c;且全局只触发一次&#xff1b; onShow: 小程序初始化完成&#xff08;启动&#xff09;或从后台切换到前台显示时触发&#xff1b; onHide: 小程序从前台切换到后台隐藏时触发&#xff08;如切换…...

TCP四次握手

TCP 协议在关闭连接时&#xff0c;需要进行四次挥手的过程&#xff0c;主要是为了确保客户端和服务器都能正确地关闭连接。 # 执行流程 四次挥手的具体流程如下&#xff1a; 客户端发送 FIN 包&#xff1a;客户端发送一个 FIN 包&#xff0c;其中 FIN 标识位为 1&#xff0c…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...

LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)

在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...

macOS 终端智能代理检测

&#x1f9e0; 终端智能代理检测&#xff1a;自动判断是否需要设置代理访问 GitHub 在开发中&#xff0c;使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新&#xff0c;例如&#xff1a; fatal: unable to access https://github.com/ohmyzsh/oh…...

Easy Excel

Easy Excel 一、依赖引入二、基本使用1. 定义实体类&#xff08;导入/导出共用&#xff09;2. 写 Excel3. 读 Excel 三、常用注解说明&#xff08;完整列表&#xff09;四、进阶&#xff1a;自定义转换器&#xff08;Converter&#xff09; 其它自定义转换器没生效 Easy Excel在…...

Oracle实用参考(13)——Oracle for Linux物理DG环境搭建(2)

13.2. Oracle for Linux物理DG环境搭建 Oracle 数据库的DataGuard技术方案,业界也称为DG,其在数据库高可用、容灾及负载分离等方面,都有着非常广泛的应用,对此,前面相关章节已做过较为详尽的讲解,此处不再赘述。 需要说明的是, DG方案又分为物理DG和逻辑DG,两者的搭建…...