Android剖析和运行机制
16lz
2021-12-04
翻译之《Android Anatomy and Physiology》,下载地址:http://download.csdn.net/detail/wuxiaoer717/6839427
大纲:
1. Android剖析
- Linux内核
- 本地库(Native Libraries)
- Android运行时(Android Runtime)
- 应用框架
2.Android运行机制
- 启动流程
- 层间交互(Layer Interaction)
一、 Android剖析
如下图所示为Android的架构图
1. Linux内核
- Android系统基于Linux内核,但是Android不是Linux。
- 没有本地的窗口系统。
- 没有glibc库的支持。
- 不包括完整的标准Linux工具集。
- 标准的Linux 2.6.24内核。
- 内核增强补丁来支持Android。
- 强大的内核和进程管理。
- 基于权限的安全模型。
- 可靠的驱动模型。
- 支持共享库。
- 已经是开源的。
- Alarm
- Ashmem
- Binder
- Power Management
- Low Memory Killer
- Kernel Debugger
- Logger
- 使用驱动来协助进程间通信(IPC)。
- 通过共享内存来获得高性能。
- 对于处理请求,每个进程一个线程池。
- 引用计数,对象的引用是跨进程映射的。
- 进程之间是同步调用。
- 基于Linux的功率管理(PM)构建
- 更加强大的功率管理策略
- 通过“wake locks”来进行功率管理
- 支持不同类型的wake locks
- Bionic Libc
- Function Libraries
- Native Servers
- Hardware Abstraction Libraries
- 许可证:从用户角度,保持GPL许可。
- 大小:由于将加载到各个进程,所以需要比较小。
- 速率:有限的CPU能力意味着我们需要足够的快。
- BSD许可
- 小而快的代码路径
- 非常快和小的定制的pthread实现
- 内置支持重要的特定Androud服务,像1)系统属性,getprop("my.system.property", buff, default); 2)log能力,LOGI("Logging a message with priority 'Info' ");
- 不支持某些POSIX特性。
- 与GNU Libc(glibc)不兼容。
- 由于Native代码必须依赖bionic来进行编译。
- 基于开源的WebKit浏览器:http://www.webkit.org
- 在全视图渲染页
- 完全支持CSS,Javascript,DOM,AJAX
- 支持单列和自适应的视图渲染
- 基于PacketVideo OpenCORE平台
- 支持标准的video,audio,still-frame格式
- 支持硬件/软件编码器插件
- 轻量级事务性数据存储
- 大多数平台的后端数据存储
- 提供系统范围的外观“组合器”,处理所有的外观渲染到帧buffer设备中。
- 可以结合2D与3D外观和多个应用的外观。
- Surfaces传递是作为Buffer来通过Binder IPC调用。
- 可以使用OpenGL ES和2D硬件加速器作为其组成部分。
- 使用page-flip的双buffer机制。
- 管理所有的audio输出设备。
- 处理多个audio流到PCM audio 输出路径。
- 处理audio路由到各个输出。
- 用户空间C/C++库层。
- 定义了接口,以便让Android请求硬件“驱动”来实现。
- 分离了Android平台逻辑和硬件接口。
- 不是所有的组件具有标准的内核驱动接口;
- 内核驱动是GPL的,其将暴露了所有的知识产权;
- Android对于硬件驱动具有特定的要求。
- //mustbeprovidedbyeachAcmehardwareimplementation
- typedefstruct{
- int(*foo)(void);
- char(*bar)(void);
- …
- }AcmeFunctions;
- constAcmeFunctions*Acme_Init(conststructEnv*env,intargc,char
- **argv);
库在runtime时按需动态加载 [cpp] view plain copy
- dlHandle=dlopen(“/system/lib/libacme.so”,RTLD_NOW);
- ...
- acmeInit=(constAcmeFunctions*(*)(conststructEnv*,
- int,char**))dlsym(dlHandle,”Acme_Init");
- ...
- acmeFuncs=acmeInit(&env,argc,argv);
3.Android Runtime Dalvik虚拟机 是Android中定制的净化实现的虚拟机,由于如下特点:
- 提供了应用程序的可移植性和运行时的一致性
- 运行优化的文件格式(.dex)和Dalvik字节
- Java .class/ .jar文件在构建时转换为.dex格式
- 在每个设备上支持多个虚拟机进程;
- 高度优化CPU的字节码解释器;
- 高效的使用runtime内存。
- 数据结构(Data Structure)
- 工具(Utilities)
- 文件访问(File Access)
- 网络访问(Network Access)
- 图形(Graphics)
- ...
- 对于Android平台来说,服务(Services)是必需的。
- 在幕后 —— 应用不会直接访问它们。
- Activity Manager
- Package Manager
- Window Manager
- Resource Manager
- Content Provider
- View System
- 提供访问底层的硬件APIs。
- 典型地通过局部的Manager对象来访问。例如:
- LocationManagerlm=(LocationManager)Context.getSystemService(Context.LOCATION_SERVICE);
主要有如下的硬件服务:
- Telephony Service
- Location Service
- Bluetooth Service
- WIFI Service
- USB Service
- Sensor Service
- Google I/O :“Inside the Androoid Application Framework”
- Online :http://code.google.com/android
- USB守护进程(usbd)来管理USB连接
- Android调试桥守护进程(adbd)来管理ADB连接
- 调试器守护进程(debuggerd)来管理调试进程请求(dump memory等等)
- 射频接口层守护进程(rild)来管理与射频的通信
- 一个新生的进程初始化一个Dalvik VM实例
- 加载类,并监听socket端口用于请求创建VMs实例
- Forks请求创建VM实例用于管理进程
- 写时复制(Copy-on-write)来最大化重用和最小化覆盖
- 初始化Service Manager——上下文管理器用于binder来处理service注册和查询
- 注册Service Manager作为缺省的上下文管理用于Binder
- Surface Flinger
- Audio Flinger
- App -> Runtime Service -> lib
- App -> Runtime Service -> Native Service -> lib
- App -> Runtime Service -> Native Daemon -> lib
更多相关文章
- Android(安卓)API Level对应Android版本一览表
- Service与Android系统设计(7)--- Binder驱动
- Android多进程之Binder的使用
- android中inputType属性在EditText输入值时启动的虚拟键盘的风格
- 一文分析 Android现状及发展前景
- android项目案例4- 基于Android(安卓)studio的android个人中心
- Android启动流程分析(一)概述
- Android(安卓)内核/框架结构学习笔记
- Android内核学习笔记