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被加入到编译系统的处理过程中。
本文来自博客园,作者:小汀,转载请注明原文链接:https://www.cnblogs.com/1118zjg/p/16009881.html