接下来就进行源码编译的过程,这里会按照一个正规的流程往下走,并说说某些阶段所做的事情以及一些常见的错误
一、目录结构
在编译之前,我们先了解了解android源码的目录结构,先看下面的图:
目录解析
abi | 应用程序二进制接口,生成libgabi++.so相关库文件 |
vendor | 各个厂商定制的相关文件,如驱动等 |
boinic | Android的C library,即C库文件 |
bootable | Android系统启动引导相关代码 |
build | 存放系统编译规则及generic等基础开发包配置 |
cts | Android兼容性测试套件标准 |
tool | 一些工具的 |
developers | 开发者目录(包含一些事例) |
development | 应用程序开发相关的工具等 |
device | 设备相关的抽象 |
docs | 指导文档 |
external | android使用到的一些开源的东西 |
frameworks | android核心框架,包含了java代码以及c代码 |
hardware | 硬件相关的HAL代码 |
libcore | 核心库 |
libnativehelper | JNI调用相关的库 |
ndk | ndk开发相关 |
out | 编译后资源输出文件夹 |
packges | 应用程序包 |
sdk | sdk以及模拟器存放目录 |
其实这些东西大家随意看看就好,因为大部分目录都不需要我们去动,而android开发人员动得比较多的可能也就frameworks跟packges。其他的可以等到有具体需求的时候再去研究。
二、编译过程简介
1、下面的链接是官方的编译过程介绍
网址:http://source.android.com/source/building.html
2、首先这里要说明的是,官方所给出的编译过程仅仅是告诉你如何去编译一个通用型的系统而已,如果你需要根据自己的产品进行定制的话,还是需要对整个编译的过程有比较深入的了解的。
3、google给出的几个编译步骤其实很明确,我们接下来就根据这几个步骤进行,并展开说明
- source build/envsetup.sh:初始化编译环境,加载相关命令
- lunch:选择平台编译选项
- make -j8:执行编译(其中-j参数表示指定编译线程数,建议cpu核心数乘2即可)
三、envsetup.sh都做了些什么?
在分析envsetup.sh之前,我们先看看两个小问题:
1、执行该脚本时有些退linux不是很熟悉的朋友经常会碰到envsetup.sh文件无可执行权限问题,使用下面命令加上即可:
$chmod a+x envsetup.sh
2、还有一个问题是经常出现的build/envsetup.sh: 1: Syntax error: "(" unexpected,别慌,由于我们使用的是Ubuntu,而Ubuntu默认使用的shell环境是dash,而envsetup.sh默认是指定bash的,所以我们只需要将dash切换到bash即可:
执行$sudo dpkg-reconfigure dash命令,并选择“否”,最好重新打开终端
3、我们先看看,执行了source build/envsetup.sh后有什么效果:
我们很直观的看到,直接includ了很多shell脚本,光看这里看不出什么,我们不妨看看源码!
# Execute the contents of any vendorsetup.sh files we can find.
for f in `test -d device && find -L device -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort` \
`test -d vendor && find -L vendor -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort`
do
echo "including $f"
. $f
done
unset f
上面的脚本代码依次查找{device, vendor, product}目录下的vendorsetup.sh文件,并分别导入到当前环境中来!至于这些sh到底有什么用,在编译第二阶段的时候再将!
4、我们继续翻envsetup.sh的源码你会发现,一直在定义函数而这些函数有很多我们会是我们后面直接用到的,比如说lunch、mm、mmm等等。
总结:所以综合来说,android源码编译的第一个阶段主要做了两件事,第一就是加载相关的vendorsetup.sh文件,第二就是定义后续编译相关的函数。