继续来研究Android Framework层相关的一些东东,这里是以Android8.0版本的源码进行梳理的,关注的仍是其核心流程,不是完全分析,了解了核心流程是为了了期其大概的原理。html
这里具体就不分析代码了,由于重点是来分析AMS相关的代码,这里以流程图的方式来展示一下整个的启动,毕境对于一个组件的启动得要创建在整个Android系统启动基础之上的,另外这块的具体源码也不敢看,还没达到这种能直接分析底层的能力,因此先从大局观来了解其流程,下面开始:android
接着就启动Linux内核了:web
而后再启动init进程:服务器
接着则启动我们熟知的Zygote进程了:架构
接下来则启动各类服务了:app
而其中当启动了AMS服务以后,则就会启动Launch应用程序了,以下:函数
咱们知道以上服务最终都获得ServiceManager进行注册,由于其实都是一个Binder通讯的过程,因此再来复习一下ServiceManager的启动流程。oop
那知道了ServiceManager什么时候启动的,接下来重点来看一下我们此次要研究的AMS(ActivityManagerService)它是怎么注册ServiceManager上的。源码分析
其中ServiceManager就是一个服务端的角色,而AMS则是一个客户端的角色。spa
在知道了AMS服务器注册过程以后,接下来则看一下一个Android应用是如何启动的,先来贴一张流程图:
好,接下来分析一下相关的源码,看一下是否如流程图所示,这里仍是采用在线的androidxref.com上来进行源码分析,我电脑本地木有下载,省点事:
首先来看一下Zygote进程的启动:
而后它里面有一个main主入口函数:
也就是以前Android系统启动流程图这块所示:
最后则开启死循环来等待Ams的请求,以下:
其实也就是对应这个流程:
好,接下来再来分析一个应用是如何启动的,按流程图上的来:
那就定位到AMS中:
而后:
其中能够看到里面会传要启动应用的各类信息:
而后跟进去瞅一眼:
也就是到了这一步:
流程也就到了这:
其中能够看到设置了一系列的参数:
而后再下一步:
对应代码:
注意上面是“Zygote主模式”,好,若是这个条件不匹配,则会继续往下执行,以下:
好,若是链接成功,则流程会走到了:
而最终的代码在这:
此时咱们所熟知的ActivityThread的main()方法就会被调用了,而后整个应用就启动了。
这里先回顾一下整个Android系统启动流程的这一步,串一下:
此时咱们点击Launch应用中的某个图标,则会启动该应用的根Activity,其整个流程先看一下流程图:
好,依据此流程来看一下对应的源代码:
此时就会建立Application:
最终会调到这:
走进去瞅一下它的细节:
而后再跟进去:
而对于一些Activity的其它生命周期的启动都是经过ActivityThread中的Handler来实现的:
对于Activity的启动咱们确定得要调用startActivity()方法,因此我们就从这个方法为入口逐一来剖析其里面的机理,仍是很复杂的,下面开始:
因此接下来看一下Instrumentation的启动细节:
而这个ActivityManagerNative在以前https://www.cnblogs.com/webor2006/p/11811650.html分析Binder机制见过,以下:
其实它也是一个典型的AIDL的Binder通讯,打开再来瞅一下:
而后它里面还有一个Proxy:
此时就会调用到Proxy中的startActivity()方法进行Binder通信了:
此时就会经过Binder驱动调用它的Stub的onTransact()的方法,以下:
此时就会调用ActivityManagerService的startActivity方法,由于它是ActivityManagerNative的具体实现类:
此时,就到了跨进程访问了,在这以前都是在本进程的逻辑,好接下来继续分析:
其中看注释说明,是切换到用户app的栈了,咱们知道Android的Activity是以栈的形式来管理的,因此它是比较核心的了,能够大体看一下它里面有一些栈的管理:
这个栈的管理在以后的分析中还会有说起到,先有个大体印象,先来关注主流程:
而其实又是一个AIDL的过程,进去稍看一下它的细节:
而看一下它具体的实现:
就是从ServiceManager中来找到package相关的服务,标准的AIDL的调用过程,那IPackageManager的具体实现类是哪一个呢?实际上是这个,也就是继承了IPackageManager中的抽象类Stub的实现类,实际上是它:
那看一下它的resolveIntent()方法:
查看一下这个方法的细节:
而后回到resolveIntent()方法来,则会看到有一个根据优先级来选择最佳的ResolveInfo,以下:
好,这里还得再来讲一下PackageManagerService这个很重要的服务,主要是管理包的一些信息,咱们知道在apk安装到系统中时,会在/data/app之类的系统目录下存在,而该服务则会扫描注册在清单中的一些包信息,那么看一下构造方法就能找到一些相关的信息,以下:
因此能够看到该服务器就是来扫描一些包的信息用的,而这构造函数的调用是在这里:
因此这也是为啥在以前这块能够看到拿服务就是用的"package"这个key,回忆下:
其实Android的不少核心服务都是这样会往ServiceManager去注册的。
好,接下来接着主流程继续:
那看一下它的细节,能够看到各类异常检测,这里截其中一小部分:
最终生成一个ActivityRecord对像来保存相关信息:
该方法的实现代码也比较多,就瞅一下它的大体细节既可:
里面真的是很是之复杂,也看不懂,有个大致的了解,重点是了解整个主流程的过程,好继续,直接跳到这方法的最后:
它是专门来维护任务栈的进出的,而上面的ActivityStackSupervisor是维护各个栈的信息,职责不同,那下面来看一下该方法的细节:
在最后:
此时又回到了ActivityStackSupervisor了,以下:
也就是以下:
这个里面实现的代码理很是之多,只看核心的,在要跳转到新的Activity以前,先会把一些Activity给暂停了,瞅一下这块的核心流程:
而后在跳到新Activity以前,会先暂停当前的Activity,以下:
此时看一下这个方法的细节:
而prev.app.thread其实就是ActivityThread,而它里面实际上是一个IPC的过程,以下:
此时就会到了ActivityThread中的消息处理中心了,以下:
下面具体看一下它的实现:
一、正式让以前的Activity暂停:
二、告诉AMS已经暂停完成:
回到这个方法继续执行,就会发现:
而最终会调到ActivityManagerService,以下:
而后就会调用到ActivityStack.activityPausedLocked()方法。
其中这个方法有一个resumeNext参数,传的true,这里想想就明白其意思,暂停了当前显示的Activity以后,那确定得要将要跳转的Activity给显示呀,而这个参数就是控制要显示跳转的Activity的逻辑的,以下:
而后在这个方法里面则会有一个关键的逻辑判断,在启动新的Activity时,先判断是否该Activity是在同一个进程:
若是为ture则代码要启动的Activity为同一个进程,这里就不细看了,若是条件不知足则表明进程不存在,须要建立进程,这里瞅一下,以下:
好,又回到了这个栈管理类了,看一下它的细节:
当进程被启动以后,则该进程的ActivityThread.main()方法就会被执行,这块就比较熟了。主要是建立一个Looper。
而上面的attach的具体实现:
会调用IActivityManager.attachApplication()方法了,此时就会调用ActivityServiceManager.attachApplication(),以下:
而后往这个方法找一下,会有以下核心代码:
此时又回到了这个栈管理大管家,瞅下:
其中performLaunchActivity方法就是来建立要启动的Activity,稍微看一下细节:
至此关于Activity的启动的主流程就分析完了,太TM复杂了。。能够看到Android底层的代码有不少C/S架构、分模块的思想,真的是博大精深。。
接下来再来分析Android的另外一大组件的启动---Service,先来贴一下大致的主流程图:
好,下面来瞅一下源码:
具体细节就不看了,最终会调到ActivityThread的这块:
还有其它相关的一些跟服务相关的东东在里面,大体贴一下: