安卓App启动流程详解

20 篇文章 0 订阅
19 篇文章 0 订阅

大家是否都有这样的疑问,从点击桌面图标到app启动,背后到底发生了什么?系统做了哪些工作?牵涉几个进程,它们之间如何通信?我想大家都十分好奇,下面我就来解开大家的疑惑!

首先来了解一些相关概念:

1、init

init是Linux的初始进程,zygote是其后的第一个进程。

2、Zygote

首先,来了解一下进程Zygote , 字面意思受精卵,说到受精卵,就想到分裂孵化。比如《道德经》里有句话是这样说的道生一,一生二,二生三,三生万物。我们把Zygote视为一,至于Zygote的父进程“道”,属于Android 系统架构Native层中的Init进程,不属于该文章的介绍范围,暂且不表。

zygote是所有Android进程的父进程;下面开始分裂,首先要知道在Android系统架构中Framework层,所有的java进程(C++管不着)都起源于Zygote。

3、system_server

第一次分裂出的进程叫做system_server,(注意Zygote进程一直还在啊,并不是分裂了就没有了,这点不同受精卵真实过程),看着名字就知道是系统服务相关的,没错,我们常用的ActivityManagerService(以下简称AMS)、WindowManagerService和PackageManagerService等等各种服务,都是system_server这个进程启动的。

4、Luncher

而Luncher进程就是桌面App,就是我们看到的手机开机完成后桌面,它本质上是一个App。其他应用比如浏览器、相机、邮件、电话、微信、淘宝等等,都是Zygote孵化而来。为什么要孵化,因为从头创建消耗太大,从0到1难呐,万事开头难,这样孵化效率较高。

了解完基础概念之后,接下来我们看下详细的启动流程:

详细启动流程

1、当你点击了App的桌面图标时,Luncher进程收到你的操作。启动开始。

2、Luncher进程启动远程进程,通过Binder发消息给system_server。

3、system_server 中AMS经过一系列复杂操作,最终调用 Process.start(android.app.ActivityThread) , 然后通过socket通知Zygote进程。

4、Zygote进程收到通知,fork出app进程,并执行ActivityThread.main()方法。

5、ActivityThread.main()主要干了两件事(由于字数有限,暂不展开阐述了):

①一准备主线程Looper , 这个大家应该很熟悉了,主线程靠它撑着呢。

②二是通过ActivityThread.attch()将主线程ApplicationThread绑定到AMS上。

6、AMS绑定后,经过一系列复杂调用,执行到realStartActivityLocked()方法。

7、上一步方法会调用到ApplicationThread的scheduleLaunchActivity(),而该方法又调用ActicityThread的handleLaunchActivity(),创建application对象,并调用onCreate()方法,获取启动Activity并调用onCreate()方法。

8、启动完成。

上面我们讲了app的启动流程,其实有很多开发者反馈app启动速度慢、耗时久,这两大问题甚是令人头大,有时看似解决了这两个问题,过段时间之后,这两种情况又出现了;其实,还是因为我们没有找到根本原因,没有分析出问题所在。

此时,工具就派上用场了,比如“友盟”U-APM,它的启动分析功能可以帮助开发人员收集启动耗时信息,并找到造成启动耗时的问题。此外,U-APM通过轻量级的集成接入即可拥有实时、可靠、全面的应用崩溃、ANR、自定义异常等捕获能力,及卡顿、内存分析、网络分析等性能监测能力,支持多场景、多通道智能告警监测,帮助开发者高效还原异常、卡顿用户的访问路径和业务现场,缩短故障排查时间。

总之,友盟对比同类竞品来说有明显优势,强烈推荐Android开发人员使用友盟,深入了解应用的性能和稳定性,集成简单,服务有保障,帮助您高效提升应用质量,让你的app变得更加丝滑!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值