Android系统架构与分层如下:
图1 Android系统架构与分层
软件从底层到上层分为:Uboot,Linux Kernel和Android OS。
1 Uboot
将flash中的kernel搬到内存,引导kernel的启动;而cpu会引导uboot的启动,cpu中有一段固化的rom,可以从usb,sdcard,flash中引导uboot启动。
2 Linux Kernel
将底层硬件抽象为文件,向上提供接口。
3 Android OS
从底层到上层分为:
3.1 Hal
将主要外设抽象成一套接口,供Framework(C++)层调用。若底层硬件变动,Hal与Framework(C++)之间的接口不会改变,可能改变的是Hal层调用Linux Kernel层驱动的方式。
3.2 Framework(C++)
对上Framework(Java)提供服务,对下对接Hal层。
3.3 ThirdParty Library
libjpeg,libpng,skia,opengl,webkit等。
3.4 Dalvik
使用Java写app(Java写代码的效率和复用率高于C++),同时提供内存管理。
3.5 Framework(Java)
ActivityManger,WindowsManger,PackageManger,WifiManager等。
3.6 App
基于Java实现,运行在Dalvik虚拟机之上。
4 Android代码目录说明
目录 | 说明 |
bionic | C库 |
build | 编译系统规则 |
cts | 兼容性测试 |
dalvik | java虚拟机 |
external | Android引入的第三方模块 |
frameworks | 框架层 |
hardware | 硬件适配层(hal) |
system | 底层系统文件库 |
device | 产品目标 |
out | 编译生成目标文件 |
sdk | android原生sdk |
packages/app | android原生app |
5 编译
5.1 source build/envsetup.sh
(1)加载编译命令
如lunch,mm等,加载后编译命令才可用。
(2)加载平台分支信息
5.2 lunch
选择特定的平台分支,配置到环境变量里(export)。
特定分支的mk会把特定分支的某些文件(device/.../目录下)拷贝到编译输出目录out下。
5.3 make -j16
全编译源码
如果要编译单个模块libpng:
(1)mmm /external/libpng
(2)mm 需要先进入到/external/libpng目录下,再mm