Android系统源码 目录结构

前言:Android官方在线看源码地址

https://cs.android.com/

image.png

1.Android系统架构

Android系统架构分为五层,从上到下依次是应用层、应用框架层、系统运行库层、硬件抽象层和Linux内核层。

image.png

AOSP 架构

AOSP 的软件堆栈包含以下层:
image.png
图 1. AOSP 软件堆栈架构。

下面列出了图 1 中使用的术语的定义:

  • Android 应用

    完全使用 Android API 开发的应用。Google Play 商店广泛用于查找和下载 Android 应用,不过也有许多其他替代方案。在某些情况下,设备制造商可能希望预安装 Android 应用以支持设备的核心功能。如果您对开发 Android 应用感兴趣,请访问 developers.android.com

  • 特权应用

    使用 Android 和系统 API 组合创建的应用。这些应用必须作为特权应用预安装在设备上。

  • 设备制造商应用

    结合使用 Android API、系统 API 并直接访问 Android 框架实现而创建的应用。由于设备制造商可能会直接访问 Android 框架中的不稳定的 API,因此这些应用必须预安装在设备上,并且只能在设备的系统软件更新时进行更新。

  • 系统 API

    系统 API 表示仅供合作伙伴和 OEM 纳入捆绑应用的 Android API。这些 API 在源代码中被标记为 @SystemApi。

  • Android API

    Android API 是面向第三方 Android 应用开发者的公开 API。如需了解 Android API,请参阅 Android API 参考文档

  • Android 框架

    构建应用所依据的一组 Java 类、接口和其他预编译代码。框架的某些部分可通过使用 Android API 公开访问。框架的其他部分只能由 OEM 通过系统 API 来访问。Android 框架代码在应用进程内运行。

  • 系统服务

    系统服务是重点突出的模块化组件,例如 system_server、SurfaceFlinger 和 MediaService。Android 框架 API 提供的功能可以与系统服务进行通信,以访问底层硬件。

  • Android 运行时 (ART)

    AOSP 提供的 Java 运行时环境。 ART 会将应用的字节码转换为由设备运行时环境执行的处理器专有指令。

  • 硬件抽象层 (HAL)

    HAL 是一个抽象层,其中包含硬件供应商要实现的标准接口。借助 HAL,Android 可以忽略较低级别的驱动程序实现。借助 HAL,您可以顺利实现相关功能,而不会影响或更改更高级别的系统。如需了解详情,请参阅 HAL 概览

  • 原生守护程序和库

    该层中的原生守护程序包括 inithealthdlogdstoraged。这些守护程序直接与内核或其他接口进行交互,并且不依赖于基于用户空间的 HAL 实现。

    该层中的原生库包括 libclibloglibutilslibbinderlibselinux。这些原生库直接与内核或其他接口进行交互,并且不依赖于基于用户空间的 HAL 实现。

  • 内核

    内核是任何操作系统的中心部分,并与设备上的底层硬件进行通信。尽可能将 AOSP 内核拆分为与硬件无关的模块和特定于供应商的模块。如需了解 AOSP 内核组件的说明(包括其定义),请参阅内核概览

image.png

应用层

系统内置的应用程序以及非系统级的应用程序都是属于应用层。负责与用户进行直接交互,通常都是用Java进行开发的。

应用框架层(Java Framework)

应用框架层为开发人员提供了可以开发应用程序所需要的API,我们平常开发应用程序都是调用的这一层所提供的API,当然也包括系统的应用。这一层的是由Java代码编写的,可以称为Java Framework。下面来看这一层所提供的主要的组件。

名称功能描述
Activity Manager(活动管理器)管理各个应用程序生命周期以及通常的导航回退功能
Location Manager(位置管理器)提供地理位置以及定位功能服务
Package Manager(包管理器)管理所有安装在Android系统中的应用程序
Notification Manager(通知管理器)使得应用程序可以在状态栏中显示自定义的提示信息
Resource Manager(资源管理器)提供应用程序使用的各种非代码资源,如本地化字符串、图片、布局文件、颜色文件等
Telephony Manager(电话管理器)管理所有的移动设备功能
Window Manager(窗口管理器)管理所有开启的窗口程序
Content Providers(内容提供器)使得不同应用程序之间可以共享数据
View System(视图系统)构建应用程序的基本组件

表1

系统运行库层(Native)

系统运行库层分为两部分,分别是C/C++程序库和Android运行时库。下面分别来介绍它们。

1.C/C++程序库

C/C++程序库能被Android系统中的不同组件所使用,并通过应用程序框架为开发者提供服务,主要的C/C++程序库如下表2所示。

名称功能描述
OpenGL ES3D绘图函数库
Libc从BSD继承来的标准C系统函数库,专门为基于嵌入式Linux的设备定制
Media Framework多媒体库,支持多种常用的音频、视频格式录制和回放。
SQLite轻型的关系型数据库引擎
SGL底层的2D图形渲染引擎
SSL安全套接层,是为网络通信提供安全及数据完整性的一种安全协议
FreeType可移植的字体引擎,它提供统一的接口来访问多种字体格式文件

表2

2.Android运行时库

运行时库又分为核心库和ART(5.0系统之后,Dalvik虚拟机被ART取代)。核心库提供了Java语言核心库的大多数功能,这样开发者可以使用Java语言来编写Android应用。相较于JVM,Dalvik虚拟机是专门为移动设备定制的,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik 应用作为一个独立的Linux 进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。而替代Dalvik虚拟机的ART 的机制与Dalvik 不同。在Dalvik下,应用每次运行的时候,字节码都需要通过即时编译器转换为机器码,这会拖慢应用的运行效率,而在ART 环境中,应用在第一次安装的时候,字节码就会预先编译成机器码,使其成为真正的本地应用。

硬件抽象层(HAL)

硬件抽象层是位于操作系统内核与硬件电路之间的接口层,其目的在于将硬件抽象化,为了保护硬件厂商的知识产权,它隐藏了特定平台的硬件接口细节,为操作系统提供虚拟硬件平台,使其具有硬件无关性,可在多种平台上进行移植。 从软硬件测试的角度来看,软硬件的测试工作都可分别基于硬件抽象层来完成,使得软硬件测试工作的并行进行成为可能。通俗来讲,就是将控制硬件的动作放在硬件抽象层中。

Linux内核层

Android 的核心系统服务基于Linux 内核,在此基础上添加了部分Android专用的驱动。系统的安全性、内存管理、进程管理、网络协议栈和驱动模型等都依赖于该内核。
Android系统的五层架构就讲到这,了解以上的知识对以后分析系统源码有很大的帮助。

2.Android系统源码目录

我们要先了解Android系统源码目录,为后期源码学习打下基础。关于源码的阅读,你可以访问http://androidxref.com/来阅读系统源码。当然,最好是将源码下载下来。下载源码可以使用清华大学开源软件镜像站提供的Android 镜像:https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/ 。如果觉得麻烦也可以查找国内的网盘进行下载,推荐使用该百度网盘地址下载:http://pan.baidu.com/s/1ngsZs,它提供了多个Android版本的的源码下载。

整体结构

各个版本的源码目录基本是类似,如果是编译后的源码目录会多增加一个out文件夹,用来存储编译产生的文件。Android7.0的根目录结构说明如下表所示。

Android源码根目录描述
abi应用程序二进制接口
art全新的ART运行环境,Android5.0之后java虚拟机就使用ART
bionic系统C库,Android改造的C/C++库, 比传统的glibc更精简,不受GPL限制,支持 pthread_cancel(), 不支持C++ exception和C++ STL模板编程
bootable启动引导相关代码 包含了recovery程序(恢复出厂/升级)的代码
build存放系统编译规则及generic等基础开发包配置 Android编译系统,定义了各种编译规则,并包含通用产品配置
ctsAndroid兼容性测试套件标准,CTS 是一个自动化测试套件,包含PC端和设备端(被测设备), 对手机的硬件,软件,接口,性能进行测试 ,测试项目包含平台 API 测试,平台 Intent,蓝牙设备的连接状况, 相机拍照功能等,通过make cts编译, out/host/linux-x86/cts/下生成android-cts文件夹。由于Android是开源的,对于Google Android的开发联盟中的Motorola、Samsung、Qualcomm 、Sony Ericsson、中国移动、ZTE、华为等,底层的代码也是开放的。手机制造商及运营商可以在Android上打造,定制自己特有的手机操作系统,这势必在源码级别上对Android系统进行代码的添加和更改。如果不规范这些更改则会给上层的应用开放的移植带来问题(那个时候你会看到MOTO上跑的愤怒的小鸟会在三星的Android手机上运行不了,每个应用需要都要发布不同厂商的Android手机的版本),只有通过CTS测试的Android手机系统,Google才会颁发许可,以保证不同生产商之间的Android系统的兼容
dalvikAndroid Dalvik虚拟机相关内容,主要是提供了一下工具,如dexdump, vm主代码已经移除
developers开发者目录, 一些应用程序的参考实例demo代码
development应用程序开发相关 提供应用开发的工具, 应用例子,monkey命令,shell脚本和python脚本:development/scripts/stack:用于展开进程异常时的堆栈信息, 配合tombstone文件development/scripts/gdbclient.py: 用于gdb调试development/scripts/native_heapdump_viewer.py脚本将dumpheap进程结果转换成更易读的html格式development/tools/make_keys: 系统签名生成器development/tools/idegen: 用于生成android.ipr、android.iml IEDA工程配置文件,可以用android studio来导入android源码
device设备相关配置 设备产品定制目录, 该目录是厂商和产品公司定制文件比较多的地方
vendor厂商定制目录,该目录可以新建出来
docs参考文档目录
external开源模组相关文件 外部第三方开源的库和工具,比如ppp, wpa_supplicant, libz, libcurl等
frameworks应用程序框架,Android系统核心部分,由Java和C++编写, 包括各种系统资源, 后台服务, SystemUI, 大部分都是java代码, 同时也包含了各种子系统的native代码, 如av, net等
hardware主要是硬件抽象层的代码, 如gps, wifi, viberate
kernel内核源码,厂商可以将内核源码集成到该目录
libcore核心库相关文件 Android 系统中支持众多 Java 标准的库,例如 java.lang 包,libart库,JSON库
libnativehelper动态库,实现JNI库的基础 ,JNI编程时调用的各种接口实现代码, 如findClass(), 最终编译成libnativehelper.so
ndkNDK相关代码,帮助开发人员在应用程序中嵌入C/C++代码
out编译完成后代码输出在此目录
packages应用程序包,系统内置的app源码, 如设置, 墙纸,输入法,屏保等,apps:核心应用程序,inputmethods:输入法目录,providers:内容提供者目录,screensavers:屏幕保护,services:通信服务,wallpapers:墙纸
pdkPlatform Development Kit 的缩写,平台开发套件, PDK的目标是帮助芯片组供应商和原始设备制造商迁移到新的版本。在PDK推出之前,未能参与Google早期开发设备计划的OEM厂商和半导体供应商必须等到Android开源版本公布后,才能开始进行开发。而从Jelly Bean,也就是Android 4.1版本开始Google在发布新的Android版本之前会Release给与其签约过的OEM厂商和半导体供应商PDK(PDK的获取需要授权,因为PDK中的新版Android尚未正式发布),这样OEM厂商不会再落后于Google挑选的独家早期开发伙伴。PDK版本只包含开发android HAL(硬件抽象层)所必需的组件。请注意,完整的android版本是PDK版本的超集,并且没有单独的PDK发布给公众
platform_testingAndroid平台测试程序
prebuilts预编译文件夹, x86和arm架构下预编译的一些资源,如ndk工具包, gcc编译器等
sdksdk和模拟器,编译sdk规则目录, Android的SDK包含该平台为应用程序开发人员提供的开发工具,主要是所有公开API的集合,应用程序开发人员可以借助SDK中的API快速的进行应用的开发.
systemAndroid底层文件系统库、应用和组件,如busybox, init进程
testAndroid Vendor测试框架,如vts(vendor test suit) ,Mainline Test Suite (MTS), mltsvts的概念: CTS确保保了 APP 与 Android Framework 之间有一致的调用接口(API),这使得 APP 开发者编写的同一款程序可以运行在不同系统版本(向前兼容)、不同硬件平台、不同厂商制造的不同设备上。 VTS 类似 CTS,通过对 Vendor Interface 进行测试,确保同一个版本的 Android Framework 可以运行在不同 HAL 上,或不同 Android Framework 可以运行在 同一个 HAL 上。 通过这样的 Framework / HAL 分离设计和接口一致性保证,也使得 8.0 版本之后的 Android 系统在进行升级时,可以直接对 Framework 进行升级而不用考虑 HAL 层的改动,从而缩短了用户手上设备得到系统升级 OTA 推送的时间Mainline Test Suite (MTS), MTS由一组测试框架和测试用例组成,旨在帮助增强主线分支代码的健壮性、可靠性和合规性。mlts是Android 机器学习测试套件
toolchain工具链文件,一些python测试脚本
tools工具文件,一些特殊命令, 如acloud命令用于连接谷歌云端工作站的,apkzlib用于apk打包的
Makefile全局Makefile文件,用来定义编译规则

表3
从表3可以看出,系统源码分类清晰,并且内容庞大且复杂。接下来分析packages中的内容,也就是应用层部分。

应用层部分

应用层位于整个Android系统的最上层,开发者开发的应用程序以及系统内置的应用程序都是在应用层。源码根目录中的packages目录对应着系统应用层。它的目录结构如表4所示。

packages目录描述
apps核心应用程序
experimental第三方应用程序
inputmethods输入法目录
providers内容提供者目录
screensavers屏幕保护
services通信服务
wallpapers墙纸

表4

从目录结构可以发现,packages目录存放着系统核心应用程序、第三方的应用程序和输入法等等,这些应用都是运行在系统应用层的,因此packages目录对应着系统的应用层。

应用框架层部分

应用框架层是系统的核心部分,一方面向上提供接口给应用层调用,另一方面向下与C/C++程序库以及硬件抽象层等进行衔接。 应用框架层的主要实现代码在/frameworks/base和/frameworks/av目录下,其中/frameworks/base目录结构如表5所示。

/frameworks/base目录描述/frameworks/base目录描述
api定义APIcmds重要命令:am、app_proce等
core核心库data字体和声音等数据文件
docs文档graphics图形图像相关
include头文件keystore和数据签名证书相关
libslocation地理位置相关库
media多媒体相关库native本地库
nfc-extrasNFC相关obex蓝牙传输
opengl2D/3D 图形APIpackages设置、TTS、VPN程序
saxXML解析器services系统服务
telephony电话通讯管理test-runner测试工具相关
tests测试相关tools工具
wifiwifi无线网络

表5

C/C++程序库部分

系统运行库层(Native)中的 C/C++程序库的类型繁多,功能强大,C/C++程序库并不完全在一个目录中,这里给出几个常用且比较重要的C/C++程序库所在的目录位置。

目录位置描述
bionic/Google开发的系统C库,以BSD许可形式开源。
/frameworks/av/media系统媒体库
/frameworks/native/opengl第三方图形渲染库
/frameworks/native/services/surfaceflinger图形显示库,主要负责图形的渲染、叠加和绘制等功能
external/sqlite轻量型关系数据库SQLite的C++实现

表6讲完 C/C++程序库部分,剩下的部分我们在表3已经给出:Android运行时库的代码放在art/目录中。硬件抽象层的代码在hardware/目录中,这一部分是手机厂商改动最大的一部分,根据手机终端所采用的硬件平台会有不同的实现。

system目录

Android作为linux系统, 在构建最小系统时,需要祖先init进程, 依赖库,二进制工具linux命令,以及各种守护进程等, system目录就提供了这些东西,该目录大部分都是C/C++代码

目录位置描述
apexapexd守护进程源码,负责处理apex安装包的。
ashmemd
bpf
bpfprogs
btAndroid bluedroid协议栈
ca-certificates
chreContext Hub Runtime Environment (CHRE),用于平衡大小核运行不同程序的场景, 提供api,保证小型的本机应用程序(称为nanoapps )在低功耗处理器上执行
connectivity包含wificond进程,该进程通过标准 nl80211命令与WLAN 驱动程序进行通信
core包含各种依赖库,adb,祖先init进程源码,lmkd,logcat, toolbox
extras各种额外的命令工具, 比如su,memtrack(追踪graphic相关内存),playwav命令,以及一些测试代码
gatekeeper防护程序,如锁屏密码等
gsid通用系统镜像守护进程
hardware网络相关的HIDL描述文件
hwservicemanagerHAL服务管理中心,负责管理系统中的所有HAL服务,由init进程启动,属于vendor的binder通信机制,类似framework中的binder
iorapIOrap用于缩短应用程序的启动时间,该目录包含iorapd守护进程和相应的库文件
keymaster
libfmq
libhidl硬件接口定义语言依赖库
libhwbinderhwbinder依赖库
libsyspropsysprop说明文件 (.sysprop) 将系统属性定义为 API, 在java/c++代码中可以通过api访问跨分区的属性,类似以前android版本中的SystemProperties
libufdt
libvintf
linkerconfig
media包括alsa、audio、camera相关的头文件
netdAndroid中专门负责网络管理和控制的后台守护进程,如管理DNS,设置防火墙,带宽控制
nfc
nvram
security
sepolicyselinux权限策略配置目录
server_configurable_flags
testing
timezone
toolsaidl,hidl可执行程序的源码路径
ucontainer
update_engine负责A/B升级的核心逻辑代码
voldVolume守护进程,用来管理Android中存储类的热拔插事件,如设备增加,删除,修改等事件处理
framework目录
目录位置描述
avaudio/video, 如音视频解码器,录屏工具, 摄像头框架相关代码, 多媒体框架供上层程序调用的java API,连接java和C/C++的jni部分, 在framework/base/media 下
base基础核心代码
compile包含libbcc,mclinker(llvm编译器的插件) slang(Renderscript语言的编译器)
exAndroid内部使用的公共类,如联系人、小部件、io, 以及全新的相机框架 Camera2的部分代码
hardware描述传感器,虚拟现实VR,camera等硬件的HIDL接口的文件.hal
layoutlib布局相关
minikinAndroid原生字体,连体字效果
ml机器视觉
multidex多dex加载器,大多数App,解压其apk后,一般只有一个classes.dex文件,采用MultiDex的App解压后可以看到有classes.dex,classes2.dex,… classes(N).dex
nativec/c++本地语言编写的相关工具源码和特定硬件控制的头文件,如 bugreport, dumpstate, 各种硬件的访问权限声明
opt一些UI插件和java后台服务,如timezonepicker,datetimepicker, colorpicker, 网络服务,如EthernetService, WifiService, 电话服务telephony
rs渲染脚本rendor script
wilhelm基于Khronos的OpenSL ES/OpenMAX AL的audio/multimedia实现
framework/av/ 下
目录位置描述
aidl
apex
cameralibcamera_client共享库,是camera框架部分的client代码
cmds包括录屏工具,stagefright进程
drm
include
media提供音视频编解码的各种库和工具,后台进程如audioserver, mediaserver(通过binder的进程间通信方式来完成其他进程(如音乐播放器)的请求)
services多媒体相关的后台服务, 如cameraservice,audioflinger
MODULE_LICENSE_APACHE2
CleanSpec.mk
NOTICE
OWNERS
soundtrigger
tools
framework/base/ 下

其中base目录中是应用框架层的主要核心代码,目录结构如下

目录位置描述
apct-tests
apex
api声明了android应用框架层的类、属性和资源
boot
cmds开机启动的进程代码和命令(脚本), 著名的zygote进程代码和启动动画代码就在此处
config
core/javaAndroid应用开发锁依赖的各种包, 四大组件代码就在此,如android/app/Activity.java,android/app/Service.java,android/content/ContentProvider.java,/android/content/BroadcastReceiver.java
core/jni服务于android系统java核心代码所需要的jni,被编译成libandroid_runtime.so
core/res系统中所需要的各种资源, 图片,字符串,尺寸,布局文件等
core/proto
core/tests
core/xsd
data系统默认的铃声,字体, 根文件系统etc目录部分配置文件,触摸需要的kl, kcm文件等
docs
drmDigital Rights Management(数字版权管理) ,应用根据与受版权保护的内容关联的许可限制来管理自己的内容,从而达到保护应用内容的知识产权
errorprone
graphic为应用提供的android.graphics包,提供基本的图形原语(如画点画线,设置图形上下文等)另外和图形相关的包:android.view图形事件机制和android.widget包提供开发图形用户界面的控件
identity
keystore提供android.security.keystore包, 应用可以通过KeyStore API生成密钥、使用密钥签名, keystorek可以保护密钥材料免遭未经授权的使用
libs大部分都是c/c++代码,编译成so, 如Canvas 的drawing 操作转换为OpenGL 的操作的libhwui.so
location定位相关接口,被App调用的,API包是android.location
lowpan提供android.net.lowpan报,提供基于IPv6的低速无线个域网的API, lowpan功能与Zigbee类似
media多媒体相关接口,被App调用的, 包含MediaPlayer代码
mime
mms
native部分硬件相关的jni库:如sensor, net, 存储管理, 最后合并在libandroid.so中
nfc-extras
obex蓝牙文件传输obex协议
omapi
opengl提供android.opengl包, 提供android 2D/3D图形处理各种API
packages著名的SystemUI,彩蛋,锁屏,SettingProvider(系统设置数据提供者)
proto
rs提供android.renderscript 包,RenderScript 是Android 平台上的一种类C脚本语言,用于渲染绘图
samples
sax
servicesandroid开机启动的大部分后台服务,如PMS, AMS, WMS等
startop
telecomm
telephony电话相关
test-base
test-legacy
test-mock
test-runner
tests
tools提供应用开发的各种工具和脚本:如aapt
wifi提供android.net.wifi包,如wifi扫描, p2p,hotspot2相关API
libcore目录

libcore 提供Android 系统中支持众多 Java 标准的库,例如 java.lang 包

目录位置描述
luniJava 基础包、扩展包、组织提供的类库等,luni 实际上是 lang、util、net、io 这 4 个内容头字母的组合,通过文件luni/src/module/java/module-info.java可以导出的所有类
libartart 运行时部分相关包
dalvikdalvik 虚拟机相关的包
dom文档对象模型,用于解析xml
jsonjson 串在 Java 中的支持
xml一种轻量级的xml解析工具
ojluniOpen JDK 版的 Java 包,android7.0之后就开始用这个开源的java api

未完待续

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android系统源码开发工具是一套用于开发和定制Android操作系统的工具集合,主要包括Android SDK、Android NDK、Android Studio等。首先,Android SDK是用于开发Android应用程序的工具集,其中包括Android平台工具、Android Debug Bridge、Android模拟器、不同版本的Android API等,开发者可以使用这些工具进行应用程序的开发、调试和测试。其次,Android NDK是用于开发使用C/C++代码的Android应用程序的工具集,开发者可以使用NDK将C/C++代码集成到Android应用程序中,并对其进行优化和调试。最后,Android Studio是由Google官方推出的集成开发环境(IDE),提供了丰富的开发工具和便捷的开发环境,开发者可以在Android Studio中进行Android应用程序的开发、调试和打包发布。 除了上述工具外,对于需要对Android操作系统进行深度定制或修改的开发者来说,Android系统源码AOSP)也是必不可少的开发工具之一。开发者可以通过下载Android系统源码,并结合开发工具集进行修改和定制,以满足特定的设备需求或行业需求。通过Android系统源码开发工具,开发者可以了解Android系统的内部结构和原理,并基于此进行二次开发,实现更加具有个性化的Android应用程序或Android设备。 综上所述,Android系统源码开发工具是一套完整的工具集,为开发者提供了从Android应用程序开发到Android系统定制开发的全方位支持,能够满足开发者各种需求,并帮助他们进行高效的移动应用开发工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值