Android剖析和运行机制

大纲:

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。

1) 为什么选择Linux内核? 强大的内核和进程管理。基于权限的安全模型。可靠的驱动模型。支持共享库。已经是开源的。
2)内核增强 AlarmAshmemBinderPower ManagementLow Memory KillerKernel DebuggerLogger Binder介绍 问题: 应用和服务会运行在各自的进程当中,而进程之间必须要通信和共享数据。而IPC(进程间通信)会引入巨大的处理开销和安全漏洞
解决方法: 使用驱动来协助进程间通信(IPC)。通过共享内存来获得高性能。对于处理请求,每个进程一个线程池。引用计数,对象的引用是跨进程映射的。进程之间是同步调用。
Binder的实现机制如下图所示:
Android的接口定义语言(AIDL)见:http://developer.android.com/guide/components/aidl.html
PM介绍 问题: 移动设备是依赖电池供电来运行的,电池只有有限的容量。
解决方法: 基于Linux的功率管理(PM)构建更加强大的功率管理策略通过“wake locks”来进行功率管理支持不同类型的wake locks Android中的PM实现: 如下图中所示

Android内核源码可以通过如下http://git.android.com获取
2 本地库
本地库包括: Bionic LibcFunction LibrariesNative ServersHardware Abstraction Libraries
什么是Bionic? 定制的libc实现,优化用于嵌入式。
为什么选用Bionic? 为什么要构建一个定制的libc库呢?主要从如下方面考虑:
许可证:从用户角度,保持GPL许可。大小:由于将加载到各个进程,所以需要比较小。速率:有限的CPU能力意味着我们需要足够的快。 对于Bionic
libc:
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来进行编译。
功能库(Function Libraries) WebKit 基于开源的WebKit浏览器:http://www.webkit.org
在全视图渲染页完全支持CSS,Javascript,DOM,AJAX支持单列和自适应的视图渲染 Media Framework
基于PacketVideo OpenCORE平台支持标准的video,audio,still-frame格式支持硬件/软件编码器插件
SQLite 轻量级事务性数据存储大多数平台的后端数据存储
Native Servers
主要有两大类Surface Flinger和Audio Flinger 对于Surface Flinger
提供系统范围的外观“组合器”,处理所有的外观渲染到帧buffer设备中。可以结合2D与3D外观和多个应用的外观。Surfaces传递是作为
Buffer来通过Binder IPC调用。可以使用OpenGL
ES和2D硬件加速器作为其组成部分。使用page-flip的双buffer机制。 如下图展示所示

对于Audio Flinger 管理所有的audio输出设备。处理多个audio流到PCM audio 输出路径。处理audio路由到各个输出。 如下图示意

硬件抽象层(HAL) 硬件抽象层在Android系统层次结构中的位置如下图所示。
硬件抽象层具有如下特点: 用户空间C/C++库层。定义了接口,以便让Android请求硬件“驱动”来实现。分离了Android平台逻辑和硬件接口。
那么为什么在Android中需要一个用户空间的HAL呢?主要有如下原因: 不是所有的组件具有标准的内核驱动接口;内核驱动是GPL的,其将暴露了所有的知识产权;Android对于硬件驱动具有特定的要求。
HAL Header例子:

1
2
3
4
5
6
7
8
// must be provided by each Acme hardware implementation
typedef struct {
int (*foo)( void );
char (*bar)( void );
} AcmeFunctions;
const AcmeFunctions *Acme_Init(const struct Env *env, int argc, char
**argv);

库在runtime时按需动态加载

1
2
3
4
5
6
dlHandle = dlopen(“/system/lib/libacme.so”, RTLD_NOW);
...
acmeInit = (const AcmeFunctions *(*)(const struct Env *,
int, char **))dlsym(dlHandle, ”Acme_Init);
...
acmeFuncs = acmeInit(&env, argc, argv);

3.Android Runtime

Dalvik虚拟机 是Android中定制的净化实现的虚拟机,由于如下特点: 提供了应用程序的可移植性和运行时的一致性运行优化的文件格式(.dex)和Dalvik字节Java .class/ .jar文件在构建时转换为.dex格式 Dalvik设计用于嵌入式环境 在每个设备上支持多个虚拟机进程;高度优化CPU的字节码解释器;高效的使用runtime内存。
核心库(Core Libraries) Java语言的Core APIs提供了功能强大的,同时简单和熟悉的开发平台。 数据结构(Data
Structure)工具(Utilities)文件访问(File Access)网络访问(Network
Access)图形(Graphics)...
4. 应用框架(Application Frameworks)

核心平台服务(Core Platform Services),具有如下特性: 对于Android
台来说,服务(Services)是必需的。在幕后 —— 应用不会直接访问它们。 主要有如下的服务: Activity
ManagerPackage ManagerWindow ManagerResource ManagerContent ProviderView
System
硬件服务(Hardware Services) 提供访问底层的硬件APIs。典型地通过局部的Manager对象来访问。例如:

1
LocationManager lm = (LocationManager)Context.getSystemService(Context.LOCATION_SERVICE);

主要有如下的硬件服务: Telephony ServiceLocation ServiceBluetooth ServiceWIFI
ServiceUSB ServiceSensor Service 更多的关于应用框架的信息参考: Google I/O :“Inside the
Androoid Application Framework”Online :http://code.google.com/android
二、Android运行机制 1. 启动流程 所有从init开始...
与大多数的基于Linux系统在启动阶段类似,bootLoader加载Linux内核,然后开始init进程。

init启动Linux守护进程,包括:
USB守护进程(usbd)来管理USB连接Android调试桥守护进程(adbd)来管理ADB连接调试器守护进程(debuggerd)来管理调试
进程请求(dump memory等等)射频接口层守护进程(rild)来管理与射频的通信

Init进程启动zygote进程: 一个新生的进程初始化一个Dalvik VM实例加载类,并监听socket端口用于请求创建VMs实例Forks请求创建VM实例用于管理进程写时复制(Copy-on-write)来最大化重用和最小化覆盖

init进程启动runtime进程: 初始化Service Manager——上下文管理器用于binder来处理service注册和查询注册Service Manager作为缺省的上下文管理用于Binder

Runtime进程发送请求给Zygote来启动System Service

接着Zygote进程fork一个新的VM实例用于System Service进程,然后启动该service。

System Service启动本地系统服务器,包括: Surface FlingerAudio Flinger

本地system servers注册Servicee Manager作为IPC service目标:

System Service启动Android管理服务:

Android管理服务注册到Service Manager中:

到此,整个Android系统的启动后:

System Server加载完所有的services后, 系统准备...

2. 层间交互(Layer Interaction) 主要有如下三种类型的交互: App ->
Runtime Service -> libApp -> Runtime Service -> Native Service
-> libApp -> Runtime Service -> Native Daemon -> lib
Android Runtime Services:

举例:Location Manager

Android Native Services:

举例:

Daemon Connection:

举例:RILD

 

Android剖析和运行机制的更多相关文章

  1. Android艺术——探究Handler运行机制

    我们从开发的角度来说,Handler是Android 的消息机制的上层接口.说到Handler,大家都会说:哦,Handler这个我知道干什么的,更新UI.没错,Handler的确是用于更新UI的,具 ...

  2. Android运行机制

    一. Android平台各层 Android平台架构图,如下图:由上到下依次为应用程序.应用程序框架.库.Android运行时.Linux内核. 1.Linux内核: Android系统基于Linux ...

  3. 微信小程序剖析【下】:运行机制

    在上一篇<微信小程序「官方示例代码」浅析[上]>中,我们只是简单的罗列了一下代码,这一篇,让我们来玩点刺激的——就是看看IDE的代码,了解它是怎么运行的. 还好微信的开发团队在软件工程的实 ...

  4. Android权限管理之Android 6.0运行时权限及解决办法

    前言: 今天还是围绕着最近面试的一个热门话题Android 6.0权限适配来总结学习,其实Android 6.0权限适配我们公司是在今年5月份才开始做,算是比较晚的吧,不过现在Android 6.0以 ...

  5. Android Touch事件传递机制 二:单纯的(伪生命周期)

    转载于:http://blog.csdn.net/yuanzeyao/article/details/38025165 在前一篇文章中,我主要讲解了Android源码中的Touch事件的传递过程,现在 ...

  6. Android M Permission 运行时权限 学习笔记

    Android M Permission 运行时权限 学习笔记 从Android 6.0开始, 用户需要在运行时请求权限, 本文对运行时权限的申请和处理进行介绍, 并讨论了使用运行时权限时新老版本的一 ...

  7. Android View 事件分发机制 源码解析 (上)

    一直想写事件分发机制的文章,不管咋样,也得自己研究下事件分发的源码,写出心得~ 首先我们先写个简单的例子来测试View的事件转发的流程~ 1.案例 为了更好的研究View的事件转发,我们自定以一个My ...

  8. Windows程序内部运行机制 转自http://www.cnblogs.com/zhili/p/WinMain.html

    一.引言 要想熟练掌握Windows应用程序的开发,首先需要理解Windows平台下程序运行的内部机制,然而在.NET平台下,创建一个Windows桌面程序,只需要简单地选择Windows窗体应用程序 ...

  9. Android 操作系统的内存回收机制(转载)

    Android 操作系统的内存回收机制(转载) Android APP 的运行环境 Android 是一款基于 Linux 内核,面向移动终端的操作系统.为适应其作为移动平台操作系统的特殊需要,谷歌对 ...

随机推荐

  1. 开发Wordpress主题时没有特色图片的功能

    在自己开发Wordpress主题的时候,发现右下方没有了之前见到的特色图片(Featured Image)功能模块 1.找到后台右上方的显示选项模块,下拉之后启用即可 2.如果以上步骤找不到该选项,那 ...

  2. HashMap(HashSet)的实现

    0. HashMap(TreeMAP).HashSet.HashTable 的关系 HashMap 的底层则维护着 Node<K, V>[] table; 一个一维数组用于快速访问(只在初 ...

  3. NOIP模拟题 膜法

    题目大意 给定若干组询问求$\sum\limits_{i=l}^r \dbinom{i}{k}$. 最终输出每组询问答案的乘积. 题解 首先把$l,r$分开处理相减,只需要求$\sum\limits_ ...

  4. java如何获取当前时间,精确到毫秒

    import java.text.SimpleDateFormat; import java.util.Date; import java.util.Calendar; //func1 Calenda ...

  5. 如何理解Robot Framework

    不知不觉公众号已经有很多人关注了,小编先谢谢大家的支持-今天我们就来谈一谈我对RF的理解,因为前段时间换了工作,目前RF知识基本用不上了.其实我在上一份工作中大部分都是在反复的使用前面讲过的知识——其 ...

  6. 转载 fpga中 restoring 和 non-restoring 除法实现。

    对于non-restoring方法,主要是用rem和den移位数据比较,rem_d长度为den+nom的总长,den_d长度为den+nom的总长度,rem_d的初始值为{{d_width{1'b0} ...

  7. js判断客户端是pc还是手机

    function IsPC() { var userAgentInfo = navigator.userAgent; var Agents = ["Android", " ...

  8. java向数据库插入时间

    tbUrsMember.setMemberRegisterTime(new Date(System.currentTimeMillis()));

  9. java中String和char的区别

    首先来看一下Java的数据类型.Java 包括两种数据类型: 1.原始数据类型(primitive data type):byte,short, char, int, long,float,doubl ...

  10. composer的安装和使用 学习日志

    如果你做为一个phper,没有用过composer,那你真的不是一个合格的开发者.那么就来记录一下composer的学习日志 下面分享几个学习源头: composer中文网站:https://www. ...