Android源码-认识系统源码结构

前言

上层应用开发完毕之后,我们可能面临的第二步就是系统源码的编译了。那么在编译源码或者修改系统源码之前,我们首先就需要读懂源码,然后才能进行下一步的编译或者根据需求进行定制化修改系统了。rom系统编译的第一步。

由于我当前手头刚巧有Android 7.1系统源码,就通过该源码进行介绍下目录结构了。

1.android系统初介绍

首先看看下面两个图,applications当前指的是系统内置的app。我们自己开发的app 在最上面就是这个AndroidLOGO的小人了。
Android源码-认识系统源码结构

Android源码-认识系统源码结构

我们能改动的主要是Application 和Android Framework以及native的代码来实现。
因为再往下的ART 和JVM以及HAL都不是我们普通开发者能够进行调整并修改的。而更往下的就是Linux源码了。
ART 和JVM大家都了解,就是运行的虚拟机了。那么HAL是什么?
简单描述是硬件抽象层。但是到底是什么意思? 由于Android系统的开源性,但是很多硬件厂商自己的设备驱动代码,不希望能够进行开源。者就是HAL层的来源。

抽象了整个系统和硬件之间的驱动。所以HAL层一般都是设备硬件厂商自己开发并进行封装的。

2.源码结构介绍

Android源码-认识系统源码结构
通常结构目录如上图所示。下面我们具体介绍文件关系

  • 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目录的相关结构。

Android源码-认识系统源码结构
通常情况下的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。