android8.0编译过程初步分析

Welljia Welljia     2023-02-28     612

关键词:

Android 8.0编译过程分析

概述

要想知道编译的过程,其实看编译的脚本,以及编译时产生的log是比较快的方法。

编译相关的核心文件位于build/core下,而生成的文件在out/soong下,里面有编译过程中产生的编译相关文件。

在编译过程中,首先将所有的android.bp文件收集成out/soong/build.ninja.d,然后以此为基础生成out/soong/build.ninja规则。而Android.mk收集后生成的是build-aosp_arm.jinja文件。

soong处理后的bp文件生成build.ninja的同时还包含out/soong/Android-aosp_arm.mk,这个文件是编译完成后模块的安装脚本,负责将模块安装到对应位置。

在out/soong目录下有两个文件.minibootstrap/build.ninja 和.bootstrap/build.ninja两个目录。.minibootstrap/build.ninja 主要是用来编译blueprint和生成.bootstrap/build.ninja。而.bootstrap/build.ninja主要是生成 soong相关工具和out/soong/build.ninja文件。

编译步骤

  1. source build/envsetup.sh:加载命令

  2. lunch:选择平台编译选项

  3. make:执行编译

source build/envsetup.sh

envsetup.sh 加载到当前 shell,里面提供了很多编译时需要的命令,即把命令加载到环境变量中。

加载后,我们常用的主要命令如下:

像lunch,croot,mm等,都是常用的命令,如果没有加载envsetup.sh,使用这些命令就会失败。

这里需要注意一下的是add_lunch_combo函数,这个函数会被多次调用,用来添加Android编译选项的。

另外就是vendorsetup,用来加载厂商自己定义的编译选项的。

综上,envsetup.sh主要的作用如下:

  1. 加载了编译时使用到的函数命令,如:lunch,m,mm,mmm等
  2. 添加编译选项
  3. 查找厂商目录下的vendorsetup.sh,如果存在的话,加载执行它,添加厂商自己定义产品的编译选项

上述第3条是向编译系统添加了厂商自己定义产品的编译选项,里面的代码就是:add_lunch_combo xxx-xxx。

这样要想定义自己平台的产口编译项,就可以在envsetup.sh里添加上add_lunch_combo xxxproject,当然标准的作法是根据脚本的规则,在vendor目录下创建自己公司项目名字,然后新建一个vendorsetup.sh,在里面添加上自己的产品编译项。

这样在加载envsetup.sh时,就会有类似如下的信息:

lunch

lunch是envsetup.sh里定义的一个命令,用来让用户选择编译项,来定义Product和编译过程中用到的全局变量。

当你输入lunch后,会出现如下信息供你选择:

这就是用来选择的编译选项,除了eng,还有user,userdebug等,这个与编译时Android.mk中的LOCAL_MODULE_TAGS有关,用来区分给用户的版本和测试用的版本。

lunch中比较重要的是如下几行语句,是用来导出环境变量的,后面编译系统会依赖这里定义的变量。

make

make就是去执行makefile的,源码目录下有个Makefile,打开后内容如下:

make后是去调用了build/core/main.mk,里面定义了整个Android的编译关系,具体比较复杂,后续再学习。

android8.0编译系统简述(代码片段)

Android8.0编译系统简述概述Android7.0之前,android编译主要依赖makefile,随着android工程越来越大,makefile编译花费时间也越来越多,所以7.0开始逐步引入了katisoong(可选,用的话需要在执行编译时将USE_SOONG=true开... 查看详情

u-boot-2016.07移植(第一篇)初步分析

...) 初步分析目录U-BOOT-201607移植 第一篇 初步分析目录编译和移植环境更新交叉编译工具1下载arm-linux-gcc4432安装arm-linux-gcc443安装环境Ubuntu910下载u-boot-201607并解压分析顶层Makefile1找出目标依赖关系2总结初次编译u-boot1配置2编译... 查看详情

在ubuntu16.04上搭建android8.0编译环境

1.安装AOSP编译工具sudoaptinstallgit-core sudoaptinstallgnupg sudoaptinstallflexsudoaptinstallbisonsudoaptinstallgperfsudoaptinstallbuild-essentialsudoaptinstallcurlsudoaptinstalllibc6-devsudoaptinstalllibssl-devsudoaptinstalllibncurses5-dev:i386sudoaptinstalllibxml2-utilssudoaptinstallzlib1g... 查看详情

对编译原理的初步了解

编译原理就是什么?编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法。内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。... 查看详情

gcc编译器原理------编译原理三:编译过程(2-1)---编译之词法分析

二、编译引用文档:https://blog.csdn.net/chdhust/article/details/9040647编译过程就是把预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后生成相应的汇编代码文件,这个过程是整个程序构建的核心部分,也是最复杂的部... 查看详情

gcc编译器原理------编译原理三:编译过程(2-2)---编译之语法分析

2.2语法分析语法分析器(GrammarParser)将对由扫描器产生的记号进行语法分析,从而产生语法树(SyntaxTree)。整个分析过程采用了上下文无关语法(Context-freeGrammar)的分析手段。由语法分析器生成的语法树就是以表达式(Expressio... 查看详情

[openharmony]标准系统编译过程分析

参考技术A这里以hi3516dv300开发板为例来分析,编译命令如下当前标准系统编译入口是bash脚本,里面调用python脚本,最终调用gn/ninja+makefile/make整体执行流程如下上面的编译命令最终组成的gn命令如下上面的编译命令最终组成的ninja... 查看详情

编译过程

...否构成一个语法上正确的程序。3.语义分析:语义分析是编译过程的一个逻辑阶段,语义是解释控制信息每个部分的意义,它规定了需要发出何种控制信息,以及完成的动作与做出什么样的响应,此阶段的任务是对结构上正确的... 查看详情

66.javac编译与jit编译编译过程javac编译词法语法分析填充符号表语义分析字节码生成jit编译

66.javac编译与JIT编译66.1.编译过程66.2.javac编译66.2.1.词法、语法分析66.2.2.填充符号表66.2.3.语义分析66.2.4.字节码生成66.3.JIT编译66.javac编译与JIT编译66.1.编译过程不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转... 查看详情

分析存储过程重新编译的原因

...或者在重用期间可能不能提供最佳的处理策略。SQLServer重编译存储过程中的语句来生成一个新的执行计划以解决这个问题。  查看详情

android——qigsaw源码分析编译过程(代码片段)

...文基于2021/7/14版本分析(https://github.com/iqiyi/Qigsaw)Qigsaw分为编译过程→初始化过程→加载过程→安装过程进行源码分析。如何调试gradle:And 查看详情

android——qigsaw源码分析编译过程(代码片段)

...文基于2021/7/14版本分析(https://github.com/iqiyi/Qigsaw)Qigsaw分为编译过程→初始化过程→加载过程→安装过程进行源码分析。如何调试gradle:And 查看详情

编译过程学习

...gcc命令就可以了。但是这其中包含了以下几个过程。1.预编译(preprocess)预编译过程主要是处理源代码中以#开头的预编译指令。如宏的处理,头文件的包含,注释删除,加入行号和文件名标识以使在编译时,编译器产生编译错误和... 查看详情

android8.0删除soundtriggertestapk

device/rockchip/rk3326/rk3326_32bit/preinstall/SoundTriggerTestAppGeneric/Android.mk清空MK开发者涨薪指南48位大咖的思考法则、工作方式、逻辑体系 查看详情

一概述

编译程序高级语言程序\\(\\rightarrow\\)编译程序\\(\\rightarrow\\)低级语言程序(汇编语言或者机器语言)解释程序源程序\\(\\rightarrow\\)解释程序\\(\\rightarrow\\)输出编译过程(5个阶段)1.词法分析任务:输入源程序,对字符串扫描分解,... 查看详情

android8.0删除lightningapk(代码片段)

vendor/rockchip/common/apps/apps.mk-PRODUCT_PACKAGES+=\\-Lightningvendor/rockchip/common/apps/Lightning/Android.mk清空 查看详情

android8.0设置回滚保护功能系统降级将无法实现

  谷歌在最新的Android8.0中加入了一个RollbackProtection(降级保护)技术,阻止设备回滚到旧版本的固件。为什么要学坏?  从Android8.0发布日正式算起,已经4个月过去了,然而根据官方的统计,现在的渗透率还不到1... 查看详情

android8.0修改默认时区(代码片段)

build\\make\\tools\\buildinfo.shecho"persist.sys.timezone=Asia/Shanghai"build\\tools\\buildinfo.shecho"persist.sys.timezone=Asia/Shanghai" 查看详情