ninja构建笔记

2024-06-19 05:52
文章标签 ninja 笔记 构建

本文主要是介绍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文件,可以用于快速启动和性能分析。
 

.PHONY: PackageInstaller-checkbuild
PackageInstaller-checkbuild: out/soong/.intermediates/frameworks/base/packages/PackageInstaller/PackageInstaller/android_common/PackageInstaller.apk\out/soong/.intermediates/frameworks/base/packages/PackageInstaller/PackageInstaller/android_common/dex-withres-aligned/PackageInstaller.jar\out/soong/.intermediates/frameworks/base/packages/PackageInstaller/PackageInstaller/android_common/dexpreopt/oat/arm64/package.odex\out/soong/.intermediates/frameworks/base/packages/PackageInstaller/PackageInstaller/android_common/dexpreopt/oat/arm64/package.vdex
.PHONY: PackageInstaller-depsinfo
PackageInstaller-depsinfo: out/soong/.intermediates/frameworks/base/packages/PackageInstaller/PackageInstaller/android_common/depsinfo/flatlist.txt\out/soong/.intermediates/frameworks/base/packages/PackageInstaller/PackageInstaller/android_common/depsinfo/fulllist.txt
.PHONY: PackageInstaller-install
PackageInstaller-install: out/target/product/a523-y83/system/priv-app/PackageInstaller/PackageInstaller.apk\out/target/product/a523-y83/system/priv-app/PackageInstaller/oat/arm64/PackageInstaller.odex\out/target/product/a523-y83/system/priv-app/PackageInstaller/oat/arm64/PackageInstaller.vdex
.PHONY: PackageInstaller-soong
PackageInstaller-soong: PackageInstaller-checkbuild\PackageInstaller-install

这段Makefile语法描述了Android构建系统中针对`PackageInstaller`的一系列构建目标和它们之间的依赖关系。在Android源码构建中,Makefile用于定义目标、规则和依赖,使构建系统知道如何以及何时构建特定的组件。下面是各部分的详细解释:

### .PHONY: PackageInstaller-checkbuild
这一行定义了一个虚拟的目标`PackageInstaller-checkbuild`,它不是一个实际的文件,而是用来组织和标记一组构建动作。当make工具遇到`.PHONY`指令时,它会理解接下来的目标不是文件系统中的文件,而是一个构建规则。

### PackageInstaller-checkbuild:
这个目标列出了构建`PackageInstaller`所需的中间文件,包括:
- `out/soong/.intermediates/frameworks/base/packages/PackageInstaller/PackageInstaller/android_common/PackageInstaller.apk`:表示构建过程中的`PackageInstaller`的APK文件。
- `out/soong/.intermediates/frameworks/base/packages/PackageInstaller/PackageInstaller/android_common/dex-withres-aligned/PackageInstaller.jar`:预处理后的DEX文件,通常用于运行时加载。
- `out/soong/.intermediates/frameworks/base/packages/PackageInstaller/PackageInstaller/android_common/dexpreopt/oat/arm64/package.odex`:针对ARM64架构预优化的ODEX文件,用于提高运行时性能。
- `out/soong/.intermediates/frameworks/base/packages/PackageInstaller/PackageInstaller/android_common/dexpreopt/oat/arm64/package.vdex`:针对ARM64架构的VDex文件,用于快速启动。

### .PHONY: PackageInstaller-depsinfo
这是一个另一个虚拟目标,用于收集`PackageInstaller`的依赖信息。

### PackageInstaller-depsinfo:
它列出了两个依赖信息文件:
- `out/soong/.intermediates/frameworks/base/packages/PackageInstaller/PackageInstaller/android_common/depsinfo/flatlist.txt`:一个简化的依赖列表。
- `out/soong/.intermediates/frameworks/base/packages/PackageInstaller/PackageInstaller/android_common/depsinfo/fulllist.txt`:一个详细的依赖列表。

### .PHONY: PackageInstaller-install
这个目标用于指定`PackageInstaller`安装后的文件位置,包括:
- `out/target/product/a523-y83/system/priv-app/PackageInstaller/PackageInstaller.apk`:最终的APK文件位置。
- `out/target/product/a523-y83/system/priv-app/PackageInstaller/oat/arm64/PackageInstaller.odex`:预优化的ODEX文件位置。
- `out/target/product/a523-y83/system/priv-app/PackageInstaller/oat/arm64/PackageInstaller.vdex`:VDex文件位置。

### .PHONY: PackageInstaller-soong
这个目标组合了`PackageInstaller-checkbuild`和`PackageInstaller-install`,意味着构建`PackageInstaller-soong`目标时,将首先确保`checkbuild`目标完成,然后进行`install`。

整体而言,这些目标和规则定义了构建`PackageInstaller`的流程,从编译、预优化到最终的安装位置。当在构建系统中请求`PackageInstaller-soong`目标时,构建系统将按照定义的顺序执行这些规则,确保所有必要的构建步骤得到执行。

这篇关于ninja构建笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1074185

相关文章

Spring Cloud:构建分布式系统的利器

引言 在当今的云计算和微服务架构时代,构建高效、可靠的分布式系统成为软件开发的重要任务。Spring Cloud 提供了一套完整的解决方案,帮助开发者快速构建分布式系统中的一些常见模式(例如配置管理、服务发现、断路器等)。本文将探讨 Spring Cloud 的定义、核心组件、应用场景以及未来的发展趋势。 什么是 Spring Cloud Spring Cloud 是一个基于 Spring

Tolua使用笔记(上)

目录   1.准备工作 2.运行例子 01.HelloWorld:在C#中,创建和销毁Lua虚拟机 和 简单调用。 02.ScriptsFromFile:在C#中,对一个lua文件的执行调用 03.CallLuaFunction:在C#中,对lua函数的操作 04.AccessingLuaVariables:在C#中,对lua变量的操作 05.LuaCoroutine:在Lua中,

AssetBundle学习笔记

AssetBundle是unity自定义的资源格式,通过调用引擎的资源打包接口对资源进行打包成.assetbundle格式的资源包。本文介绍了AssetBundle的生成,使用,加载,卸载以及Unity资源更新的一个基本步骤。 目录 1.定义: 2.AssetBundle的生成: 1)设置AssetBundle包的属性——通过编辑器界面 补充:分组策略 2)调用引擎接口API

《offer来了》第二章学习笔记

1.集合 Java四种集合:List、Queue、Set和Map 1.1.List:可重复 有序的Collection ArrayList: 基于数组实现,增删慢,查询快,线程不安全 Vector: 基于数组实现,增删慢,查询快,线程安全 LinkedList: 基于双向链实现,增删快,查询慢,线程不安全 1.2.Queue:队列 ArrayBlockingQueue:

操作系统实训复习笔记(1)

目录 Linux vi/vim编辑器(简单) (1)vi/vim基本用法。 (2)vi/vim基础操作。 进程基础操作(简单) (1)fork()函数。 写文件系统函数(中等) ​编辑 (1)C语言读取文件。 (2)C语言写入文件。 1、write()函数。  读文件系统函数(简单) (1)read()函数。 作者本人的操作系统实训复习笔记 Linux

Python应用开发——30天学习Streamlit Python包进行APP的构建(9)

st.area_chart 显示区域图。 这是围绕 st.altair_chart 的语法糖。主要区别在于该命令使用数据自身的列和指数来计算图表的 Altair 规格。因此,在许多 "只需绘制此图 "的情况下,该命令更易于使用,但可定制性较差。 如果 st.area_chart 无法正确猜测数据规格,请尝试使用 st.altair_chart 指定所需的图表。 Function signa

LVGL快速入门笔记

目录 一、基础知识 1. 基础对象(lv_obj) 2. 基础对象的大小(size) 3. 基础对象的位置(position) 3.1 直接设置方式 3.2 参照父对象对齐 3.3 获取位置 4. 基础对象的盒子模型(border-box) 5. 基础对象的样式(styles) 5.1 样式的状态和部分 5.1.1 对象可以处于以下状态States的组合: 5.1.2 对象

DDS信号的发生器(验证篇)——FPGA学习笔记8

前言:第一部分详细讲解DDS核心框图,还请读者深入阅读第一部分,以便理解DDS核心思想 三刷小梅哥视频总结! 小梅哥https://www.corecourse.com/lander 一、DDS简介         DDS(Direct Digital Synthesizer)即数字合成器,是一种新型的频率合成技术,具有低成本、低功耗、高分辨率、频率转换时间短、相位连续性好等优点,对数字信

数据库原理与安全复习笔记(未完待续)

1 概念 产生与发展:人工管理阶段 → \to → 文件系统阶段 → \to → 数据库系统阶段。 数据库系统特点:数据的管理者(DBMS);数据结构化;数据共享性高,冗余度低,易于扩充;数据独立性高。DBMS 对数据的控制功能:数据的安全性保护;数据的完整性检查;并发控制;数据库恢复。 数据库技术研究领域:数据库管理系统软件的研发;数据库设计;数据库理论。数据模型要素 数据结构:描述数据库

青龙面板之Ninja无法安装无法拉库问题解决

因为之前的Ninja库已经不能用了,甚至新找到的库也不能用了,好尴尬,这里使用线下版本进行安装。 ninja安装新方法,其是方法还是原来的,只不过Ninja的库原作者删了,没法直接git了,但是我找到了源码包,我们可以直接通过宝塔面板拖进去。 源码包地址: https://download.csdn.net/download/u012134073/24813485 备用地址: 链接: h