Android系统编译

基础语法

1)通配符

在bash下,可以使用*来匹配零个或多个字符,而用?匹配一个字符。

2)输入输出从定向

输入重定向用于改变命令的输入,输出重定向用于改变命令的输出。>, >>, 2>, 2>> :重定向符号> 以及>> 分别表示取代和追加的意思,然后还有两个符号就是这里的2> 和 2>> 分别表示错误重定向和错误追加重定向,当我们运行一个命令报错时,报错信息会输出到当前的屏幕,如果想重定向到一个文本里,则要用2>或者2>>。

3)管道符

管道符”|”,就是把前面的命令运行的结果丢给后面的命令。

4)在linux下设置自定义变量规则

a. 设定变量的格式为”a=b”,其中a为变量名,b为变量的内容,等号两边不能有空格;

b. 变量名只能由英、数字以及下划线组成,而且不能以数字开头;

c. 当变量内容带有特殊字符(如空格)时,需要加上单引号;若变量内容中本身带有单引号,需要加双引号。单引号和双引号的区别:用双引号时不会取消掉里面出现的特殊字符的本身作用(这里的$),而使用单引号则里面的特殊字符全部失去它本身的作用。

d. 如果变量内容中需要用到其他命令运行结果则可以使用反引号,变量内容可以累加其他变量的内容,需要加双引号;和剩下需要拼接的内容无空格连接即可。

5)shell变量的暴露和抹消

export其实就是声明一下这个变量的意思,让该shell的子shell也知道变量abc的值是123.如果export后面不加任何变量名,则它会声明所有的变量。如果想取消某个变量怎么办?只要输入”unset 变量名”即可。

6)后台执行

& :如果想把一条命令放到后台执行的话,则需要命令最后空格加上这个符号。通常用于命令运行时间非常长的情况。

7)多命令执行

1) command1 ; command2

2) command1 && command2

3) command1 || command2

使用”;”时,不管command1是否执行成功都会执行command2; 使用”&&”时,只有command1执行成功后,command2才会执行,否则command2不执行;使用”||”时,command1执行成功后command2 不执行,否则去执行command2,总之command1和command2总有一条命令会执行。

 

Makefile基础结构(每条命令前必须有一个TAB制表符):

目标:先决条件

    命令

Makefile基础规则:

当先决条件中存在比目标更新的文件时,命令会被触发执行

Android编译系统抽象:

初始化环境 → 构建依赖树 → 执行编译流程 → 打包

Makefile依赖树:

根节点:当make命令不带显式目标时匹配当前目录下第一个叫makefile的文件作为依赖树根节点。Android系统的根节点为droid,在build/core/main.mk中详细描述,并根据TARGET_BUILD_APPS拆出只编译app和编译整个系统两个分支。

依赖树的形成:从源码根目录下的makefile文件开始,对makefile中的内容按顺序逐条解析(变量赋值环境监测、生成所有依赖树),并根据用户所选择的依赖树从叶到根生成目标文件。(不止一棵依赖树,如make,make sdk等命令结果不一样)

Android系统编译过程:

Android系统的根节点为droid,在build/core/main.mk中详细描述,并根据TARGET_BUILD_APPS拆出只编译app和编译整个系统两个分支。

由main.mk主导并开始时序图,调用一系列mk文件生成依赖文件和变量,最后调用Android.mk生成编译目标。

Android系统中至少有一千个Android.mk文件,代表了以前多个模块,在main.mk被加入到编译系统的处理过程中。

posted @ 2022-03-15 19:03  小汀  阅读(159)  评论(0编辑  收藏  举报