> Android系统中的进程管理:
进程的创建--
http://qiangbo.space/2016-10-10/AndroidAnatomy_Process_Creation/
对于Android来说,进程管理的主要内容包括以下几个部分内容:
进程的创建
进程的优先级管理
进程的内存管理
进程的回收和死亡处理
在应用程序中,开发者通过:
startActivity(Intent intent) 来启动Activity
startService(Intent service) 来启动Service
sendBroadcast(Intent intent) 来发送广播
ContentResolver 中的接口来使用ContentProvider
这其中,startActivity,startService和sendBroadcast还有一些重载方法。
Activity的启动是一个非常复杂的过程。这里我们简单介绍一下背景知识:
ActivityManagerService中通过Stack和Task来管理Activity
每一个Activity都属于一个Task,一个Task可能包含多个Activity。一个Stack包含多个Task
ActivityStackSupervisor类负责管理所有的Stack
Activity的启动过程会牵涉到:
Intent的解析
Stack,Task的查询或创建
Activity进程的创建
Activity窗口的创建
Activity的生命周期调度
在Activity启动的最后,会将前一个Activity pause,将新启动的Activity resume以便被用户看到。
在这个时候,如果发现新启动的Activity进程还没有启动,则会通过startSpecificActivityLocked将其启动。整个调用流程如下:
ActivityManagerService.activityPaused =>
ActivityStack.activityPausedLocked =>
ActivityStack.completePauseLocked =>
ActivityStackSupervisor.ensureActivitiesVisibleLocked =>
ActivityStack.makeVisibleAndRestartIfNeeded =>
ActivityStackSupervisor.startSpecificActivityLocked =>
ActivityManagerService.startProcessLocked
启动Service的调用流程如下:
ActivityManagerService.startService =>
ActiveServices.startServiceLocked =>
ActiveServices.startServiceInnerLocked =>
ActiveServices.bringUpServiceLocked =>
ActivityManagerService.startProcessLocked
ActiveServices.bringUpServiceLocked会判断如果Service所在进程还没有启动,
则通过ActivityManagerService.startProcessLocked将其启动。
开发者通过ContentResolver中的insert, delete, update, query这些API来使用ContentProvider。在ContentResolver的实现中,无论使用这里的哪个接口,ContentResolver都会先通过acquireProvider 这个方法来获取到一个类型为IContentProvider的远程接口。这个远程接口对接了ContentProvider的实现提供方。
开发者通过Context.sendBroadcast接口来发送广播。ActivityManagerService.broadcastIntent 方法了对应广播发送的处理。
在ActivityManagerService内部,是通过队列的形式来管理广播的:
BroadcastQueue 描述了一个广播队列
BroadcastRecord 描述了一个广播事件
在ActivityManagerService中,如果收到了一个发送广播的请求,会先创建一个BroadcastRecord接着将其放入BroadcastQueue中。
然后通知队列自己去处理这个广播。然后ActivityManagerService自己就可以继续处理其他请求了。
广播队列本身是在另外一个线程处理广播的发送的,这样保证的ActivityManagerService主线程的负载不会太重。
> Android系统中的进程管理:
进程的优先级--
http://qiangbo.space/2016-11-23/AndroidAnatomy_Process_OomAdj/
在Android系统中,进程的优先级影响着以下三个因素:
当内存紧张时,系统对于进程的回收策略
系统对于进程的CPU调度策略
虚拟机对于进程的内存分配和垃圾回收策略
在如下一些情况下,系统会对所有应用进程的优先级进行更新:
当有一个新的进程启动时
当有一个进程退出时
当系统在清理后台进程时
当有一个进程被标记为前台进程时
当有一个进程进入或者退出cached状态时
当系统锁屏或者解锁时
当有一个Activity启动或者退出时
当系统正在处理一个广播事件时
当前台Activity发生改变时
当有一个Service启动时
> Android系统中的进程管理:
内存的回收--
http://qiangbo.space/2016-12-08/AndroidAnatomy_Process_Recycle/ 对于内存回收,主要可以分为两个层次: 进程内的内存回收:通过释放进程中的资源进行内存回收 进程级的内存回收:通过杀死进程来进行内存回收 这其中,进程内的内存回收主要分为两个方面: 虚拟机自身的垃圾回收机制 在系统内存状态发生变化时,通知应用程序,让开发者进行内存回收 而进程级的内存回收主要是依靠系统中的两个模块,它们是: Linux OOM Killer LowMemoryKiller 垃圾回收的基本想法是要找出虚拟机中哪些对象已经不会再被使用然后将其释放。其最常用的算法有下面两种: 引用计数算法;对象追踪算法