Android源码-认识系统源码结构
前言
上层应用开发完毕之后,我们可能面临的第二步就是系统源码的编译了。那么在编译源码或者修改系统源码之前,我们首先就需要读懂源码,然后才能进行下一步的编译或者根据需求进行定制化修改系统了。rom系统编译的第一步。
由于我当前手头刚巧有Android 7.1系统源码,就通过该源码进行介绍下目录结构了。
1.android系统初介绍
首先看看下面两个图,applications当前指的是系统内置的app。我们自己开发的app 在最上面就是这个AndroidLOGO的小人了。
我们能改动的主要是Application 和Android Framework以及native的代码来实现。
因为再往下的ART 和JVM以及HAL都不是我们普通开发者能够进行调整并修改的。而更往下的就是Linux源码了。
ART 和JVM大家都了解,就是运行的虚拟机了。那么HAL是什么?
简单描述是硬件抽象层。但是到底是什么意思? 由于Android系统的开源性,但是很多硬件厂商自己的设备驱动代码,不希望能够进行开源。者就是HAL层的来源。
抽象了整个系统和硬件之间的驱动。所以HAL层一般都是设备硬件厂商自己开发并进行封装的。
2.源码结构介绍
通常结构目录如上图所示。下面我们具体介绍文件关系
- abi:abi相关代码,应用程序二进制接口。
- art:Android的两种运行模式Dalvik和ART, 这个目录就是ART运行模式的相关源码信息了。 android 4.4之后提供的功能。
- bionic:基础的C库源代码,Android改造的C/C++库。 例如我们常碰见的libstdc++.so 。libc.so 等库的源码
- bootable:Android 程序启动引导。 如果要定义自己的启动引导可以在该目录下进行配置了。通常情况下只有recovery(目录)。 而该目录下可以自定义recovery模式的相关配置。
- build:存放系统编译规则及generic等基础开发包配置.顾名思义就是相关源码编译的脚本,源码的通用信息,例如版本版本号之类的。以及各种编译校验工具,例如signapk 工具,zipalign工具,adbs工具
- compatibility:Android兼容性计划文档 。主要是一些md文档。
- cts:Android兼容性测试套件标准.测试相关的test工具
- dalvik:dalvik虚拟机相关源码。刚好是和art对应的,都是android Runtime的模式之一。
- developers:Android开发者参考文档。存储的相关示例代码。
- development:Android 开发者的示例和相关工具。和上面的区别就是有很多调试工具和开发。但是也是各种应用程序开发相关代码和Demo。
- device:Android支持的各种设备以及相关配置。就是硬件设备的信息和驱动了
- doce:源码的开源相关的介绍文档。
- external:Android系统使用的一些开源的模组。 例如:glide,zxing,zlib,x264等等。
- frameworks:Android系统的核心框架了,Java及C++语言,是Android应用程序的框架。我们应用开发都是在frameworks之上进行的。
- hardware:硬件适配层HAL代码。
- kernel:Linux 的内核文件,但是有些硬件厂商的驱动也会存在kernel目录下。
- libcore:系统的核心编译库
- libnativehelper是Support functions for Android’s class libraries的别名,表示动态库,是实现JNI库的基础
- NDK:ndk相关代码。和我们开发使用的NDK是一样的。
- out:编译代码的输出目录。 不管是源码的整体编译,还是源码的部分so库的编译,最终输出到out目录之中。
- packages:应用程序包,其实framework里面存的是框架,而这个就是存放的各种系统app的项目源码了。例如:Gallery 相册,Email 邮件,Launcher 桌面,Settings设置。等等了。
- prebuilt :(x86和arm架构下预编译的一些资源) 各种平台编译工具链
- pdk:Plug Development Kit的缩写,是本地开发套件
- sdk:Android SDK及模拟器.应用层apk开发时使用的sdk。在编译成app时没有打包sdk那是因为系统之中有一套SDK库。所以才不用再次打包。
- system:底层文件系统和应用及组件,是用C语言实现的。是linux系统的底层。
- test:系统测试工具。
- toolchain:工具链文件。
- tools:系统工具文件。
- vendor: 厂商定制代码存储目录。 预留给各个定制厂商的目录。
通常情况下,我们会修改Applications层, 那么目录就是在packages/apps/下面了。
Framework层的话那么目录就是frameworks目录下了。
Framework目录
由于我们底层开发,大部分编辑都是针对framework的修改。所以再介绍下framework目录的相关结构。
通常情况下的framework的目录结构如上。
下面进行介绍下具体的
-
base:基础库,大部分内容在这个里面
- act-tests:性能优化测试。
- api:java 的api接口,全是一些目录汇总文件。
- cmds:adb很多关键命令的源码,例如am,等
- core:framework核心库。 包括java代码,jni代码, proto协议层,res资源文档,tests测试工具。最核心的内容编辑都是在cord之中。
- data:字体和音效等数据文件。如果想添加默认支持的字库或者替换音效可以改这个地方。
- drm:数据保护
- graphics:图形显示相关的库。
- keystore:签名证书相关库。
-
libs:(更多的lib库) 全部都是以源码的形式存在
- androidfw:fw相关功能库
- common_time:常用功能工具集合:例如换成,公共View,各种封装完毕的View,等等。
- hwui:硬件渲染库
- incident:时间驱动机制库
- input:输入库
- services:服务库
- storage:存储库
- usb:usb工具库
- location:定位功能
- media:媒体功能
- native:native框架库
- nfc-extras:nfc额外功能框架
- obex:蓝牙传输。
- opengl:openGL加速库。
- packages:(Setting,TTS,v*n等应用库)
- proto:协议框架
- rs:资源框架
- smples:用例
- sax:XML解析框架
- services:各种服务功能库。
- telecomm:Telecom通讯框架
- telephony:电话通讯框架
- test-runner:测试运行工具
- tools:工具库
- vr:VR虚拟库
- wifi:wifi无线库
- av:多媒体框架:camera(相机相关模块),cmds(命令源码),drm(数据保护),media(多媒体部分),radio(无线射频),services(服务),soundtrigger(语音识别架构),include(头文件文档)。
- compile:编译相关的配置。libbcc(用于Linux性能监测的动态追踪工具库),mclinker(MCLinker连接器),slang(异常框架)等等。
- ex:ex文件解析:camera2 相机模块,photowiewer(图片预览),widger(小部件)
- ml:机器学习:(learnimg学习算法)
-
native:native 模块源码配置。
- aidl: aidl层
- build: 编译配置库
- cmds:命令行
- data: 数据文档
- docs :帮助文档
- include:头文档。
- opengl:opengl支持库。
- services:服务
-
libs:native引用的 lib库文档
- arect:图形库
- binder:binder通信库
- diskusage:硬盘读取。
- gui:UI显示库
- input:输入
- math:数学函数库
- nativewindow:nativie窗口
- sensor:传感器:例如陀螺仪等
- ui:ui库
- vr:vr虚拟库
- multidex:Multi-dex Loader ,dex文件分包
- opt:framework提供的部分工具软件。例如bitmap(图片),bluetooth(蓝牙),calendar(日历),chips(芯片工具),emoji(emoji表情),timezonepicker(时间工具),setupwizard(开机向导),net(网络相关工具,ethernet有线网络,voip数据网络,wifi无线网络等,ims 多媒体网络,pppoe宽带拨号网络等。),colorpicker(色彩拾取),inputmethodcommon(输入方法工具)等等。
- support:framework 的支持文件
- webview: webView 的底层接口。
- wilhelm:基于Khronos 的OpenSL ES/OpenMax AL的audio/multimedia实现。
- minkin:原生字体库,连体字等。
- rs:Render Script,3D模块接口。
- volley:谷歌网络请求库,具体的可以搜索volley。