移动开发从入门到精通

Android Source Dir Architecture

2016-07-26  本文已影响110人  hjhjw1991

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源码目录结构

上一篇 下一篇

猜你喜欢

热点阅读