安卓工程师_安卓开发面试题(24/30)之APK启动流程

牛客高级系列专栏:

安卓(安卓系统开发也要掌握)

嵌入式

本人是2020年毕业于广东工业大学研究生:许乔丹,有国内大厂CVTE和世界500强企业安卓开发经验,该专栏整理本人对常见安卓高频开发面试题的理解;

网上安卓资料千千万,笔者将继续维护专栏,一杯奶茶价格不止提供答案解析,承诺提供专栏内容免费技术答疑,直接咨询即可。助您提高安卓面试准备效率,为您面试保驾护航!

正文开始⬇

应用程序的启动流程,是较为高频的面试题,因为涉及的知识点比较多,适合考验一个人安卓技术的掌握程度,不过原理也比较复杂。本人也被问过这题目,不过当时只是简单地但全面的描述了从桌面点击应用图标到应用启动的完整流程,不涉及具体源码,最终面试官也还是很满意的。面试官可能会问:

  1. 你知道桌面点击应用图标到应用显示期间系统实现了什么流程吗?⭐⭐⭐⭐
  2. 冷启动和热启动的区别 ⭐⭐
  3. 桌面点击启动APP和从另一个程序跳转过去有什么区别?⭐⭐

目录

  • 1、流程概述
  • 2、基础知识
  • 3、启动流程
    • Step1 点击图标
    • Step2 创建App进程
    • Step3:绑定Application
    • Step4:scheduleLaunchActivity()
    • Step5 启动Activity
  • 4、桌面点击启动APP和从另一个程序跳转过去有什么区别?

1、流程概述

从点击桌面的APP图标,到APP主页显示出来,大致会经过以下流程:

  1. 点击桌面App图标,Launcher进程采用Binder跨进程机制向system_server进程发起startActivity请求;
  2. system_server进程接收到请求后,向Zygote进程发送创建进程的请求,Zygote进程fork出新的子进程,即新启动的App进程;
  3. App进程,通过Binder机制向sytem_server进程发起attachApplication请求(绑定Application);
  4. system_server进程在收到请求后,进行一系列准备工作后,再通过binder机制向App进程发送scheduleLaunchActivity请求;
  5. App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程发送LAUNCH_ACTIVITY消息。主线程在收到Message后,通过发射机制创建目标Activity,并回调Activity.onCreate()/onStart()/onResume()等方法,经过UI渲染结束后便可以看到App的主界面。

2、基础知识

文章开头就提到,APP启动流程涉及的知识比较多,在此总结一下各个基础知识:

  • 冷启动:当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动,下文讲述的APP启动流程属于冷启动;
  • 热启动:当启动应用时,后台已有该应用的进程(例:按back键、home键,应用虽然会退出,但是该应用的进程是依然会保留在后台,可进入任务列表查看),所以在已有进程的情况下,这种启动会从已有的进程中来启动应用,这个方式叫热启动;
  • 一个APP就是一个单独的进程,对应一个单独的Dalvik虚拟机;
  • Launcher:我们打开手机桌面,手机桌面其实就是一个系统应用程序,这个应用程序就叫做“Launcher”。同样的,下拉菜单其实也是一个应用程序,叫做“SystemUI”;
  • Binder:跨进程通讯的一种方式,在本系列文章《Binder》一文有详述;
  • Zygote:Android系统基于Linux内核,当Linux内核加载后会启动一个叫“init”的进程,并fork出“Zygote”进程。Zygote意为“受精卵”,无论是系统服务进程,如ActivityManagerService、PackageManagerService、WindowManagerService等等,还是用户启动的APP进程,都是由Zygote进程fork出来的;
  • system_server:系统服务进程,也是Zygote进程fork出来的。该进程和Zygote进程是Android系统中最重要的两个进程,系统服务ActivityManagerService、PackageManagerService、WindowManagerService等等都是在system_server中启动的;
  • ActivityManagerService:活动管理服务,简称AMS,负责系统中所有的Activity的管理;
  • App与AMS通过Binder进行跨进程通信,AMS与Zygote通过Socket进行跨进程通信;
  • Instrumentation:主要用来监控应用程序和系统的交互,是完成对Application和Activity初始化和生命周期的工具类。每个Activity都持有Instrumentation对象的一个引用,但是整个进程只会存在一个Instrumentation对象;
  • ActivityThread:依赖于UI线程,ActivityThread不是指一个线程,而是运行在主线程的一个对象。App和AMS是通过Binder传递信息的,那么ActivityThread就是专门与AMS的外交工作的。ActivityThread是APP的真正入口,APP启动后从ActivityThread的main()函数开始运行;
  • ActivityStack:Activity在AMS的栈管理,用来记录经启动的Activity的先后关系,状态信息等。通过ActivtyStack决定是否需要启动新的进程;
  • ApplicationThread:是ActivityThread的内部类,是ActivityThread和ActivityManagerServie交互的中间桥梁。在ActivityManagerSevice需要管理相关Application中的Activity的生命周期时,通过ApplicationThread的代理对象与ActivityThread通信;

3、启动流程

本文主要讲解apk启动的流程,在面试中可以将完整流程讲出来,最多讲到几个关键函数,已经非常好了,因此下文尽量不涉及源码,需要学习源码的同学可自行百度或者参考:《startActivity启动过程分析》

Step1 点击图标

系统启动过程中,会启动PMS服务,该服务会扫描解析系统中所有APP的AndroidManifest文件,在Launcher应用启动后,会将每个APP的图标和相关启动信息封装在一起。回想平时应用开发中,启动一个新的Activity是通过startAcitvity()方法。因此在桌面点击应用图标,也是在Luancher这个应用程序里面根据当前点击的APP的启动信息,执行startAcitvity()方法,通过Binder通信,最后调用ActivityManagerService的startActivity()方法。流程图如下:

alt

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

Android高频面试题全解析 文章被收录于专栏

#提供免费售后答疑!!花一杯奶茶的钱获得安卓面试答疑服务,稳赚不赔# Android发展已经很多年,安卓资料网上千千万,本专栏免费提供专栏内容技术答疑!!私聊当天必回。在阅读过程或者其他安卓学习过程有疑问,都非常欢迎私聊交流。

全部评论

相关推荐

头像
11-09 12:17
清华大学 C++
out11Man:小丑罢了,不用理会
点赞 评论 收藏
分享
点赞 评论 收藏
分享
5 13 评论
分享
牛客网
牛客企业服务