Android开发程序员Android技术知识

大型Bat面试知识总结分享—AMS在Android起到什么作用?

2019-07-16  本文已影响46人  06fd4cf1f427

面试官: AMS在Android起到什么作用,简单的分析下Android的源码

心理分析:这道题在发生在大多数场景下。面对这道题 很多求职很茫然,不知道该如何说起。AMS本身比较复杂难以理解。工作多年也很难弄清AMS的作用,其实我们大可从以下几点入手组件启动进程切换Crash异常入手

求职者:AMS难以表述 我们就从最熟知 的Activity启动入手,逐步深入和分析,用定力告诉面试官,我层深入研究过。接下来我们从五条线分析AMS作用及机制

概述

相信大多数动脑同学对文章中提到的ActivityManagerService(以后简称AMS)都有所耳闻。

AMS是Android中最核心的服务,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块相类似,因此它在Android中非常重要。 AMS是碰到的第一块难啃的骨头[①],涉及的知识点较多。为了帮助读者更好地理解AMS,接下来将带小伙伴么按五条不同的线来分析它。

由图可知:

AMS由SystemServer的ServerThread线程创建;

1. 初识ActivityManagerService总结

本节所分析的4个关键函数均较复杂,与之相关的知识点总结如下:

2. startActivity

总结 本文详细startActivity的整个启动流程,

启动流程

  1. 点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startActivity请求;

  2. system_server进程接收到请求后,向zygote进程发送创建进程的请求;

  3. Zygote进程fork出新的子进程,即App进程;

  4. App进程,通过Binder IPC向sytem_server进程发起attachApplication请求;

  5. system_server进程在收到请求后,进行一系列准备工作后,再通过binder IPC向App进程发送scheduleLaunchActivity请求;

  6. App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程发送LAUNCH_ACTIVITY消息;

  7. 主线程在收到Message后,通过发射机制创建目标Activity,并回调Activity.onCreate()等方法。 到此,App便正式启动,开始进入Activity生命周期,执行完onCreate/onStart/onResume方法,UI渲染结束后便可以看到App的主界面。

startActivity后半程总结

starActivity总结

Activity的启动就介绍到这里。这一路分析下来,相信读者也和笔者一样觉得此行绝不轻松。先回顾一下此次旅程:

3. 广播处理总结

4. startService流程图

总结 5.1 流程说明 在整个startService过程,从进程角度看服务启动过程

图中涉及3种IPC通信方式:Binder、Socket以及Handler,在图中分别用3种不同的颜色来代表这3种通信方式。一般来说,同一进程内的线程间通信采用的是 Handler消息队列机制,不同进程间的通信采用的是binder机制,另外与Zygote进程通信采用的Socket。

启动流程

  1. Process A进程采用Binder IPC向system_server进程发起startService请求;

  2. system_server进程接收到请求后,向zygote进程发送创建进程的请求;

  3. zygote进程fork出新的子进程Remote Service进程;

  4. Remote Service进程,通过Binder IPC向sytem_server进程发起attachApplication请求;

  5. system_server进程在收到请求后,进行一系列准备工作后,再通过binder IPC向remote Service进程发送scheduleCreateService请求;

  6. Remote Service进程的binder线程在收到请求后,通过handler向主线程发送CREATE_SERVICE消息;

  7. 主线程在收到Message后,通过发射机制创建目标Service,并回调Service.onCreate()方法。 到此,服务便正式启动完成。当创建的是本地服务或者服务所属进程已创建时,则无需经过上述步骤2、3,直接创建服务即可。

5. AMS中的进程管理

前面曾反复提到,Android平台中很少能接触到进程的概念,取而代之的是有明确定义的四大组件。但是作为运行在Linux用户空间内的一个系统或框架,Android不仅不能脱离进程,反而要大力利用Linux OS提供的进程管理机制和手段,更好地为自己服务。作为Android平台中组件运行管理的核心服务,ActivityManagerService当仁不让地接手了这方面的工作。目前,AMS对进程的管理仅涉及两个方面:

6. App的Crash处理总结

应用进程进行Crash处理的流程。[[图片上传失败...(image-bd3406-1561648443575)]


一、概述

ActivityManagerService是Framework层的核心服务之一,ActivityManagerService是Binder的子类,它的功能主要以下三点:

二、ActivityManagerService的启动过程

ActivityManagerService的启动是在systemserver进程的startBootstrapServices方法中启动的。SystemServiceManager.startService(ActivityManagerService.Lifecycle.class) 功能主要: 创建ActivityManagerService.Lifecycle对象; 调用Lifecycle.onStart()方法。

三、主要功能之一的四大组件的统一调度

ActivityManagerService最主要的功能就是统一的管理者activity,service,broadcast,provider的创建,运行,关闭.我们在应用程序中启动acitivity,关闭acitiviy等操作最终都是要通过ams来统一管理的.这个过程非常的复杂,不是一下子可以讲的清楚的,我这里推荐老罗的博客来讲解四大组件的启动过程:

Android应用程序内部启动Activity过程(startActivity)的源代码分析 Android系统在新进程中启动自定义服务过程(startService)的原理分析 Android应用程序注册广播接收器(registerReceiver)的过程分析 Android应用程序发送广播(sendBroadcast)的过程分析 Android应用程序组件Content Provider简要介绍和学习计划

四、主要功能之一的内存管理

我们知道当一个进程中的acitiviy全部都关闭以后,这个空进程并不会立即就被杀死,而是要等到系统内存不够时才会杀死。但是实际上ActivityManagerService并不能够管理内存,android的内存管理是Linux内核中的内存管理模块和OOM进程一起管理的。

Android进程在运行的时候,会通过Ams把每一个应用程序的oom_adj值告诉OOM进程,这个值的范围在-16-15,值越低说明越重要,越不会被杀死。当发生内存低的时候,Linux内核内存管理模块会通知OOm进程根据AMs提供的优先级强制退出值较高的进程。因此Ams在内存管理中只是扮演着一个提供进程oom_adj值的功能.真正的内存管理还是要调用OOM进程来完成,下面通过调用Activity的finish()方法来看看内存释放的情况。

当我们手动调用finish()方法或者按back键时都是会关闭activity的,在调用finish的时候只是会先调用ams的finishActivityLocked方法将当前要关闭的acitiviy的finish状态设置为true,然后就会先去启动新的acitiviy,当新的acitiviy启动完成以后就会通过消息机制通知Ams,Ams在调用activityIdleInternalLocked方法来关闭之前的acitiviy。

福利时间:

好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划,可以加一下下面的技术群来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。

这里放上一个两千人的技术交流大群:Android架构设计(185873940)

面试相关资料的也可以加这个群免费领取的~

PS:群内有许多技术大牛,有任何问题,欢迎广大网友一起前来交流吐槽

这里放上一部分我工作以来以及参与过的大大小小的面试收集总结出来的一套进阶学习的视频及面试专题资料包,在这里免费分享给大家,主要还是希望大家在如今大环境不好的情况下面试能够顺利一点,希望可以帮助到大家~ 领取方式文末有分享的~

上一篇下一篇

猜你喜欢

热点阅读