安卓工程师_安卓开发面试题(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发展已经很多年,安卓资料网上千千万,本专栏免费提供专栏内容技术答疑!!私聊当天必回。在阅读过程或者其他安卓学习过程有疑问,都非常欢迎私聊交流。

全部评论

相关推荐

想干测开的tomca...:让我来压力你!!!: 这份简历看着“技术词堆得满”,实则是“虚胖没干货”,槽点一抓一大把: 1. **项目描述是“技术名词报菜名”,没半分自己的实际价值** 不管是IntelliDoc还是人人探店,全是堆Redis、Elasticsearch、RAG这些时髦词,但你到底干了啥?“基于Redis Bitmap管理分片”是你写了核心逻辑还是只调用了API?“QPS提升至1500”是你独立压测优化的,还是团队成果你蹭着写?全程没“我负责XX模块”“解决了XX具体问题”,纯把技术文档里的术语扒下来凑字数,看着像“知道名词但没实际动手”的实习生抄的。 2. **短项目塞满超纲技术点,可信度直接***** IntelliDoc就干了5个月,又是RAG又是大模型流式响应又是RBAC权限,这堆活儿正经团队分工干都得小半年,你一个后端开发5个月能吃透这么多?明显是把能想到的技术全往里面塞,生怕别人知道你实际只做了个文件上传——这种“技术堆砌式造假”,面试官一眼就能看出水分。 3. **技能栏是“模糊词混子集合”,没半点硬核度** “熟悉HashMap底层”“了解JVM内存模型”——“熟悉”是能手写扩容逻辑?“了解”是能排查GC问题?全是模棱两可的词,既没对应项目里的实践,也没体现深度,等于白写;项目里用了Elasticsearch的KNN检索,技能栏里提都没提具体掌握程度,明显是“用过但不懂”的硬凑。 4. **教育背景和自我评价全是“无效信息垃圾”** GPA前10%这么好的牌,只列“Java程序设计”这种基础课,分布式、微服务这些后端核心课提都不提,白瞎了专业优势;自我评价那堆“积极认真、细心负责”,是从招聘网站抄的模板吧?没有任何和项目挂钩的具体事例,比如“解决过XX bug”“优化过XX性能”,纯废话,看完等于没看。 总结:这简历是“技术名词缝合怪+自我感动式凑数”,看着像“背了后端技术栈名词的应届生”,实则没干货、没重点、没可信度——面试官扫30秒就会丢一边,因为连“你能干嘛”都没说清楚。
点赞 评论 收藏
分享
10-28 22:01
已编辑
门头沟学院 测试开发
菜鸡求毕业:这么快啊?感觉我们这边面的时候都特别敷衍,感觉不缺人的样子
投递比亚迪等公司10个岗位
点赞 评论 收藏
分享
评论
5
13
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务