您现在的位置是:首页 >学无止境 >Android 系统的分区和文件系统(1)- Android 系统源码结构分析网站首页学无止境
Android 系统的分区和文件系统(1)- Android 系统源码结构分析
声明
- 本文分析Android系统源码各目录存放文件用途。
- 其中参考了一些书籍内容,仅供学习使用。
- 本文采用 LinesgeOS cm-14.1(等同于AOSP Android 7.1.1)
1. 整体结构
各个版本的源码目录基本是类似的,如果是编译后的源码目录,会多一个 out 文件夹用来存储编译产生的文件。LineageOS cm-14.1的系统根目录结构如下表所示:
Android源码目录 | 描述 |
---|---|
abi | abi相关代码 |
art | 全新的 ART 运行环境 |
bionic | 系统 C库 |
bootable | 启动引导相关代码 |
build | 存放系统编译规则及 generic 等基础开发包配置 |
cts | Android 兼容性测试套件标准 |
dalvik | Dalvik 虚拟机 |
developers | 开发者目录 |
developments | 与应用程序开发相关 |
devices | 设备相关配置 |
doc | 介绍开源的参考文档目录 |
external | 开源模组相关文件 |
frameworks | 应用程序框架,Android 系统核心部分,由Java 和 C++编写 |
hardware | 主要是硬件抽象层的代码 |
libcore | 核心库相关文件 |
libnativehelper | 动态库,实现 JNI 库的基础 |
ndk | ndk相关代码 |
out | 编译完成后代码在此目录输出 |
pdk | Plug Development Kit 的缩写,本地开发套件 |
platform_testing | 平台测试 |
prebuilts | X86和ARM 架构下预编译的一些资源 |
sdk | SDK 和模拟器 |
packages | 应用程序包 |
system | 底层文件系统库、应用和组件 |
toolchain | 工具链文件 |
tools | 工具文件 |
vendor | 厂商定制代码 |
makefile | 全局 Makefile 文件,用来定义编译规则 |
2. packages目录
应用层位于整个 Android 系统的最上层,开发者开发的应用程序以及系统内置的应用程序都在应用层。源码根目录中的 packages 目录对应着系统应用层,它的目录结构如下表所示:
packages目录 | 描述 |
---|---|
apps | 核心应用程序 |
experimental | 第三方应用程序 |
inputmethods | 输人法目录 |
providers | 内容提供者目录 |
screensavers | 屏幕保护 |
services | 通信服务 |
wallpapers | 墙纸 |
从目录结构可以发现,packages 目录存放着系统核心应用程序、第三方应用程序和输入法等,这些应用程序都是运行在系统应用层的,因此 packages 目录对应着系统的应用层。
3. 应用框架层部分(frameworks/base)
应用框架层是系统的核心部分,一方面向上提供接口给应用层调用,另一方面向下与C/C++程序库及硬件抽象层等进行衔接。应用框架层的主要实现代码在 fameworks/base 和firameworks/av目录下,其中frameworks/base 目录结构如下表所示:
frameworks/base目录 | 描述 | frameworks/base目录 | 描述 |
---|---|---|---|
api | 全是XML文件,定义API | cmds | 重要命令:am、app_proce 等 |
core | 核心库 | data | 字体和声音等数据文件 |
docs | 文档 | graphics | 与图形图像相关 |
include | 头文件 | keystore | 与数据签名证书相关 |
libs | 库 | location | 地理位置相关库 |
media | 多媒体相关库 | native | 本地库 |
nfc-extras | 与NFC相关 | obex | 蓝牙传输 |
opengl | 2D/3D 图形API | packages | 设置、TTS、VPN 程序 |
sax | XML解析器 | services | 系统服务 |
telephony | 电话通信管理 | test-runner | 测试工具相关 |
tests | 与测试相关 | tools | 工具 |
vr | 与VR相关 | wifi | WiFi无线网络 |
4. 系统服务部分
应用程序框架层大部分的实现代码保存在 frameworks/base/ 目录下,其实在这个目录中还有一个名为 services 的目录,里面的代码是用于实现Android 系统服务的。接下来将详细介绍services目录下的内容,其目录结构如下所示:
dockdroid@x86:services$ tree -L 1
.
├── accessibility
├── Android.mk
├── appwidget
├── backup
├── core //其他重要服务的java层、jni层
├── devicepolicy
├── java
├── midi
├── net
├── print
├── restrictions
├── retaildemo
├── tests
├── usage
├── usb
└── voiceinteraction
dockdroid@x86:server$ tree -L 1
.
├── accounts
├── AlarmManagerService.java //闹钟服务
├── am
├── AnyMotionDetector.java
├── AppOpsPolicy.java
├── AppOpsService.java
├── AssetAtlasService.java
├── AttributeCache.java
├── audio
├── backup //备份服务
├── BasePermissionDialog.java
├── BatteryService.java //电池相关
├── BluetoothManagerService.java //蓝牙
├── BluetoothService.java
├── BrickReceiver.java
├── camera //相机
├── CertBlacklister.java
├── clipboard
├── CommonTimeManagementService.java
├── connectivity
├── ConnectivityService.java
├── ConsumerIrService.java
├── content
├── ContextHubSystemService.java
├── CountryDetectorService.java
├── DeviceIdleController.java
├── DiskStatsService.java //磁盘状态服务
├── display
├── DisplayThread.java
├── DockObserver.java //底座监视服务
├── dreams
├── DropBoxManagerService.java
├── emergency
├── EntropyMixer.java
├── EventLogTags.logtags
├── FgThread.java
├── fingerprint
├── firewall
├── gesture
├── GestureLauncherService.java
├── GraphicsStatsService.java
├── HardwarePropertiesManagerService.java
├── hdmi
├── INativeDaemonConnectorCallbacks.java
├── input
├── InputContentUriTokenHandler.java
├── InputMethodManagerService.java //输入法管理服务
├── IntentResolver.java
├── IoThread.java
├── job
├── lights
├── location
├── LocationManagerService.java //地理位置管理服务
├── LockGuard.java
├── LockSettingsService.java
├── LockSettingsStorage.java
├── LockSettingsStrongAuth.java
├── MasterClearReceiver.java
├── media
├── MmsServiceBroker.java
├── MountServiceIdler.java
├── MountService.java //挂载服务
├── NativeDaemonConnectorException.java
├── NativeDaemonConnector.java
├── NativeDaemonEvent.java
├── NativeDaemonTimeoutException.java
├── net
├── NetPluginDelegate.java
├── NetworkManagementService.java //网络管理服务
├── NetworkScoreService.java
├── NetworkTimeUpdateService.java
├── notification //通知服务
├── NsdService.java
├── os
├── PermissionDialog.java
├── PermissionDialogReqQueue.java
├── PersistentDataBlockService.java
├── PinnerService.java
├── pm
├── policy
├── power
├── QCNsrmAlarmExtension.java
├── RandomBlock.java
├── RecoverySystemService.java
├── SamplingProfilerService.java
├── search
├── SensorNotificationService.java
├── SerialService.java //NFC相关
├── ServiceThread.java
├── ServiceWatcher.java
├── statusbar //状态栏管理服务
├── storage //存储服务
├── SystemService.java
├── SystemServiceManager.java
├── telecom
├── TelephonyRegistry.java
├── TextServicesManagerService.java
├── trust
├── tv
├── twilight
├── UiModeManagerService.java
├── UiThread.java
├── UpdateLockService.java //锁屏更新服务
├── updates
├── utils
├── VibratorService.java //震动器服务
├── vr //vr服务
├── wallpaper //壁纸服务
├── Watchdog.java //看门狗服务
├── webkit
├── WiredAccessoryManager.java //无线设备管理服务
└── wm
从上面的文件夹和文件可以看出,Android 中涉及的服务种类非常多,包括界面、网络、电话等核心模块基本上都有其专属的服务,这些是属于系统级别的服务,这些系统服务一般都会在 Android 系统启动时加载,在系统关闭时结束,受到系统的管理,应用程序并没有权力去打开或者关闭,它们会随着系统的运行一直在后台运行,供应用程序和其他的组件来使用。
另外在 frameworks/av/下面也有一个 services 目录,这个目录下存放的是音频和照相机等服务的实现代码,目录结构如下所示:
dockdroid@x86:frameworks/av/services$ tree -L 1
.
├── audioflinger //音频管理服务
├── audiopolicy
├── camera //相机管理服务
├── mediacodec
├── mediadrm
├── mediaextractor
├── medialog
├── mediaresourcemanager
├── radio
└── soundtrigger
4. 系统程序库部分
系统运行库层(Native)中的 C/C++程序库的类型繁多,功能强大,C/C++程序库并不完全在一个目录中,这些库能被Android 系统中不同的组件使用,通过Android应用程序框架为开发者提供服务。这里给出几个常用且比较重要的 C/C++程序库所在的目录位置,如下表所示:
目录位置 | 描述 |
---|---|
bionic | Google 开发的系统 C库,以 BSD 许可形式开源 |
frameworks/av/media | 系统媒体库 |
frameworks/native/opengl | 第三方图形渲染库 |
frameworks/native/services/surfaceflinger | 图形显示库,主要负责图形的渲染、叠加和绘制等功能 |
external/sqlite | 轻量级关系型数据库 SQLite 的 C++实现 |
Android 运行时库的代码在art/目录中,硬件抽象层的代码在 hardware/目录中,这是手机厂商改动最大的部分,根据手机终端所采用的硬件平台不同会有不同的实现。
5. 底层文件系统库system
system目录包含底层文件系统库、应用及组件:
dockdroid@x86:system$ tree -L 1
.
├── bt //蓝牙相关
├── ca-certificates
├── connectivity
├── core //系统核心工具
├── extras //系统额外工具
├── firewalld
├── gatekeeper
├── keymaster
├── media
├── nativepower
├── netd
├── nvram
├── qcom
├── security
├── sepolicy
├── tools
├── tpm
├── update_engine
├── vold
├── weaved
└── webservd
core目录:
dockdroid@zj-x86:core$ tree -L 1
.
├── adb //adb调试工具
├── adf
├── Android.mk
├── base
├── bootstat
├── CleanSpec.mk
├── cpio //cpio工具,创建img
├── crash_reporter
├── debuggerd //调试工具
├── fastboot //刷机相关
├── fingerprintd
├── fs_mgr
├── gatekeeperd
├── healthd
├── include //系统接口头文件
├── init //init进程
├── libbacktrace
├── libbinderwrapper
├── libcrypto_utils
├── libcutils //libc工具
├── libdiskconfig
├── libion
├── liblog //log库
├── libmemtrack
├── libmemunreachable
├── libmincrypt //加密库
├── libnativebridge
├── libnativeloader
├── libnetutils //网络工具库
├── libpackagelistparser
├── libpixelflinger //图形工具库
├── libprocessgroup
├── libsparse
├── libsuspend
├── libsync
├── libsysutils //系统工具库
├── libusbhost
├── libutils
├── libziparchive
├── lmkd
├── logcat //日志查看工具
├── logd
├── logwrapper //log封装工具
├── metricsd
├── mkbootimg //制作启动boot.img工具
├── MODULE_LICENSE_APACHE2
├── NOTICE
├── reboot
├── rootdir //rootfs包含一些etc下的脚本和配置
├── run-as
├── sdcard
├── toolbox
├── trusty
└── tzdatacheck
extra目录:
dockdroid@x86:extras$ tree -L 1
.
├── alloc-stress
├── Android.mk
├── ANRdaemon
├── boot_control_copy
├── bootctl
├── brillo_config
├── CleanSpec.mk
├── cppreopts
├── cpustats
├── crypto-perf
├── ext4_utils
├── f2fs_utils
├── iotop
├── kexec_tools
├── ksmutils
├── latencytop //软件开发工具
├── libfec
├── libpagemap //pagemap库
├── librank //Java Library Rank System库
├── memcpy-perf
├── memory_replay
├── memtrack
├── micro_bench
├── mkimage
├── mmap-perf
├── multinetwork
├── pagecache
├── perfprofd
├── postinst
├── preopt2cachename
├── procmem //procmem库
├── procrank //Java Library Rank System相关
├── puncture_fs
├── sane_schedstat
├── showmap //showmap工具
├── showslab //showslab工具
├── simpleperf
├── slideshow
├── sound //声音相关
├── squashfs_utils
├── su //su命令
├── systrace_analysis
├── taskstats
├── tests
├── verity
└── zram-perf
可以说,bionic 文件和 system 文件完成了 Android 对 Linux 的封装,并且在二者的基础上构建了Android系统的两大核心模块:Dalvik 和 Framework。
6. 系统运行库
众所周知,Android 系统的应用层是采用 Java 开发的,由于 Java 语言的跨平台特性,Java 代码必须运行在虚拟机中。正是因为这个特性,Android 系统也自己实现了一个类似JVM 但是更适用于入式平台的Java虚拟机,被称为 ART。ART本身是由C++语言实现的,在源码中根目录下有 art 文件夹,里面存放的是 ART 虚拟机的实现代码,其目录结构如下所示:
dockdroid@x86:art$ tree -L 1
.
├── Android.mk
├── benchmark
├── build
├── CleanSpec.mk
├── cmdline
├── compiler
├── dalvikvm
├── dex2oat
├── dexdump
├── dexlist
├── disassembler
├── imgdiag
├── libart_fake
├── MODULE_LICENSE_APACHE2
├── NOTICE
├── oatdump
├── patchoat
├── profman
├── runtime
├── sigchainlib
├── test
└── tools
正是有上面这些代码实现的 Android 虚拟机,所以应用程序生成的二进制执行文件能够快速、稳定地运行在Android 系统上。
7. 硬件抽象层库
Android 的硬件抽象是各种功能的底层实现,理论上不同的硬件平台会有不同的硬件抽象层实现,这一个层次也是和驱动层、硬件层有紧密联系的,起着承上启下的作用,对上要实现应用程序框架层的接口,对下要实现一些硬件基本功能,以及调用驱动层的接口。需要注意的是,这一层也是广大OEM厂商改动最大的一层,因为这一层的代码和终端采用什么样硬件的硬件平台有很大关系。源码中存放的是硬件抽象层框架的实现代码和一些平台无关性的接口的实现。硬件抽象层代码在源码根目录下的 hardware文件夹中,其目录结构如下所示:
dockdroid@x86:hardware$ tree -L 1
.
├── akm
├── broadcom
├── cyanogen
├── google
├── intel
├── invensense
├── libhardware
├── libhardware_legacy
├── marvell
├── qcom
├── ril
├── ril-caf
└── ti
关于HAL库的分析可以参考我的专栏:Android系统的HAL层分析