ninja构建笔记

在ninja构建系统中,“rule”和“build”这两个词通常关联但扮演着不同的角色。下面我会详细解释它们的区别:

### Rule (规则)

在构建系统中,“rule”通常指的是构建系统用来指导如何构建文件或者目标的指令集。它定义了一组转换输入到输出的操作,这些操作可以包括编译源代码、链接库、运行预处理脚本等。Rule可以被看作是一种模板,用于说明当特定类型的输出尚未存在时,构建系统应该执行什么操作来生成这个输出。规则通常包含以下元素:

- **条件**:确定何时应用规则。
- **动作**:要执行的命令或操作。
- **依赖关系**:输入文件或其他目标,它们必须先构建完成才能开始当前规则的执行。

### Build (构建)

“Build”则指的是实际执行构建过程的行为,即按照构建系统中定义的规则来创建或更新软件产品的实例。构建过程涉及解析构建配置文件(比如Makefile、build.gradle、CMakeLists.txt等),识别需要构建的目标,然后根据定义的规则执行相应的操作。构建的结果通常是可执行文件、库、文档、测试报告等具体产物。

#### 区别总结:

- **Rule**:是构建系统中的逻辑描述,规定了构建过程中的行为和转换。
- **Build**:是根据构建规则执行的实际操作,产生具体的构建输出。

### 示例

假设你正在使用`make`构建系统,你可能有一个`Makefile`,其中定义了多个`rules`,比如一个规则可能是用于编译`.c`文件成`.o`文件,另一个规则可能是链接所有的`.o`文件生成最终的可执行文件。当你运行`make`命令时,它会读取`Makefile`中的规则,并根据你的请求(构建目标)执行必要的构建步骤,这个执行过程就是`build`。

简而言之,**rule**是在构建中必须遵守的规则,而**build**是基于这些规则执行的实际构建动作,旨在生成具体的产品或副产品。

举例:
rule rule36586
 description = GoogleOneTimeInitializer dexpreopt gen
 command = /bin/bash -c "out/host/linux-x86/bin/dexpreopt_gen     -global_soong out/soong/dexpreopt_soong.config     -global out/soong/dexpreopt_arm64/dexpreopt.config     -module out/target/product/a523-y83/obj/APPS/GoogleOneTimeInitializer_intermediates/dexpreopt.config     -dexpreopt_script out/target/product/a523-y83/obj/APPS/GoogleOneTimeInitializer_intermediates/dexpreopt.sh     -out_dir out"
 restat = 1
build out/target/product/a523-y83/obj/APPS/GoogleOneTimeInitializer_intermediates/dexpreopt.sh: rule36586 out/target/product/a523-y83/obj/APPS/GoogleOneTimeInitializer_intermediates/dexpreopt.config out/soong/dexpreopt_soong.config out/soong/dexpreopt_arm64/dexpreopt.config out/host/linux-x86/bin/dexpreopt_gen
build GooglePackageInstaller-target: phony device_GooglePackageInstaller_all_targets
 phony_output = true
build device_GooglePackageInstaller_all_targets: phony out/target/product/a523-y83/obj/APPS/GooglePackageInstaller_intermediates/package.apk out/target/product/a523-y83/system/priv-app/GooglePackageInstaller/GooglePackageInstaller.apk out/target/product/a523-y83/obj/APPS/GooglePackageInstaller_intermediates/dexpreopt.zip
 phony_output = true

解析:

### rule rule36586

- **描述**: `GoogleOneTimeInitializer`模块的`dexpreopt`生成规则。
- **命令**: 执行`dexpreopt_gen`工具来生成`dexpreopt.sh`脚本和配置文件。这个命令指定了多个参数,包括全局的Soong和ARM64架构的`dexpreopt`配置,以及特定模块的配置文件路径。输出目录设置为`out`。
- **restat**: 设置为1,表示如果输入文件发生变化,则重新执行此规则。

### build out/target/product/a523-y83/obj/APPS/GoogleOneTimeInitializer_intermediates/dexpreopt.sh

- **规则**: 根据`rule36586`构建`dexpreopt.sh`脚本。
- **输入**: 包括模块的`dexpreopt.config`、全局的`dexpreopt_soong.config`、ARM64的`dexpreopt.config`以及`dexpreopt_gen`工具本身。
- **输出**: `dexpreopt.sh`脚本。

### build GooglePackageInstaller-target

- **类型**: 虚拟目标(phony),用于表示`GooglePackageInstaller`的构建和安装过程。
- **描述**: `GooglePackageInstaller`的所有构建目标。
- **输出**: 由于是虚拟目标,输出标记为`true`。

### build device_GooglePackageInstaller_all_targets

- **类型**: 虗拟目标(phony),用于表示设备上`GooglePackageInstaller`的所有构建目标。
- **依赖**: 包括`GooglePackageInstaller`的未优化APK (`package.apk`)、已优化的APK (`GooglePackageInstaller.apk`)以及`dexpreopt.zip`文件。
- **输出**: 由于是虚拟目标,输出标记为`true`。

### 总结

这段构建规则说明了`GoogleOneTimeInitializer`模块的`dexpreopt`优化过程,以及`GooglePackageInstaller`的构建和安装流程。`dexpreopt`是一个重要的Android优化步骤,用于在部署前对Dalvik字节码进行优化,以提高应用的运行效率。`GooglePackageInstaller`的构建流程涉及到生成未优化的APK,对其进行`dexpreopt`优化,然后安装到设备的`/system/priv-app/`目录中。此外,构建规则还生成了`dexpreopt.zip`文件,这通常包含优化后的DEX文件,可以用于快速启动和性能分析。

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

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

相关文章

数据库-单表查询-基本查询

查询数据表中指定字段的内容: SELECT 字段名 FROM 表名; 同时查询多个字段下的内容: SELECT 字段名1, 字段名2 FROM 表名; 查询数据表中的所有内容: SELECT * FROM 表名; 带IN关键字的查询: SELECT 字段名 FROM 表名 WHERE 字段名 IN (n1,n2,n3,...); IN关键字…

lora 继续训练

lora 继续训练 一般正常lora训练完模型后我们只保存其lora参数,然后与base模型进行合并。记录一下训练完保存lora后,继续再对lora训练的步骤。 base_model AutoModelForCausalLM.from_pretrained(base_model_id) base_model.enable_input_require_gra…

Multi-Head RAG:多头注意力的激活层作为嵌入进行文档检索

现有的RAG解决方案可能因为最相关的文档的嵌入可能在嵌入空间中相距很远,这样会导致检索过程变得复杂并且无效。为了解决这个问题,论文引入了多头RAG (MRAG),这是一种利用Transformer的多头注意层的激活而不是解码器层作为获取多方面文档的新…

@Transactional实现原理及失效的三种情况

Transactional实现原理 Transactional是spring中定义的事务注解,在方法或类上加该注解开启事务。主要是通过反射获取当前对象的注解信息,利用AOP(代理模式)对编程式事务进行封装实现 // // Source code recreated from a .class f…

Win11版本21H2怎么升级为23H2?升级详细步骤在此!

在Win11电脑操作中,用户目前使用的版本是21H2,现在想体验23H2版本的先进功能,但不知道要怎么操作才能将系统版本升级为23H2?接下来小编给大家介绍详细的升级方法步骤,助力大家轻松完成系统版本升级操作。 方法一&#…

PostgreSQL源码分析——CHECKPOINT

checkpoint源码分析 因为检查点checkpoint相关的代码不是一篇文章就能分析完的,所以,相关的代码与逻辑可能会不连续,需要后续结合上下文理解。这里只列出了其中一部分。 其核心代码在:src/backend/postmaster/checkpointer.c以及…

05眼动识别软件详情2波形优化-滤波

对应视频链接点击直达 01项目点击下载,可直接运行(含数据库) 05眼动识别软件详情2 对应视频链接点击直达期望的数据展示数据波形对比如何实现几种常用滤波介绍维纳滤波巴特沃斯滤波器中值滤波排序滤波 推荐 结语其他以下是废话 原始数据的波…

CentOS 7.9上创建的JBOD阵列恢复(二)

系列文章目录 CentOS 7.9上创建JBOD(一) CentOS 7.9检测硬盘坏区、实物定位(三) 文章目录 系列文章目录前言一、用命令查看是否认到盘二、直接组JBOD三、挂载到新目录四、查看原数据总结 前言 在CentOS 7.9上创建了一个软阵列JB…

代码随想录算法训练营第四十二天| 1049. 最后一块石头的重量 II、 494. 目标和

LeetCode 1049. 最后一块石头的重量 II 题目链接:https://leetcode.cn/problems/last-stone-weight-ii/description/ 文章链接:https://programmercarl.com/1049.%E6%9C%80%E5%90%8E%E4%B8%80%E5%9D%97%E7%9F%B3%E5%A4%B4%E7%9A%84%E9%87%8D%E9%87%8FII…

SQL触发器基本结构

1. 修改分隔符的符号 delimiter $$ $$或者//都可以 2.创建触发器的名称 create trigger 函数名称 3. 什么样的操作会触发,操作的那个表 after:....之后触发 befor:....之前触发 insert:插入被触发 update:修改被触发 …

Kibana 一步步可视化实战构建步骤全集

今早读者朋友圈提及:《一本书讲透Elasticsearch》适合入门级体系化阅读,书中的3个项目实战,很适合实操,但是在建立Kibana可视化的过程中,书中没有明确构建步骤,在实操中会有缺憾。 我解释一下: …

CPU与GPU的原理不同

CPU(中央处理器)和GPU(图形处理器)在设计原理上有很大的不同。CPU是通用的计算核心,擅长处理复杂的控制流和数据结构,而GPU则是为了并行处理大量相似的计算任务而设计的。二者是计算机系统中两种不同类型的…

AI实战 | 使用元器打造浪漫仪式小管家

浪漫仪式小管家 以前我们曾经打造过学习助手和待办助手,但这一次,我们决定创造一个与众不同的智能体,而浪漫将成为我们的主题。我们选择浪漫作为主题,是因为我们感到在之前的打造过程中缺乏了一些仪式感,无法给对方带来真正的惊喜。因此,这一次我们计划慢慢调试,将它发…

vim 显示行号

在 Vim 中,你可以通过几种不同的方式来显示行号。以下是两种常用的方法: 临时显示行号: 当你打开 Vim 并想要临时查看文件的行号时,你可以使用 :set number 命令。这个命令会在当前 Vim 会话中显示行号。如果你想要关闭行号显示&a…

Python xml.dom.minidom 读取XML元素

哈喽,大家好,我是木头左! 什么是 XML? XML(可扩展标记语言)是一种用于描述数据结构和交换数据的标记语言。它被广泛用于 Web 应用程序中,用于存储和传输数据。XML 具有自描述性,因此…

GitHub|GitLab它们的区别是什么?

GitLab 和 GitHub 都是基于 Git 版本控制系统提供服务的平台,但它们是两个不同的产品,各自有着不同的特点和目标用户群。下面是对它们的基本解释和一些关键差异: GitHub 概述:GitHub 是全球最大的开源代码托管平台,由…

yocto根文件系统如何配置静态IP地址

在Yocto根文件系统中配置静态IP地址,你可以参考以下步骤。请注意,这些步骤可能会因Yocto版本和具体硬件平台的不同而略有差异。 1. 获取网络配置信息 首先,你需要从网络运维方获取分配的IP地址、子网掩码、默认网关和DNS信息。 2. 确定配置文…

文生视频开源产品的一些调研(一)

笔者尝试AI视频生成的几个特点: 玄学prompt,每个视频的prompt可能也需要微调很多次,需要找到使用模型的最佳prompt词组合,不恰当的比喻,骑自行车,座位高度等都是人与车彼此熟悉玄学生成,因为需…

第二证券:英伟达“利空”?!黄仁勋逢高又卖超2亿

时隔9个月,黄仁勋再次套现英伟达,股价小幅下跌。 当地时间6月17日周一,美股三大股指全线收涨。到收盘,道指涨0.49%,纳指涨0.95%,标普500指数涨0.77%。 英伟达CEO黄仁勋时隔9个月再度出售英伟达股票。最新…

基于spring的个人理财系统

需求概述 建设目标 个人理财项目的项目建设目标如下:完成用户注册、登录、用户唯一性验证、记账管理、预算管理、个人信息、修改密码等功能,实现完整的理财流程。 运行环境 1.系统硬件环境 (1)服务器端 名称 配置…