Android Source Architecture
相信各位对于Android系统架构图的三层或四层结构已经了然于胸,迫不及待想要膜拜一下源码,但是可能好不容易下载好源码打开一看就懵逼了:这目录是啥?这又是啥?其实Android源码目录名字已经很浅显地表明了目录的内容和功能,但对于初学者特别是背景知识不够宽宏的初学者而言还是有点摸不着头脑。本文简单介绍Android系统源码目录结构,好让读者对Android源码有一个整体的概念,这样当深入到某一模块研究的时候能够同时心中有全局。
首先要了解一个理念:Android源码以什么样的原则来分包和存放。从目录看,Android很自然地将源码分为Core、External和Package三种,其中Core是核心工程,在根目录的各个文件夹中,External是扩展工程,使用其他开源项目扩展的功能,在external文件夹中,Package是提供应用程序和服务的,在package中,平时用到的各种系统应用就是在这里面写就的。
以下按层次结构依次标注目录功能(源码版本:android_4.4.1-r1):
.├── abi application binary interface,应用程序二进制接口├── art art虚拟机├── bionic [Build] bionic C运行时支持:libc、libm、libdl、动态linker├── bootable 启动引导相关代码├── build [Build]存放系统编译规则及generic等基础开发配置├── cts Android兼容性测试套件标准├── dalvik dalvik虚拟机├── developers 开发者相关├── development 应用程序开发相关├── device 设备相关代码(厂商定制代码就放在这里)├── docs 开源相关文档├── external Android使用的开源模块├── frameworks 核心框架,包含Java source和C++ source├── hardware 主要是硬件适配层HAL├── libcore 核心库相关├── libnativehelper 动态库,是实现JNI的基础├── Makefile [Build]make的入口点,其内容只有一句话即include build/core/main.mk├── ndk ndk相关代码├── out 编译输出文件夹,默认编译完成后的结果输出到此目录├── packages 应用程序包├── pdk Plug Development Kit,本地开发套件├── prebuilts 预编译的资源(例如Linux-Kernel,分为x86和arm架构)├── sdk sdk及模拟器相关代码├── system 文件系统和应用组件,c/c++代码├── tools 工具文件夹,如gradle等
作为开发者根据自己的需要可以对不同部分加以关注,我们主要关注packages和frameworks目录。我们打开frameworks,发现它的目录结构如下:
./frameworks/├── av Audio/Video│ ├── camera 相机│ ├── CleanSpec.mk 本模块的清除步骤,下同│ ├── cmds command目录,包含录屏和stagefright两个子目录│ ├── drm digital rights management相关│ ├── include 头文件│ ├── libvideoeditor 视频编辑器库│ ├── media 媒体│ ├── MODULE_LICENSE_APACHE2 开源协议│ ├── NOTICE 声明│ ├── services 服务,包含audioflinger,camera和medialog│ └── tools 工具├── base 基础定义,我们主要关注这个文件夹下的内容│ ├── Android.mk 本模块的编译步骤,下同│ ├── api 当前api定义,如果api有变化这个文件会相应更新│ ├── CleanSpec.mk│ ├── cmds│ ├── core framework核心代码,实现了几乎所有底层功能,包含java和c/c++代码,android.xx.xx/com.android.internal.xx/com.android.server的NetworkObserver代码位于这里│ ├── data 数据文件夹,包含字体、键盘定义、声音、视频等数据│ ├── docs 文档│ ├── drm 版权保护│ ├── graphics 图形│ ├── include ...│ ├── keystore│ ├── libs│ ├── location│ ├── media│ ├── MODULE_LICENSE_APACHE2│ ├── native│ ├── nfc-extras│ ├── NOTICE│ ├── obex│ ├── opengl│ ├── packages│ ├── policy│ ├── preloaded-classes│ ├── samples│ ├── sax│ ├── services com.android.server的大部分代码位于这里│ ├── telephony│ ├── test-runner│ ├── tests│ ├── tools│ └── wifi├── compile 下面的内容不再一一介绍,用到的时候再去详解也不迟│ ├── libbcc│ ├── mclinker│ └── slang├── ex│ ├── camera2│ ├── carousel│ ├── chips│ ├── CleanSpec.mk│ ├── common│ ├── photoviewer│ ├── variablespeed│ └── widget├── mff├── ml│ ├── Android.mk│ └── bordeaux├── native│ ├── build│ ├── cmds│ ├── data│ ├── include│ ├── libs│ ├── MODULE_LICENSE_APACHE2│ ├── NOTICE│ ├── opengl│ └── services├── opt│ ├── calendar│ ├── carddav│ ├── colorpicker│ ├── datetimepicker│ ├── emoji│ ├── inputmethodcommon│ ├── mailcommon│ ├── mms│ ├── net│ ├── photoviewer│ ├── telephony│ ├── timezonepicker│ └── vcard├── rs│ ├── Android.mk│ ├── CleanSpec.mk│ ├── cpp│ ├── cpu_ref│ ├── driver│ ├── java│ ├── rsAdapter.cpp│ ├── rsAdapter.h│ ├── rsAllocation.cpp│ ├── rsAllocation.h│ ├── rsAnimation.cpp│ ├── rsAnimation.h│ ├── rsCompatibilityLib.cpp│ ├── rsCompatibilityLib.h│ ├── rsComponent.cpp│ ├── rsComponent.h│ ├── rsContext.cpp│ ├── rsContext.h│ ├── rsCppUtils.cpp│ ├── rsCppUtils.h│ ├── rsDebugHelper.h│ ├── rsDefines.h│ ├── rsDevice.cpp│ ├── rsDevice.h│ ├── rsElement.cpp│ ├── rsElement.h│ ├── rsEnv.h│ ├── rsFBOCache.cpp│ ├── rsFBOCache.h│ ├── rsFifo.h│ ├── rsFifoSocket.cpp│ ├── rsFifoSocket.h│ ├── rsFileA3D.cpp│ ├── rsFileA3D.h│ ├── rsFont.cpp│ ├── rsFont.h│ ├── rsgApi.cpp.rsg│ ├── rsgApiFuncDecl.h.rsg│ ├── rsgApiReplay.cpp.rsg│ ├── rsgApiStructs.h.rsg│ ├── rsg_generator.c│ ├── rsGrallocConsumer.cpp│ ├── rsGrallocConsumer.h│ ├── rsg.spec│ ├── rs.h│ ├── rs_hal.h│ ├── rsMatrix2x2.cpp│ ├── rsMatrix2x2.h│ ├── rsMatrix3x3.cpp│ ├── rsMatrix3x3.h│ ├── rsMatrix4x4.cpp│ ├── rsMatrix4x4.h│ ├── rsMesh.cpp│ ├── rsMesh.h│ ├── rsMutex.cpp│ ├── rsMutex.h│ ├── rs_native.spec│ ├── rsObjectBase.cpp│ ├── rsObjectBase.h│ ├── rsPath.cpp│ ├── rsPath.h│ ├── rsProgramBase.h│ ├── rsProgram.cpp│ ├── rsProgramFragment.cpp│ ├── rsProgramFragment.h│ ├── rsProgram.h│ ├── rsProgramRaster.cpp│ ├── rsProgramRaster.h│ ├── rsProgramStore.cpp│ ├── rsProgramStore.h│ ├── rsProgramVertex.cpp│ ├── rsProgramVertex.h│ ├── rsRuntime.h│ ├── rsSampler.cpp│ ├── rsSampler.h│ ├── rsScriptC.cpp│ ├── rsScriptC.h│ ├── rsScriptC_Lib.cpp│ ├── rsScriptC_LibGL.cpp│ ├── rsScript.cpp│ ├── rsScriptGroup.cpp│ ├── rsScriptGroup.h│ ├── rsScript.h│ ├── rsScriptIntrinsic.cpp│ ├── rsScriptIntrinsic.h│ ├── rsSignal.cpp│ ├── rsSignal.h│ ├── rs.spec│ ├── rsStream.cpp│ ├── rsStream.h│ ├── rsThreadIO.cpp│ ├── rsThreadIO.h│ ├── rsType.cpp│ ├── rsType.h│ ├── rsUtils.h│ ├── scriptc│ ├── server│ ├── spec.h│ ├── spec.l│ └── tests├── support│ ├── build.gradle│ ├── CleanSpec.mk│ ├── local.properties│ ├── settings.gradle│ ├── tests│ ├── v13│ ├── v4│ ├── v7│ └── v8├── testing│ ├── Android.mk│ ├── androidtestlib│ ├── app-tests│ ├── MODULE_LICENSE_APACHE2│ ├── uiautomator│ └── uiautomator_test_libraries├── uiautomator│ ├── Android.mk│ ├── api│ ├── apicheck_msg_current.txt│ ├── apicheck_msg_last.txt│ ├── BuildConstants.java.in│ ├── cmds│ ├── MODULE_LICENSE_APACHE2│ ├── samples│ ├── src│ ├── tests│ └── utils├── volley│ ├── AndroidManifest.xml│ ├── Android.mk│ ├── build.gradle│ ├── build.xml│ ├── custom_rules.xml│ ├── proguard.cfg│ ├── proguard-project.txt│ ├── project.properties│ ├── src│ └── tests├── webview│ ├── Android.mk│ └── chromium└── wilhelm├── doc├── include├── src├── tests└── tools
以上可以看出android系统的源码是非常庞大而复杂的,源码研究是一项艰苦而持久的任务。世上无难事只怕有心人,下面我们看点轻松的好理解的内容:
./packages/├── apps 应用程序库├── experimental 实验性的库(打印服务,bug汇报,通知,RPC等)├── inputmethods 输入法├── providers 四大组建之一Provider的系统自带模块├── screensavers 屏保├── services 系统服务(电话服务)└── wallpapers 壁纸
有了以上的准备,阅读起源码来就心里有数,想要找什么代码也有了大致的搜索范围。
下面特别指出一些库的位置,有兴趣的可自行阅读:
系统C库 bionic
媒体库 frameworks/av/media
图形显示库 frameworks/native/services/surfaceflinger
网络引擎库 external/webp, external/webrtc
3D图形库 frameworks/native/opengl
SQLite Java layer framworks/base/core/java/android/database, C++ layer external/sqlite
更详细的目录知识参见Android源码目录结构