Android源码分析一 Android系统架构
一 Android系统架构
- Linux内核层(Linux Kernel):Android系统基于Linux2.6内核,这一层为Android设备各种硬件提供了底层驱动,如显示驱动、音频驱动、照相机驱动、蓝牙驱动、Wi-Fi驱动、电源管理等;
- 硬件抽象层(android hardware abstraction layer):安卓驱动硬件的方式与Linux不尽相同。传统Linux的驱动完全存活于内核空间。Android则在内核外部增加了硬件抽象层(HAL, Hardware Abstraction Layer),把一部分驱动功能放到HAL层中。安卓为什么费尽麻烦增加一个HAL呢?为了保护源代码。Linux内核采用了GPL协议,所以硬件生产商想要支持Linux系统,必须遵照GPL协议公开硬件驱动的源代码。但这些源代码中包含有许多硬件的设计信息,牵涉到硬件生产商的核心利益。而增加了HAL层之后,硬件厂商就不需要开放所有的驱动代码了。
- 系统运行库层(libraries):这一层通过一些C/C++库(so库)来为Android系统提供了主要的特性支持。如SQLite库提供了数据库支持,OpenGL ES库提供了3D绘图支持,Webkit库提供了浏览器内核支持等;
- 应用框架层(application framework):这一层主要提供构建应用程序时可能用到的各种API,Android自带的一些核心应用就是使用这些API完成的,开发者也可通过使用API来构建自己的应用程序;
- a) Activity Manager(活动管理器)
管理各个应用程序生命周期以及通常的导航回退功能
- b) Window Manager(窗口管理器)
管理所有的窗口程序
- c) Content Provider(内容提供器)
使得不同应用程序之间存取或者分享数据
- d) View System(视图系统)
构建应用程序的基本组件
- e) Notification Manager(通告管理器)
使得应用程序可以在状态栏中显示自定义的提示信息
- f) Package Manager(包管理器)
Android系统内的程序管理
- g)Telephony Manager(电话管理器)
管理所有的移动设备功能
- h)Resource Manager(资源管理器)
提供应用程序使用的各种非代码资源,如本地化字符串、图片、布局文件、颜色文件等
- i)Location Manager(位置管理器)
提供位置服务
- j)XMPP Service(XMPP服务)
提供Google Talk服务
- 应用层(applications):这一层主要用于手机应用的安装,如系统自带联系人、短信等程序,或是第三方应用程序
6.Android运行时库(Android Runtime)ART以上为五层五区,还有一个区域是存在于libraries层的Android运行时库(Android Runtime)ART,它主要提供一些核心库,能够允许开发者使用Java语言来编写Android应用。另外Android运行时库中还包含了Dalvik虚拟机,它使得每一个Android应用都能运行在独立的进程中,且拥有一个自己的Dalvik虚拟机实例。相较于Java虚拟机,Dalvik是专门为移动设备定制的,它针对手机内存、CPU性能有限等情况作了优化处理。
二 Android系统启动架构图
可以看到:Android
系统启动是从下往上的一个过程:Loader
->Kernel
->Native
->Framework
->App
。
Loader 层
Boot Rom
:当手机处于关机状态时,长按开机键开机,会引导芯片开始从固化在Rom
里预设的代码开始执行,然后加载引导程序到Ram
.Boot Loader
:这是启动Android
系统之前的引导程序,主要是检查Ram
、初始化参数等功能。
Kernel 层
kernel
层指的就是Android
内核层,到这里才刚刚进入Android
系统
- 启动
Kernel
层的swapper
进程(pid=0),系统初始化过程Kernel创建的第一个进程,用于初始化进程管理、内存管理,加载Display
、Camera
、Binder
等驱动相关工作。 - 启动
kthreadd
(pid=2),这是Linux
系统的内核进程,会创建内核工作线程kworkder
、软中断线程ksoftirqd
和thermal
等内核守护进程。kthreadd
是所有内核进程的鼻祖。
Native 层
这里的Native
层主要包括init
孵化来的用户空间的守护进程、HAL层及开机动画等。启动init
进程(pid=1),是Linux
系统的用户进程,init
进程是所有用户进程的鼻祖。
init
进程会孵化出ueventd
、logd
、healthd
、installd
、adbd
、lmkd
等用户守护进程;init
进程还会启动ServiceManager
(Binder服务管家)、bootanim
(开机动画)等重要服务。init
进程孵化出Zygote
进程,Zygote
进程是Android系统第一个Java
进程(虚拟机进程),zygote
进程是所有Java
进程的父进程。
Framework 层
framework
主要包括Zygote进程
、SystemServer进程和
MediaServer进程`。
Zygote 进程
Zygote
进程是由init
进程通过解析init.rc
文件后fork
生成的。Zygote
的任务主要包括:
- 加载
ZygoteInit
类,注册Zygote Socket
服务端套接字。 - 加载虚拟机
preloadClassses
preloadResources
System Server 进程
System Server
进程是由Zygote
进程fork
而来,System Server
是Zygote
孵化的第一个进程。System Server
负责启动和管理整个Java Framework
,包含ActivityManager
、PowerManager
等服务。
Media Server 进程
Media Server
进程由init
进程fork
而来,负责管理整个C++ Framework
,包含AudioFlinger
、Camera Service
等服务。
App 层
Zygote
进程孵化出的第一个App
进程是Launcher
,也就是用户看到的桌面App
。同时Zygote
进程还会创建Browser
、Phone
、Email
等App
进程。也就是说所有的App
进程都是由Zygote
进程fork生成的。
Syscall 和 JNI
Native
层和Kernel
层有一个系统调用层,也就是Syscall
。Java
层和native
层之间的纽带是JNI
。
Android源码分析一 Android系统架构的更多相关文章
- Android源码分析(九)-----如何修改Android系统默认时间
一 : 修改Android系统默认时间 源码路径:frameworks/base/services/java/com/android/server/SystemServer.java 主要变量EARL ...
- Android源码分析(五)-----如何从架构师的角度去设计Framework框架
一 : 架构与程序 软件架构是一种思维方式,而程序只是实现思维方式的一种手段,代码固然重要,但是若没有整体的思维架构,一切程序都如水中浮萍. 二 : 框架如何设计 暂时抛开Android Framew ...
- Android源码分析(三)-----系统框架设计思想
一 : 术在内而道在外 Android系统的精髓在源码之外,而不在源码之内,代码只是一种实现人类思想的工具,仅此而已...... 近来发现很多关于Android文章都是以源码的方向入手分析Androi ...
- Android源码分析(六)-----蓝牙Bluetooth源码目录分析
一 :Bluetooth 的设置应用 packages\apps\Settings\src\com\android\settings\bluetooth* 蓝牙设置应用及设置参数,蓝牙状态,蓝牙设备等 ...
- Android源码分析(十七)----init.rc文件添加脚本代码
一:init.rc文件修改 开机后运行一次: chmod 777 /system/bin/bt_config.sh service bt_config /system/bin/bt_config.sh ...
- Android源码分析(十六)----adb shell 命令进行OTA升级
一: 进入shell命令界面 adb shell 二:创建目录/cache/recovery mkdir /cache/recovery 如果系统中已有此目录,则会提示已存在. 三: 修改文件夹权限 ...
- Android源码分析(十五)----GPS冷启动实现原理分析
一:原理分析 主要sendExtraCommand方法中传递两个参数, 根据如下源码可以知道第一个参数传递delete_aiding_data,第二个参数传递null即可. @Override pub ...
- Android源码分析(十四)----如何使用SharedPreferencce保存数据
一:SharedPreference如何使用 此文章只是提供一种数据保存的方式, 具体使用场景请根据需求情况自行调整. EditText添加saveData点击事件, 保存数据. diff --git ...
- Android源码分析(十三)----SystemUI下拉状态栏如何添加快捷开关
一:如何添加快捷开关 源码路径:frameworks/base/packages/SystemUI/res/values/config.xml 添加headset快捷开关,参考如下修改. Index: ...
随机推荐
- websocket和socketio的总结
1.WebSocket是什么? WebScoket是一种让客户端和服务器之间能进行双向实时通信的技术.它是HTML最新标准HTML5的一个协议规范,本质上是个基于TCP的协议,它通过HTTP/HTTP ...
- List与逗号分隔的字符串相互转换
如果程序员想实现某种功能,有两条路可以走.一条就是自己实现,一条就是调用别人的实现,别人的实现就是所谓的API.而且大多数情况下,好多“别人”都实现了这个功能.程序员有不得不在这其中选择.大部分情况下 ...
- P1880 [NOI1995]石子合并(区间DP)
题目链接:https://www.luogu.org/problemnew/show/P1880 题目大意:中文题目 具体思路:和上一篇的思路是差不多的,也是对于每一个小的区间进行处理,然后再归并到大 ...
- python基础知识~备份还原功能设计
一 相关模块设计 1 配置文件管理模块 configparser 1 config-value不要加引号 2 linux系统执行命令模块 subprocess 1 shell=True代表命 ...
- HTML - CSS 基础篇
网页主要由四部分组成: 1.内容(content) 图片.文本.多媒体等. 2.结构(structure) 框架布局(div+css布局的多行多列的结构.) 3.表现(presnetation) 修饰 ...
- DEX、ODEX、OAT文件&Dalvik和ART虚拟机
https://www.jianshu.com/p/389911e2cdfb https://www.jianshu.com/p/a468e714aca7 ODEX是安卓上的应用程序apk中提取出来的 ...
- openstack Q版部署-----虚拟机密码修改问题
一.修改镜像密码 1.打开一个要修改的镜像 随便找一台centos服务器 [root@linux-node1 ~]#wget http://cloud.centos.org/centos/7/imag ...
- python第七天,dict
在python里边创建字典的方法有如下几种: >>> dict1= dict(((),(),(),(),())) >>> print(dict1) {, , , , ...
- CF1097D Makoto and a Blackboard
题目地址:CF1097D Makoto and a Blackboard 首先考虑 \(n=p^c\) ( \(p\) 为质数)的情况,显然DP: 令 \(f_{i,j}\) 为第 \(i\) 次替换 ...
- C# 如何进行图像的压缩
从网上找的非常有效.图片3M到500k private static ImageCodecInfo GetEncoderInfo(String mimeType) { int j; ImageCode ...