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. [置顶] 【机器学习PAI实践四】如何实现金融风控

    (本文数据为虚构,仅供实验) 一.背景 本文将针对阿里云平台上图算法模块来进行实验.图算法一般被用来解决关系网状的业务场景.与常规的结构化数据不同,图算法需要把数据整理成首尾相连的关系图谱.图算法更多 ...

  2. [置顶] Android 关于ToolBar分分钟玩死自己?

    场景一: 今天早上十点高高兴兴的跟平时早上一样买一杯粥然后一边喝着一边去上班,步行了15分钟到了公司,然后打指纹开门,然后就愉快的写代码了,我擦,好想电脑没开机,我晕好像没带眼镜,发现最近记性不是很好 ...

  3. Delphi XE4 Upate1 更新升级记录.

    一直没时间,这两天折腾了一下 升级了.  其实也可能修了老bug 引入新bug. 呵呵. 看看Emb 都修了什么吧.  我干脆是重新安装的. 虽然官方也有一个单独的update.exe.  从这些bu ...

  4. MbrFix 问题

    删除Windows/Linux双系统下的Linux系统 参考博客 注意:官网上的 MbrFix.exe 下载或许太慢. CSDN下载 问题 1.看到博客下面的评论写道: 为什么我的到第四步的时候会提示 ...

  5. [转载]Lwip之IP/MAC地址冲突检测

    from: http://blog.csdn.net/tianjueyiyi/article/details/51097447 LWIP是个轻量级的TCP/IP协议栈,之所以说轻量级,是因为作者将主体 ...

  6. [转载] 视音频数据处理入门:RGB、YUV像素数据处理

    ===================================================== 视音频数据处理入门系列文章: 视音频数据处理入门:RGB.YUV像素数据处理 视音频数据处理 ...

  7. 剑指offer-第四章解决面试题思路(字符串的排序)

    题目:输入一个字符串,打印出该字符串的全排列. 思路:将整个字符串分成两部分,第一部分为一个字符,将该字符和该字符后面的字符(直到最后一个字符)依次交换,确定第一个字符:然后固定第一个字符,将后面的字 ...

  8. java多线程:线程体往外抛出异常的处理机制实践

    1当线程的线程体内部无捕获异常,将异常抛出线程体外,不同情况下,程序处理机制 测试类 package com.ehking.bankchannel.domesticremit.facade.impl; ...

  9. centos6.5 安装nginx

    安装之前先安装VMware tools(方便于从windows上拷贝文件到linux) 1. nginx安装环境 nginx是C语言开发,建议在linux上运行,本次使用Centos6.5作为安装环境 ...

  10. Linux I2C设备驱动

    i2c设备:ts.camera.audio.gsensor.e2prom I2C基本协议: 写:开始 -> 设备地址 -> 写标志 -> 应答 -> 内部地址 -> 应答 ...