1. Android 系统架构

Android本质就是在标准的Linux系统上增加了Java虚拟机Dalvik/ART,并在Dalvik/ART虚拟机上搭建了一个JAVA的application framework,所有的应用程序都是基于JAVA的application framework之上。

Android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和Linux内核层。

应用程序层

该层提供一些核心应用程序包,例如电子邮件、短信、日历、地图、浏览器和联系人管理等。同时,开发者可以利用Java语言设计和编写属于自己的应用程序,而这些程序与那些核心应用程序彼此平等、友好共处。

应用程序框架层

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

应用程序框架层包括活动管理器、位置管理器、包管理器、通知管理器、资源管理器、 电话管理器、窗口管理器、内容提供者、视图系统和XMPP服务十个部分。

系统运行库层

系统运行库层分为两部分,分别是C/C++程序库和Android运行时库。

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

Linux内核层

Android 的核心系统服务基于Linux 内核,在此基础上添加了部分Android专用的驱动。系统的安全性、内存管理、进程管理、网络协议栈和驱动模型等都依赖于该内核。Linux内核也是作为硬件与软件栈的抽象层。

Android系统源码

对国内的开发者来说最痛苦的是无法去访问Android开发网站。为了更好的认识世界,对程序员来说,会翻墙也是的一门技术,带你去领略墙外的世界, 国内开发者访问(androiddevtools) 上面已经有了所有你要的资源,同时可以下载到我们的主角framework。如果你只是想查看源码,androidxref也是一个不错的资源。

  1. abi:applicationbinary interface,应用程序二进制接口,生成libgabi++.so相关库文件
  2. art:Google在4.4后加入用来代替Dalvik的运行时
  3. bionic:Android的C library,即C库文件
  4. bootable:
    启动引导相关代码
    |-- bootloader 适合各种bootloader的通用代码
    |  |-- lk             little kernel
    |  |-- preloader
    |  |-- recovery  recovery模式
    
  5. build:
    存放系统编译规则及generic等基础开发配置包
    |-- core    核心编译规则
    |-- libs      库
    |-- target  目标机编译对象
    |-- tools    编译中使用的工具及脚本
    
  6. cts:Android兼容性测试套件
  7. dalvik:dalvik虚拟机
  8. developers
    开发者使用,存放几个例子
    |-- build        编译相关
    |-- demos     两个demo
    |-- samples   例子
    
  9. development
    开发者需要的一些例程及工具
    |-- apps     一些核心应用程序
    |-- build     编译脚本模板
    |-- cmds    有个monkey工具
    |-- docs     文档
    |-- host     主机端USB驱动等
    |-- ide       集成开发环境
    |-- libraries sdk启动模拟器使用
    |-- ndk      本地开发套件——c语言开发套件
    |-- perftests 全景功能
    |-- samples  例程
    |-- scripts    脚本
    |-- sdk        s dk配置
    |-- sdk_overlay
    |-- sys-img
    |-- testrunner  测试用
    |-- tools     一些工具
    |-- tutorials  也是一些例子
    
  10. device
    设备相关代码,这里仅举例一个,也是mtk aosp后向国际大厂同步的做法
    |-- mediatek
    |  |-- build        编译相关
    |  |-- common  通用配置
    |  |-- mt6735    平台配置
    
  11. docs:介绍开源的相关文档
  12. external:Android使用的一些开源的模组,很多子目录,不一一列出
  13. frameworks:
    framework目录,Android核心框架
    |-- av       音频相关
    |-- base   基本内容
    | |-- API        API汇总
    | |-- cmds    重要命令:am、app_proce等
    | |-- core     核心库
    | |-- data     字体和声音等数据文件
    | |-- docs    文档
    | |-- drm      drm监权相关
    | |-- graphics  图形相关
    | |-- include    头文件
    | |-- keystore  和数据签名证书相关
    | |-- libs          库
    | |-- location   定位相关
    | |-- media     媒体相关库
    | |-- native     提供jni
    | |-- nfc-extras    nfc提供
    | |-- obex       蓝牙传输库
    | |-- opengl    2D-3D加速库
    | |-- packages   设置、TTS、VPN程序
    | |-- policy    锁屏剥离出来的
    | |-- rs           脚本语言
    | |-- samples  例子
    | |-- sax         解析器
    | |-- services 各种服务
    | |-- telecomm 电话
    | |-- telephony 电话通讯管理
    | |-- test-runner   测试工具相关
    | |-- tests         各种测试
    | |-- tools         一些工具
    | |-- wifi           无线网络
    
  14. hardware:部分厂家开源的硬解适配层HAL代码
  15. kernel-3.18:内核
  16. libcore:核心库相关
  17. libnativehelper:jni用到的库
  18. ndk:ndk相关
  19. packages:各种apk
  20. pdk:Google用来减少碎片划的东西
  21. prebuilts:预编译的一些资源
  22. sdk:顾名思义sdk及模拟器等
  23. system:系统组件库等
  24. toolchain:一些工具
  25. tools:一些工具
  26. trusty
  27. vendor:
    厂商定制代码
    |-- mediatek
    

整体结构

|– Makefile (全局Makefile文件,用来定义编译规则)
|– abi (应用程序二进制接口)
|– art (ART运行环境)
|– bionic (bionic C库)
|– bootable (启动引导相关代码)
|– build (存放系统编译规则及generic等基础开发包配置)
|– cts (Android兼容性测试套件标准)
|– dalvik (dalvik JAVA虚拟机)
|– developers (开发者目录)
|– development (应用程序开发相关)
|– device (设备相关配置)
|– docs (参考文档目录)
|– external (android使用的一些开源的模组)
|– frameworks (核心框架——java及C++语言)
|– hardware (部分厂家开源的硬解适配层HAL代码)
|– kernel
|– libcore (核心库相关文件)
|– libnativehelper (动态库,实现JNI库的基础)
|– ndk (NDK相关代码,帮助开发人员在应用程序中嵌入C/C++代码)
|– out (编译完成后的代码输出与此目录)
|– packages (应用程序包)
|– pdk (Plug Development Kit 的缩写,本地开发套件)
|– prebuilts (x86和arm架构下预编译的一些资源)
|– sdk (sdk及模拟器)
|– system (底层文件系统库、应用及组件——C语言)
|– tools (工具文件)
|– toolchain(工具链文件)
|– vendor (厂商定制代码)

应用层部分

应用层位于整个Android系统的最上层,开发者开发的应用程序以及系统内置的应用程序都位于应用层。源码根目录中的packages目录对应着系统应用层。

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

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

应用框架层部分

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

|– API (定义API)
|– core (核心库)
|– docs (文档)
|– include (头文件)
|– libs (库)
|– media (多媒体相关库)
|– nfc-extras (NFC相关)
|– opengl 2D/3D (图形API)
|– sax (XML解析器)
|– telephony (电话通讯管理)
|– tests (测试相关)
|– test-runner (测试工具相关)
|– tools (工具)
|– wifi (wifi无线网络)
|– cmds (重要命令:am、app_proce等)
|– data (字体和声音等数据文件)
|– graphics (图形图像相关)
|– keystore (和数据签名证书相关)
|– location (地理位置相关库)
|– native (本地库)
|– obex (蓝牙传输)
|– packages (设置、TTS、VPN程序)
|– services (系统服务)
下一节:android系统的Zygote进程是所有android进程的父进程,包括SystemServer和各种应用进程都是通过Zygote进程fork出来的。Zygote(孵化)进程相当于是android系统的根进程,后面所有的进程都是通过这个进程fork出来的,而Zygote进程则是通过linux系统的init进程启动的,也就是说,android系统中各种进程的启动方式:init进程 ––> Zygote进程 ––> SystemServer进程 ––>各种应用进程