一、Android系统进程简介
1、Android系统进程启动方式:init进程 –> Zygote进程 –> SystemServer进程 –>各种应用进程
2、init进程:linux的根进程,android系统是基于linux系统的,因此可以算作是整个android操作系统的第一个进程
3、Zygote进程:android系统的根进程,主要作用:可以作用Zygote进程fork出SystemServer进程和各种应用进程
4、SystemService进程:主要是在这个进程中启动系统的各项服务,比如ActivityManagerService,PackageManagerService,WindowManagerService服务等等
5、各种应用进程:启动自己编写的客户端应用时,一般都是重新启动一个应用进程,有自己的虚拟机与运行环境
二、Zygoto启动流程
1、初始化DDMS
2、注册Zygote进程的socket通讯
3、初始化Zygote中的各种类,资源文件,OpenGL,类库,Text资源等等
4、初始化完成之后fork出SystemServer进程(android系统中进程之间通讯的方式是Binder,但是有一个例外是SystemService进程与Zygote进程之间是通过Socket的方式进行通讯的)
5、fork出SystemServer进程之后,关闭socket连接
三、SystemServer启动流程
1、SystemServer进程是android中一个很重要的进程由Zygote进程启动
2、SystemServer进程主要用于启动系统中的服务
3、SystemServer在执行过程中首先会初始化一些系统变量,加载类库,创建Context对象,创建SystemServiceManager对象等之后才开始启动系统服务(ActivityThread.systemMain方法创建context)
4、SystemServer进程将系统服务分为三类:boot服务(AMS、PMS、LED服务、显示Service等),core服务(电池、webview等)和other服务,并逐步启动
5、SertemServer进程在尝试启动服务之前会首先尝试与Zygote建立socket通讯,只有通讯成功之后才会开始尝试启动服务
6、创建的系统服务过程中主要通过SystemServiceManager对象来管理
7、服务对象都有自己的异步消息对象,并运行在单独的线程中
四、Launcher启动流程
1、Launcher程序是我们平时看到的桌面程序(系统默认第一个启动的应用程序)
2、Zygote进程 –> SystemServer进程 –> startOtherService方法 –> ActivityManagerService的systemReady方法 –> startHomeActivityLocked方法 –> ActivityStackSupervisor的startHomeActivity方法 –> 执行Activity的启动逻辑,执行scheduleResumeTopActivities()方法
3、因为是隐士的启动Activity,所以启动的Activity就是在AndroidManifest.xml中配置catogery的值为:
public static final String CATEGORY_HOME = "android.intent.category.HOME";
4、LauncherActivity中是以ListView来显示我们的应用图标列表的,并且为每个Item保存了应用的包名和启动Activity类名,这样点击某一项应用图标的时候就可以根据应用包名和启动Activity名称启动我们的App了
五、应用进程启动流程
1、android应用进程会在需要启动其组件的时候启动,当没有任何组件运行或者是系统内存较低的时候应用进程会被杀死
2、在启动应用四大组件的时候若发现当前应用的进程没有启动,则会首先启动应用程序的进程
3、我们可以为应用程序配置多个进程,每个进程都有自己的JVM和运行环境,各个进程之间的通讯需要通过Binder机制
六、系统启动并解析Manifest的流程
1、android系统启动之后会解析固定目录下的apk文件,并执行解析,持久化apk信息,重新安装等操作
2、解析Manifest流程:Zygote进程 –> SystemServer进程 –> PackgeManagerService服务 –> scanDirLI方法 –> scanPackageLI方法 –> PackageParser.parserPackage方法
3、解析完成Manifest之后会将apk的Manifest信息保存在Settings对象中并持久化,然后执行重新安装的操作(shell的install命令)
七、apk安装流程
1、代码中执行intent.setDataAndType(Uri.parse(“file://” + path),”application/vnd.android.package-archive”);可以调起PackageInstallerActivity
2、PackageInstallerActivity主要用于执行解析apk文件,解析manifest,解析签名等操作
3、InstallAppProcess主要用于执行安装apk逻辑,用于初始化安装界面,用于初始化用户UI。并调用PackageInstaller执行安装逻辑
4、InstallAppProcess内注册有广播,当安装完成之后接收广播,更新UI。显示apk安装完成界面
八、Activity启动流程
1、Activity的启动流程一般是通过调用startActivity或者是startActivityForResult来开始的
2、startActivity内部也是通过调用startActivityForResult来启动Activity,只不过传递的requestCode小于0
3、Activity的启动流程涉及到多个进程之间的通讯这里主要是ActivityThread与ActivityManagerService之间的通讯
4、ActivityThread向ActivityManagerService传递进程间消息通过ActivityManagerNative,ActivityManagerService向ActivityThread进程间传递消息通过IApplicationThread(因为Binder机制是单向的、异步的)
5、ActivityManagerService接收到应用进程创建Activity的请求之后会执行初始化操作,解析启动模式,保存请求信息等一系列操作
6、ActivityManagerService保存完请求信息之后会将当前系统栈顶的Activity执行onPause操作,并且IApplication进程间通讯告诉应用程序继承执行当前栈顶的Activity的onPause方法
7、ActivityThread接收到SystemServer的消息之后会统一交个自身定义的Handler对象处理分发
8、ActivityThread执行完栈顶的Activity的onPause方法之后会通过ActivityManagerNative执行进程间通讯告诉ActivityManagerService,栈顶Actiity已经执行完成onPause方法,继续执行后续操作
9、ActivityManagerService会继续执行启动Activity的逻辑,这时候会判断需要启动的Activity所属的应用进程是否已经启动,若没有启动则首先会启动这个Activity的应用程序进程
10、ActivityManagerService会通过socket与Zygote继承通讯,并告知Zygote进程fork出一个新的应用程序进程,然后执行ActivityThread的mani方法
11、在ActivityThead.main方法中执行初始化操作,初始化主线程异步消息,然后通知ActivityManagerService执行进程初始化操作
12、ActivityManagerService会在执行初始化操作的同时检测当前进程是否有需要创建的Activity对象,若有的话,则执行创建操作
13、ActivityManagerService将执行创建Activity的通知告知ActivityThread,然后通过反射机制创建出Activity对象,并执行Activity的onCreate方法,onStart方法,onResume方法
14、ActivityThread执行完成onResume方法之后告知ActivityManagerService onResume执行完成,开始执行栈顶Activity的onStop方法
15、ActivityManagerService开始执行栈顶的onStop方法并告知ActivityThread
16、ActivityThread执行真正的onStop方法
九、Activity销毁流程
1、Activity的销毁流程是从finish方法开始的
2、Activity销毁过程是:onPause –> onRestart –> onStart –> onResume –> onStop –> onDestroy
3、Activity的销毁流程是ActivityThread与ActivityManagerService相互配合销毁的
十、应用进程Context创建流程
1、Activity中创建ContextImpl对象的具体实现在ActivityThread的performLauncherAcitivty方法中
2、Activity的创建伴随着ContextImpl的创建,二者相互持有对方的引用
3、创建Activity –> 创建Activity相关ContextImpl对象
4、如果没有application,则创建应用进程 –> 创建Application –> 创建Application相关ContextImpl对象(所以只要一个application)
5、application创建过程:ActivityThread.main方法–> ActivityManagerService.bindApplication方法 –> ActivityThread.handleBindApplication –> 创建Instrumentation,创建Application
6、Instrumentation、Application、Activity都是通过java反射机制创建
十一、Activity布局加载流程
1、Activity的展示界面的特性是通过Window对象来控制的
2、每个Activity对象都对应这个一个Window对象,并且Window对象的初始化在启动Activity的时候完成,在执行Activity的onCreate方法之前
3、每个Window对象内部都存在一个FrameLayout类型的mDector对象,它是Acitivty界面的root view
4、Activity中的window对象的实例是PhoneWindow对象,PhoneWindow对象中的几个成员变量mDector,mContentRoot,mContentParent都是View组件,它们的关系是:mDector –> mContentRoot –> mContentParent –> 自定义layoutView
5、LayoutInflater.inflate主要用于将布局文件加载到内存View组件中,也可以设定加载到某一个父组件中
6、典型的Activity的onCreate方法中需要调用super.onCreate方法和setContentView方法,若不调用super.onCreate方法,执行启动该Activity的逻辑会报错,若不执行setContentView的方法,该Activity只会显示一个空页面
十二、Activity布局绘制流程
1、Activity执行onResume之后再ActivityThread中执行Activity的makeVisible方法
2、View的绘制流程包含了测量大小,测量位置,绘制三个流程
3、Activty的界面绘制是从mDector即根View开始的,也就是从mDector的测量大小,测量位置,绘制三个流程
4、View的测量大小流程:performMeasure –> measure –> onMeasure等方法
5、View的测量位置流程:performLayout –> layout –> onLayout等方法
6、View的绘制流程:onDraw等方法(从ViewRootImpl的performTraversals方法开始)7、View组件的绘制流程会在onMeasure,onLayout以及onDraw方法中执行分发逻辑,也就是在onMeasure同时执行子View的测量大小逻辑,在onLayout中同时执行子View的测量位置逻辑,在onDraw中同时执行子View的绘制逻辑
8、Activity中都对应这个一个Window对象,而每一个Window对象都对应着一个新的WindowManager对象(WindowManagerImpl实例)
9、View组件的最终显示落实是通过draw方法实现绘制的,而我们的draw方法的参数是一个Canvas,这是一个画布的对象,通过draw方法就是操作这个对象并显示出来,而Canvas对象之所以能够实现显示的效果是因为其内部保存着一个Bitmap对象,通过操作Canvas对象实质上是操作Canvas对象内部的Bitmap对象,而View组件的显示也就是通过这里的Bitmap来实现的