您现在的位置是:首页 >学无止境 >Android 系统的分区和文件系统(1)- Android 系统源码结构分析网站首页学无止境

Android 系统的分区和文件系统(1)- Android 系统源码结构分析

小馬佩德罗 2023-06-19 20:00:02
简介Android 系统的分区和文件系统(1)- Android 系统源码结构分析

声明

  • 本文分析Android系统源码各目录存放文件用途。
  • 其中参考了一些书籍内容,仅供学习使用。
  • 本文采用 LinesgeOS cm-14.1(等同于AOSP Android 7.1.1)

1. 整体结构

  各个版本的源码目录基本是类似的,如果是编译后的源码目录,会多一个 out 文件夹用来存储编译产生的文件。LineageOS cm-14.1的系统根目录结构如下表所示:

Android源码目录描述
abiabi相关代码
art全新的 ART 运行环境
bionic系统 C库
bootable启动引导相关代码
build存放系统编译规则及 generic 等基础开发包配置
ctsAndroid 兼容性测试套件标准
dalvikDalvik 虚拟机
developers开发者目录
developments与应用程序开发相关
devices设备相关配置
doc介绍开源的参考文档目录
external开源模组相关文件
frameworks应用程序框架,Android 系统核心部分,由Java 和 C++编写
hardware主要是硬件抽象层的代码
libcore核心库相关文件
libnativehelper动态库,实现 JNI 库的基础
ndkndk相关代码
out编译完成后代码在此目录输出
pdkPlug Development Kit 的缩写,本地开发套件
platform_testing平台测试
prebuiltsX86和ARM 架构下预编译的一些资源
sdkSDK 和模拟器
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文件,定义APIcmds重要命令:am、app_proce 等
core核心库data字体和声音等数据文件
docs文档graphics与图形图像相关
include头文件keystore与数据签名证书相关
libslocation地理位置相关库
media多媒体相关库native本地库
nfc-extras与NFC相关obex蓝牙传输
opengl2D/3D 图形APIpackages设置、TTS、VPN 程序
saxXML解析器services系统服务
telephony电话通信管理test-runner测试工具相关
tests与测试相关tools工具
vr与VR相关wifiWiFi无线网络

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++程序库所在的目录位置,如下表所示:

目录位置描述
bionicGoogle 开发的系统 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层分析

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。