安卓app启动流程分析

从技术层面讲,如果要启动一个安卓app,首先需要触发启动过程,然后再分配系统资源,最后才启动要打开的app组件。本文我来对安卓系统app启动流程进行分析,对于应用开发、系统定制以及性能优化人员来说,熟悉应用启动流程会使你们在今后的工作中更加得心应手,做到知其然,知其所以然。在对安卓app启动流程分析过程中,必定是需要用到监测工具的,我推荐大家使用友盟+U-APM这款app性能监测工具,它的后台对于异常的查询速度是非常快的,使用起来非常方便。

启动App流程

用户点击Home上的一个App图标, 启动一个应用时:

安卓app启动流程分析_第1张图片

Click事件会调用startActivity(Intent), 会通过Binder IPC机制, 最终调用到ActivityManagerService。 该Service会执行如下操作:

●第一步通过PackageManager的resolveIntent()收集这个intent对象的指向信息。

●指向信息被存储在一个intent对象中。

●下面重要的一步是通过grantUriPermissionLocked()方法来验证用户是否有足够的权限去调用该intent对象指向的Activity。

●如果有权限, ActivityManagerService会检查并在新的task中启动目标activity。

●现在, 是时候检查这个进程的ProcessRecord是否存在了。

如果ProcessRecord是null, ActivityManagerService会创建新的进程来实例化目标activity。

一、 创建进程

ActivityManagerService调用startProcessLocked()方法来创建新的进程, 该方法会通过前面讲到的socket通道传递参数给Zygote进程。 Zygote孵化自身, 并调用ZygoteInit。main()方法来实例化ActivityThread对象并最终返回新进程的pid。

ActivityThread随后依次调用Looper。prepareLoop()和Looper。loop()来开启消息循环。

流程图如下:

安卓app启动流程分析_第2张图片

二、绑定Application

接下来要做的就是将进程和指定的Application绑定起来。这个是通过上节的ActivityThread对象中调用bindApplication()方法完成的。该方法发送一个BIND_APPLICATION的消息到消息队列中, 最终通过handleBindApplication()方法处理该消息。然后调用makeApplication()方法来加载App的classes到内存中。

流程如下:

安卓app启动流程分析_第3张图片

三、启动Activity

经过前两个步骤之后, 系统已经拥有了该application的进程。 后面的调用顺序就是普通的从一个已经存在的进程中启动一个新进程的activity了。

实际调用方法是realStartActivity(), 它会调用application线程对象中的sheduleLaunchActivity()发送一个LAUNCH_ACTIVITY消息到消息队列中, 通过 handleLaunchActivity()来处理该消息。

假设点击的是一个视频浏览的App, 其流程如下:

安卓app启动流程分析_第4张图片

以上就是安卓app的启动流程,希望此文章可以对各位有所帮助。app启动过程复杂,开发的时候稍不注意就会在代码里添加一些耗时操作,造成性能问题,所以开发人员要经常检测app的性能,找出耗时原因,可以使用友盟+U-APM这款工具。

友盟+U-APM通过轻量级的集成接入即可拥有实时、可靠、全面的应用崩溃、ANR、自定义异常等捕获能力,及卡顿、启动分析等性能能力,支持多场景、多通道智能告警监控,帮助开发者高效还原异常、卡顿用户的访问路径和业务现场,缩短故障排查时间。还提供云真机测试能力,助力开发者从研发测试质量验收到线上问题复现排查,保障应用品质,提升测试效率。在云真机测试期间自动采集崩溃信息,提供详尽的崩溃报告协助筛查,真正实现监控测试全流程深度打通。

你可能感兴趣的:(架构,智能,APP,java,大数据)