声明

  • 本文分析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层分析

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

  1. 基于Android公交查询系统的设计与实现(论文+程序设计源码+数据库文件)

    [摘 要]随着互联网的技术的不断更新发展,人们生活节奏也在不断的加快,对于网络的依赖也越来越紧密,尤其是在等公交,经常会错过班次,但又不知道,下次班次几点发车,这样会导致乘客花掉大把时间在等待,如果可 ...

  2. (转)Android 源码结构分析

    Android 2.1 源码结构分析 Android 2.1总目录 |-- Makefile |-- bionic               (bionic C库) |-- bootable     ...

  3. Android Jetpack架构组件之 Room(使用、源码篇)

    2019独角兽企业重金招聘Python工程师标准>>> 1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发 ...

  4. 【Android 插件化】Hook 插件化框架 ( 从源码角度分析加载资源流程 | Hook 点选择 | 资源冲突解决方案 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  5. Android Glide图片加载框架(二)源码解析之with()

    文章目录 一.前言 二.如何阅读源码 三.源码解析 1.with() Android Glide图片加载框架系列文章 Android Glide图片加载框架(一)基本用法 Android Glide图 ...

  6. Android悬浮窗开启 适配所有机型(附源码)

    Android悬浮窗开启 适配所有机型(附源码) 1.开启悬浮窗权限 清单文件中添加: <uses-permission android:name="android.permissio ...

  7. android飞行射击游戏代码,android 3D飞行射击游戏《夜鹰行动》源码

    压缩包内容概览: android 3D飞行射击游戏<夜鹰行动>源码-airattacker ; 清单 ; 资产 ; 项目 ; 飞骥11 ; 飞骥22 ; 飞骥33 ; 折叠按钮 ; 弗雷格 ...

  8. Android安卓餐盘颜色识别快餐计费解决方案源码

    Android安卓餐盘颜色识别快餐计费解决方案源码 最近了解到一个项目需要识别餐盘.在人工智能发展到的今天识别菜品确实没有问题,但是对于实际商用就会涉及到较多问题,比如:1.虽然菜品已经有成熟训练模型 ...

  9. 直播App中Android酷炫礼物动画如何通过直播程序源码实现方案

    直播App中Android酷炫礼物动画如何通过直播程序源码实现方案 这个动画,如果输出成GIF的话,要3MB,尺寸是750*750.在上一篇文章中已经介绍过几种被否掉的方法,这里再稍作补充说明,如果使 ...

  10. Nexus 6 编译并刷机 Android 7.1.1 AOSP以及常用的修改源码快速验证方法

    一.编译相关资源链接 设备硬件二进制文件 Android分支支持设备列表 搭建构建环境 初始化源码仓库 repo init -u https://android.googlesource.com/pl ...

最新文章

  1. Kernel i2c gpio spi pinctrl platform 分析讲解 (未完待续)
  2. windows mysql 主从_mysql读写分离实战二-windows 上mysql主从数据库搭建及问题总结
  3. MongoDB资料大全
  4. ES6的变量声明详述
  5. c语言在线编译器_C语言和汇编语言是什么?他们之间可以有怎样的合作?为你解析...
  6. Python中的str与unicode处理方法
  7. 全套学习!mysql命令窗口执行sql文件
  8. java学习(7):巩固练习
  9. idea没有代码自动提示功能和包自动引入不了问题
  10. 线性代数很重要,选对教材更重要:同济版《线性代数》引发激烈争议
  11. 软件工程专业的论文答辩_软件工程专业本科毕业答辩?
  12. 项目管理里面的十大知识领域
  13. Android 怎样默认打开便携式WIFI热点 M
  14. linux跟单片机的区别,树莓派和单片机的区别
  15. 怎么把wav文件改成mp3?
  16. web3py earliest、latest、pending
  17. mac mini 储存文件的服务器,另一种“NAS”的玩法---mac系统的远程管理和文件共享...
  18. 菜鸟应用-手机应用在线制作平台,手机应用,APP开发,手机软件开发
  19. Ubuntu系统入门
  20. 美通社企业新闻汇总 | 2019.2.26 | 华为企业业务首登MWC发布数字平台;爱茉莉与屈臣氏达成战略合作...

热门文章

  1. iOS 根据颜色生成图片
  2. Fluent在服务器上的并行
  3. 信息系统建设和服务能力等级证书(CS)
  4. 申请苹果开发者账号(个人,公司)所需资料
  5. 微商怎么在百度引流?微商百度引流怎么做?
  6. 如何做好百度知道和操作流程
  7. 即时通讯-Android推送方案(MQTT)
  8. Java Web学习笔记(二)密码一致性检测的实现
  9. etc/sysconfig/selinux与/etc/selinux/config 区别
  10. sleep和wait区别