您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > android系统架构与内核初印象
Android系统架构与内核实现原理初窥冯亚刚2012–07–02初识框架Android系统框架•Applications(应用程序层)•ApplicationFramework(应用程序框架层)•Libraries、AndroidRuntime(系统运行库层)•Linuxkernel(Linux内核层)应用程序层Application层是Android提供的核心应用层序包。是已经打包好的。应用层序都是有JAVA语言编写,通过调用应用程序框架层(ApplicationFramework)所提供的API来完成。也可以通过jni的方式开发原生的应用程序。(需要C/C++)应用程序框架层应用程序框架层为开发人员提供了可以访问核心应用所使用的API框架。也就是说我们开发应用程序时所调用的那些API都是应用程序框架层给提供的。我们不用知道每个API是怎么实现的,知道他是用来做什么的就行。当然,如果你想弄清楚他的实现机制和原理,你可以看这个API的源码。我们看下框架层给我们提供了那些组建给我们调用:ActivityManager:管理应用程序生命周期并提供常用的导航功能。比如:开启应用程序需要的资源和退出应用程序时要释放资源。WindowManager:管理所有开启的窗口程序。ContentProvider:是应用程序可以访问另一个应用程序的数据(如联系人的数据库),也有数据共享的意思。PackageManager:管理所有安装在Android系统中的应用程序。比如:信息查看和卸载应用程序等。还有ViewSystem、NotificationManager、ResourceManager、HardwareServices等等就不全部讲了。系统运行库层系统运行库层包括程序库和Android运行库两个部分,下面来分别介绍。程序库:Android包含一些C/C++库,这些库被Android系统中的不同组件所使用,然后通过应用程序框架层为开发者提供服。下面我们通过一个调用sqlite的例子来看这个流程。程序库(SQLite)App(对联系人进行增删改查)调用frameworkContentprovider的APIFramework(ContentProvider)通过JNIApplication层ApplicationFramework层Librarie层Android运行库层由框架图可以看到。Android运行库层又分为核心库和Dalvik虚拟机两个部分。核心库:核心库提供了Java语言核心库的大多数功能,主要通过JNI的方式向应用程序框架层提供调用底层程序库的接口。Dalvik虚拟机:Dalvik虚拟机是为了能够同时高效的运行多个VMs而实现的。(每个安卓应用程序都在它自己单独的进程中运行。都拥有单独的Dalvik虚拟机。这个我们会在以后的Dalvik虚拟机的时候详解)Dalvik虚拟机依赖Linux的一些功能,比如线程机制和底层的内存管理机制。Linux内核层Android依赖于Linux2.6版内核提供的核心系统服务。例如安全、内存管理、进程管理、网络栈、驱动模块等。内核作为一个抽象层,存在于软件栈层和硬件层之间。Android对Linux内核进行了增强,主要在以下方面:硬件时钟(Alarm)内存分配与共享(Ashmem)低内存管理(LowMemoryKiller)Kernel调试(KernelDebugger)日志设备(Logger)AndroidIPC机制(Binder)电源管理(PowerManagement)Android启动流程分析•上面我们讲了安卓的系统架构,下面我们来看下安卓的启动流程。通过启动流程的分析,可以初步的了解安卓系统是怎样从最底层的Linux内核一步一步变成最后的在手机里实现的应用程序的。Android系统在系统时首先会启动Linux基础系统,然后引导加载LinuxKernel并启动初始化进程(Init)。如图:LinuxKernelInit接着,Init会启动Linux守护进程(daemons)。这个过程主要是启动以下内容:usbdusbdusbdusbdInit在启动Linux守护进程(daemons)的时候同时启动Zygote进程和runtime进程。Zygote进程:初始化一个Dalvik虚拟机实例装载Socket请求所需的类和监听创建虚拟机实例来管理应用程序的进程。Runtime进程:初始化服务管理器注册服务管理器,以它为默认Binder服务的Context管理器ServiceManagerZygoteruntimedaemonsInitRuntime进程初始化后,讲发送一个请求到Zygote。开始启动系统服务,当Zygote收到请求后,讲为系统服务进程建立一个虚拟机实例,并启动系统服务。在系统服务启动后,系统服务将启动原生系统服务(主要包括SurfaceFlinger和AudioFlinger),这些本地系统服务将会注册到服务管理器(ServiceManager),作为IPC服务的目标。系统服务则会启动Android管理服务,这些都会被注册到服务管理器上。ServiceManagerZygoteruntimedaemonsInit请求DalvikVMSystemServerAudioFlingerSurfaceFlingerWindowmanagerActivitymanagerPackagemanager。。。。。ServiceManagerZygoteruntimedaemons请求DalvikVMSystemServerAudioFlingerWindowmanagerActivitymanagerPackagemanager。。。。。SurfaceFlingerInitDalvikVMDalvikVM最后,当系统加载完所有的服务后会处于等待状态,等待程序运行。但是每个应用程序都会启动一个单独的进程。如图,启动了一个Home进程和Contacts进程。安卓的启动流程就讲到这儿,下面我们来看下安卓的内核。HomeContactsAndroid内核机制•为什么Android使用Linux操作系统做内核?•因为这些:•1.强大的内存管理和进程管理•2.基于权限的安全模式•3.支持共享库•4.经过认证的驱动模型•5.Linux本身就是开源项目Android是Linux嘛?•当然不是。•安卓为采用linux作为内核,但是他并不是Linux。1.Android没有GNU/Linux上的X窗口系统。安卓并没有使用此窗口系统。2.它没有glibc支持,而是为了效率,GOOGLE自己开发了一套BionicLibc来替代glibc。3.重要的一点,android并没有完全照搬linux内核,在修改了linux的bug之外,还对它进行了修改于增加。比如:基于ARM框架的Gold-Fish平台(虚拟CPU).yaffsFlash文件系统等。。4.Android自己专有的驱动程序。(详细讲解)Android专有驱动•1.AndroidBinder•基于OpenBinder框架的驱动,用于android平台进程间通信。•2.Android电源管理(PM)•一个基于标准Linux电源管理系统的轻量级Android电源管理系统,•针对嵌入式设备进行了很多优化。•3.低内存管理器(LowMemoryKiller)•比Linux标准OOM更加灵活的内存管理机制,他根据需要杀死进程•来释放需要的内存。•…..还有几个就不多讲了LowMemoryKiller•LowMemoryKiller在用户空间中指定了一组内存临界值,当其中的某个值与进程描述中的oom_adj值在同一范围时,该进程将被kill。•通过对此机制的讲解,可以初步了android系统内核的实现机制与原理。从而推断出其他内核驱动的实现机制。LowMemoryKiller实现原理用直白的话讲,LowMemoryKiller的实现原理是这样。指定两个值,一个为oom_adj,是进程的标识值,比如“0,8”。一个为内存临界值,比如“1024,4096”。当一个进程的空闲存储空间到达某个临界值的时候,oom_adj的值与此临界值对应的进程将会被kill.oom_adj值越大,越容易优先被kill.占用物理内存越大,越容易被优先kill.01612oom_adj3*5122*10244*102416*1024空闲空间LowMemoryKiller具体实现首先要初始化init在init的方法中注册一个shrink函数(lowmem_shrink)。被注册的shrink函数为驱动的实现核心,当内存空间不足时就会调用此函数,此函数的功能就是Kill某个进程。此函数就是根据当前的最小空闲空间和oom_adj来进行对比。当找到满足条件的进程时,发送SIGKILL信号到内核,将此进程杀死.退出exit则是卸载被注册的shrink函数.流程图如下:initshrink注册函数某进程满足条件killexitshrink卸载函数初始Android系统架构与内核就到这里了。有不足的请大家帮忙见谅。
本文标题:android系统架构与内核初印象
链接地址:https://www.777doc.com/doc-5372846 .html