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 Boot Starter并实现整合

《一文详解如何从零构建SpringBootStarter并实现整合》SpringBoot是一个开源的Java基础框架,用于创建独立、生产级的基于Spring框架的应用程序,:本文主要介绍如何从... 目录一、Spring Boot Starter的核心价值二、Starter项目创建全流程2.1 项目初始化(

使用Java实现通用树形结构构建工具类

《使用Java实现通用树形结构构建工具类》这篇文章主要为大家详细介绍了如何使用Java实现通用树形结构构建工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录完整代码一、设计思想与核心功能二、核心实现原理1. 数据结构准备阶段2. 循环依赖检测算法3. 树形结构构建4. 搜索子

使用Python和python-pptx构建Markdown到PowerPoint转换器

《使用Python和python-pptx构建Markdown到PowerPoint转换器》在这篇博客中,我们将深入分析一个使用Python开发的应用程序,该程序可以将Markdown文件转换为Pow... 目录引言应用概述代码结构与分析1. 类定义与初始化2. 事件处理3. Markdown 处理4. 转

Java使用Mail构建邮件功能的完整指南

《Java使用Mail构建邮件功能的完整指南》JavaMailAPI是一个功能强大的工具,它可以帮助开发者轻松实现邮件的发送与接收功能,本文将介绍如何使用JavaMail发送和接收邮件,希望对大家有所... 目录1、简述2、主要特点3、发送样例3.1 发送纯文本邮件3.2 发送 html 邮件3.3 发送带

Python结合Flask框架构建一个简易的远程控制系统

《Python结合Flask框架构建一个简易的远程控制系统》这篇文章主要为大家详细介绍了如何使用Python与Flask框架构建一个简易的远程控制系统,能够远程执行操作命令(如关机、重启、锁屏等),还... 目录1.概述2.功能使用系统命令执行实时屏幕监控3. BUG修复过程1. Authorization

nginx-rtmp-module构建流媒体直播服务器实战指南

《nginx-rtmp-module构建流媒体直播服务器实战指南》本文主要介绍了nginx-rtmp-module构建流媒体直播服务器实战指南,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. RTMP协议介绍与应用RTMP协议的原理RTMP协议的应用RTMP与现代流媒体技术的关系2

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

Golang使用etcd构建分布式锁的示例分享

《Golang使用etcd构建分布式锁的示例分享》在本教程中,我们将学习如何使用Go和etcd构建分布式锁系统,分布式锁系统对于管理对分布式系统中共享资源的并发访问至关重要,它有助于维护一致性,防止竞... 目录引言环境准备新建Go项目实现加锁和解锁功能测试分布式锁重构实现失败重试总结引言我们将使用Go作

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了