顶层目录结构分析
编者:厦门大学信息学院通信工程系2015级研究生 吴泽石、谭云生、郑明炀
源码目录: bdk/
4.1 bdk目录概述
bdk目录下的文件
每个文件/文件夹作用
文件夹/文件名 | 作用 |
---|---|
abi | abi相关代码。ABI:application binary interface,应用程序二进制接口 |
bionic | bionic C库 |
bootable | 启动引导相关代码 |
build | 存放系统编译规则及generic等基础开发配置包 |
device | 是类似android系统用来运行updater-scripts(刷机脚本)的Edify语言 |
external | brillo使用的一些开源的模组 |
frameworks | 核心框架--C语言,是brillo应用程序的框架。 |
hardware | 主要是硬件适配层HAL代码 |
libnativehelper | 安卓类库的支持函数 |
prebuilts | x86和arm架构下预编译的一些资源 |
product | 一些简单的例程 |
system | 文件系统、应用及组件 |
tools | 默认的OTA升级是指系统提供的标准软件升级方式 |
vendor | 产商提供bsp(板级支持包)存放的目录 |
4.2 部分目录详细分析
4.2.1 abi
应用程序二进制接口(application binary interface,ABI) 描述了应用程序和操作系统之间,一个应用和它的库之间,或者应用的组成部分之间的低接口 。ABI不同于API ,API定义了源代码和库之间的接口,因此同样的代码可以在支持这个API的任何系统中编译 ,然而ABI允许编译好的目标代码在使用兼容ABI的系统中无需改动就能运行。 ABI掩盖了各种细节,例如:调用约定控制着函数的参数如何传送以及如何接受返回值;系统调用的编码和一个应用如何向操作系统进行系统调用;以及在一个完整的操作系统ABI中,对象文件的二进制格式、程序库等等。一个完整的ABI,像 Intel二进制兼容标准 (iBCS) ,允许支持它的操作系统上的程序不经修改在其他支持此ABI的操作体统上运行。
4.2.2 bionic
Bionic是Android的C library。libc是GNU/Linux以及其他类Unix系统的基础函数库,最常用的就是GNU的libc,也叫glibc。Android之所以采用bionic而不是glibc,有几个原因:
- 版权问题,因为glibc是LGPL
- 库的体积和速度,bionic要比glibc小很多。
- 提供了一些Android特定的函数,getprop LOGI等
4.2.3 bootable
bootable中只包含recovery文件夹,也就是用于系统的恢复使用。 该目录包含以下结构:
文件夹 | 作用 |
---|---|
Applypatch | 文件夹是应用补丁 |
Edify | 是类似android系统用来运行updater-scripts(刷机脚本)的Edify语言 |
Etc | 是保存系统的配置文件 |
Fonts | 系统字体文件 |
Minadbd | 在android中使用mina框架处理socket通信方法 |
adb | 本身是一个客户端 |
Minui | 在recovery的UI显示部分应用层调用minui库实现了图形的描绘以及固定大小的文字显示 |
Minzip | 提供简单的Zip文件支持 |
Mtdutils | 是mtd-utils工具如使用mtd-util工具向nand flash写入文件系统jffs2.img |
Otafault | 默认的OTA升级是指系统提供的标准软件升级方式 |
res-560dpi、res-hdpi、res-mdpi、res-xhdpi、res-xxhdpi、res-xxhdpi | 不同像素的图片资源 |
Tests | 测试文件 |
Tools | 工具包 |
Uncrypt | 在系统recovery时如果系统是加密的就解密 |
Updater | 在recovery中使用updater脚本来完成升级 |
update_verifier | 更新认证 |
update_verifier | 是操作系统内核运行之前运行的可以初始化硬件设备建立内存空间映射图从而将系统的软硬件环境带到一个合适状态以便最终调用操作系统内核 |
4.2.4 build
build子目录存放编译系统的核心代码,build主要文件结构如下所示:
文件夹 | 作用 |
---|---|
buildspec.mk.default | buildspec的模版文件,可定义一些变量比如TARGET_BUILD_VARIANT:=user,TARGET_BUILD_TYPE:=release |
CleanSpec.mk | 增量编译时,会执行该文件里的命令,这些命令一般用于清除中间文件 |
core | 编译系统的核心文件放在该目录,主要是一些makefile |
envsetup.sh | 编译时需先用source envsetup.sh设置好环境变量,该脚本提供了许多有用的命令,比如cout,croot,cgrep,在详细介绍Android编译步骤时会列出来 |
libs | 是一个C++模块,编译后可生成libhost.a静态库,里面的函数主要用于与编译主机交互 |
target | 包含编译目标相关的makefile,它有两个子文件夹 board和product,产品都在该目录下定义,比如generic,full产品,定义设备产品时,会从这里继承产品 |
tools | 各种工具,多数使用python编写,工具有用于签名的signpak, 用于下载device配置的roomservice.py等,后续将详细介绍 |
4.2.5 product
由google官方提供的基本例程。包括一个common 目录,提供简单接口如gpio、i2c、keyboard等基础组件。以及一个services使用的例程example-ledflasher。本次实验的实践部分就是通过修改ledflahser服务完成的。
4.2.6 tools
工程编译过程中方便使用的小工具,特别是brunch,可以通过brunch的指令bsp、config、product等对源码或者环境进行管理。
4.2.7 vendor
该目录是对应产商提供bsp(板级支持包)存放的目录。edison板子由intel提供,因此里面存放的是edsion板子uboot固件以及蓝牙和wifi的驱动。