上一节学习了linux kernel中Android专用驱动,并重点介绍了三个最重要的驱动Logger Binder以及Ashmem,注意对应文件所在的目录和jni整体调用过程。
这一篇我们要学习的是内核中的进程管理机制。、
Android系统的启动过程:
这篇写得挺好:http://blog.jobbole.com/67931/
引用里面的一个图片,个人感觉很清晰,图片的错别字请忽略。
图解:启动电源,从ROM中把引导程序加载到RAM当中,然后执行引导程序,引导程序不是Android操作系统,但却是厂商加锁限制的地方,引导程序为加载内核做准备工作,之后就是加载内核了,内核之后就进入了最重要的一部分了,内核启动的第一个init进程。
Init进程会挂载一些目录,并且执行init.rc初始化脚本文件(系统初始化要触发的动作和要启动的服务及其各自属性都在rc脚本文件中定义。),这时候对应开机是显示Android logo。之后,由init进程创造出守护进程和service Manager(Binder机制的组件之一)以及最重要的zygote进程。然后复制zygote进程的地址空间为Dalvik虚拟机实例,并创建System Servers,之后的所有Android的进程都是通过Zygote进程fork出来的,这一阶段就是开机动画的时间。最后的最后,各种系统服务注册到service Manager当中,至此启动过程就到一段落了,成功进入Android系统了。
Android应用程序进程启动过程:
acvitityManagerService会在需要启动组件时创建一个进程(组件思想篇)。
当进程创建的时候,会加载ActivityThread这个类,进入main函数,就是执行消息循环的地方了,android的所有函数都是在一个消息循环中执行的;同时,会启动一个线程池来给server组件和binder驱动进行进程间通讯。
综上,一个进程的入口是activityTHread.main入口,并且支持Binder通讯。
Android应用程序进程回收机制:
Linux的Out of Memory Killer ,每一个进程都有一个oom_adj的值,目录在
/proc/<pid>/oom_adj ,取值范围为-17~15,越小月不容易杀死。内存紧张时,OOM Killer综合进程的内存消耗量、CPU时间、存活时间和oom_adj值来决定是否要杀死一个进程来回收内存。
对于Android的Low-Memory-killer,oom_adj则是-16~15,内存紧张根据oom_adj和消耗内存数最大的杀死进程,同时,activityManagerService和windowManagerService也会在特定情况下主动回收进程。
Oom_adj:init启动的守护进程服务进程(比如system servers)等都是-16,android:persistent(常驻内存的意思)设置是为true的系统App进程为-12,前台activity为0,其他....具体百度了。
那么什么时候oom_adj会变化呢?
一、Activity状态变为stop
二、setProcessLimit:设置进程数量限制
三、取消注册广播
四、finishReceiver:结束Broadcast Receiver
总结:andrid的启动过程(一个图,加深记忆),应用程序进程的启动过程,以及进程回收机制,启动到回收,形成一个闭环。
Android的启动过程,按下开机键,把ROM当中的引导程序加载到RAM当中,然后执行引导程序,引导程序是厂商加锁的地方,引导程序是为加载内核做准备的,内核加载完成,此时应该显示android的logo。之后,内核启动init进程,手机表现为开始开机动画,init进程除了挂载目录之外,还启动了一个init.rc初始化脚本,用来启动一些服务进程等,然后守护进程,serviceManager以及很重要的Zygote就启动起来了,系统的服务(system Servers)以及之后的应用程序,都是由Zygote进程fock出来的,一提供一些比如共享内存的特性,davik虚拟机也是复制zygote内存空间来的,最后,系统服务再注册到serviceManager当中。
App的进程启动,进程入口是activityThrread.main,所有函数都是在消息循环中执行的;还在启动的过程启动线程池,以支持Binder通讯服务。
进程的回收,android是lmk,oom_adj的值决定回不回收,-16~15,一般前台就是0,系统app设置persistent为True后为-12,init以及启动的系统进程为-16,特定情况下,activityManagerService和windowManagerService也会回收掉进程。