了解Android文件目录是开发的基础,也是对后续打下基础。
abi(Application Binary Interface)
应用程序二进制接口,就是abi架构,定义了一套规则,决定了二进制文件如何与系统进行交互。
常见的abi架构有 armeabiv-v7a arm64-v8a armeabi x86 x86_64
不同的cpu支持不同的架构,大部分的cpu都是向前兼容的
在Android手机上安装一个应用时,只有手机CPU架构支持的ABI架构对应的.so文件会被安装。
如果支持多个ABI架构,会按照优先级进行安装。
但是abi目录中掩盖了各种细节·
调用约定控制着函数的参数如何传送以及如何接受返回值;
系统调用的编码和一个应用如何向操作系统进行系统调用;
以及在一个完整的操作系统ABI中,对象文件的二进制格式、程序库等
***so
so库是Linux系统上使用的共享库
Android中的so文件是动态链接库,是二进制文件,即ELF文件,是ELF格式文件。多用于NDK开发中(ndk:工具开发包)
so文件的加载有且仅有两种方式:
load(),传参为是一个String类型,不过内容是有要求的,是要so文件的绝对路径,,比如说:/system/lib64/libc++.so 。
loadLibrary()
art(Android runtime)
ART运行环境,这个是安卓5.0之后的特性 之前使用的是Dalvik
Dalvik虚拟机是专门为移动设备定制的,允许在有限的内存中同时运行多个虚拟机的实例,
并且每一个Dalvik 应用作为一个独立的Linux 进程执行。
独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。
在Dalvik下,应用每次运行的时候,字节码都需要通过即时编译器转换为机器码,
这会拖慢应用的运行效率。
而在ART 环境中,应用在第一次安装的时候,
字节码就会预先编译成机器码,使其成为真正的本地应用
bionic
一些基础库 Android的C library 包括:libc, libm, libdl ,libstd++,libthread_db
以及Android特有的链接器linker。
:bionic 就是NDK 的 API
*** Bionic C库不以任何方式与其他标准C库二进制兼容,这意味着基于其他C库生成的二进制文件不应该与Bionic进行动态链接
libc :最基础的库,提供了所有系统的基本功能,进程线程内存管理、时间时区管理、环境变量等
libm :数学函数库,数学函数和浮点运算,速度慢,避免使用。
libdl:动态库的装载,当只是空壳,应用进程使用的dlopen等函数实际上是在linker模块中实现的。
libstdc++ :标准的c++库,,只是new、delete等少数几个操作符的实现
linker:装载动态库以及用于库的重定位
bootable
bootable 下仅包含 recovery 此文件夹,其实就是启动 Android recovery 模式相关的代码
底下有三个文件夹
bootloader/lk //adb命令实现 cpu架构 设备驱动 头文件 主文件 库文件 平台文件 mk文件 文件 脚本文件 目标设备文件
diskinstaller //打包镜像
recovery // 由bootLoader启动,主要用来更新系统 一些压缩工具 资源
build
Android Build 系统,用来定制各种编译规则。存放系统编译规则及generic等基础开发包配置。
主要由 makefile 组成,还有envsetup.sh文件
他的custom_strip文件夹下面还有pl脚本,应该是用来打包img文件的
cts(Compatibility Test Suite)
当用户定制自己特定的系统时,可能会对系统进行不规范的更改,而只有通过cts测试的系统才能颁布许可证,所以一个自动化测试工具 CTS确保 make 出来的系统没问题。
编译cts:
可以单独编译这个cts文件夹 make cts命令来编译CTS
之后会在out/host/linux-x86/cts/下生成android-cts文件夹
eg:下载Android-2.1系统,并编译。
$ . build/envsetup.sh //配置选项,并编译android源码
$ make cts
运行cts:
在android-cts目录下会有3个文件夹,其中一个是tools。
进入tools目录,输入./startcts来启动CTS
dalvik
Android.mk: 是虚拟机编译的makefile文件
vm:此目录包含虚拟机绝大多数代码,包括虚拟机初始化及内存管理的代码
dx:此目录是生成将Java字节码转换为Dalvik机器码的工具
hit:此目录是生成显示堆栈信息/对象信息的工具
libdex: 此目录是生成主机和设备处理dex文件的库
dexopt:此目录是生成dex优化工具
dexdump:此目录是生成dex文件反编译查看工具
dexlist:此目录是生成查看dex文件里所有类的方法的工具
*** mk = makefile 文件–好处:自动化编译
(1)指定文件先后编译的顺序,或者文件是否需要重新编译
developers
主要是一些可运行的 Android 示例项目,可以单独拉出来运行
development
一些工具性的东西和开发者需要的一些例子
device
包含不同品牌手机独有的设备信息
docs
仅包含此文件夹,该文件夹下相关文件就是生成 source.android.com 站点的具体素材及代码
external
开源模块组相关文件:如glide、junit、okhttp、sqlite 等
frameworks
应用程序框架层是系统的核心部分,一方面向上提供接口给应用层调用
另一方面向下与C/C++程序库以及硬件抽象层等进行衔接
包括摄像头服务 电话通讯管理、wifi、电源、gps、背光等
hardware
主要包含了 android HAL(硬件抽象层)相关代码。
硬件抽象层介于 Linux内核驱动程序与 Android 系统之间。
对 Linux 驱动进行了封装,使操作系统级别可以忽略底层实现的细节
其中base文件夹是应用框架层的核心部分
libcore
一些核心库 包括json库 xml解析库
libnativehelper
Android动态库 JNI 相关的一些类
里面include文件夹下面一堆.h文件
与VM无关的本机函数,用于实现系统的方法的类库
ndk(Plug Development Kit )
原生开发工具包
ndk-build : 该shell脚本是Android NDK构建系统的起点
build:包含ndk构建系统的所有模块
ndk-stack:该Shell脚本可以帮助分析Native代码崩溃时的堆栈信息
***ndk:一系列工具合集,ndk提供了一份稳定、功能有限的API头文件声明。
out
编译完后输出的所有相关文件都位于此文件夹下,
包括生成的各种 img 就位于 out/target/product/hammerhead 下
(1)host
主机生成的工具
(2)target
目标机运行的内容
common 通用内容 :resource 资源文件、obj 目标文件
product 针对产品的内容 : data 数据文件系统
packages
应用程序包,各种内置的 apk、ContentProvider、输入法、壁纸等
文件夹例如有:
apps:应用程序库
wallpaper:壁纸
screensaver:屏幕保护
providers:内容提供者目录 :TvProvider、MediaProvider
services:通信服务
pdk(Platform Development Kit)
平台开发套件,仅包含了一些供硬件抽象层开发使用的必要组件,
供一些 OEM 厂商用来适配及测试最新的Android 系统,加快第三方厂商的更新速度。
加快OEM厂商的update速度
platform_testing
平台相关的一些测试用例
prebuilts
一些预构建成二进制的库 prebuilts
其中关于 build 时 bison 问题的主角就位于 prebuilts/misc/darwin-x86 下的 bison。
sdk
应用程序开发工具箱中工具源代码(sdk和模拟器)
存放Google的api 编译工具 和 临时文件 。
***SDK:很多功能函数的集合体。软件开发工具包,开发某一项功能后封装起来,供其他使用。如:数据分析sdk就是能实现数据分析功能的一个工具包。
system
Android 的部分系统源码及一些工具,主要是在各种 java 启动程序起来前的部分。
工具比如 adb、fastboot、keystore 等,其他如 mkbootimg、init 进程等。
蓝牙 一些核心接口 工具库
tools
Android中的工具文件
例如:gradle工具包
toolchain
Android 工具链
vendor
厂家定制的内容mtk
来存放app源码
还有mtk厂商定制的内容
kernel
安卓内核
***操作系统内核(Kernal)是一组应用软件,这个软件能够控制所有硬件及计算机活动例如:硬盘访问、网卡传输和键盘开始工作。
mediatek
Mtkt提供的各种解决框架方案的代码
包括一些应用程序
zl
不同主板定制的内容
包括内核配置
bootloader程序配置