app的启动流程都包括哪些步骤?
一、app的启动流程包括的步骤
1、创建进程
App发起进程:当从桌面启动应用,则发起进程便是Launcher所在进程;当从某App内启动远程进程,则发送进程便是该App所在进程。发起进程先通过binder发送消息给system_server进程。system_server进程:调用Process.start()方法,通过socket向zygote进程发送创建新进程的请求。zygote进程:在执行ZygoteInit.main()后便进入runSelectLoop()循环体内,当有客户端连接时便会执行ZygoteConnection.runOnce()方法,再经过层层调用后fork出新的应用进程。新进程:执行handleChildProc方法,最后调用ActivityThread.main()方法。2、绑定Application
上面创建进程后,执行ActivityThread.main()方法,随后调用attach()方法。将进程和指定的Application绑定起来。这个是通过ActivityThread对象中调用bindApplication()方法完成的,该方法发送一个BIND_APPLICATION的消息到消息队列中,最终通过handleBindApplication()方法处理该消息,然后调用makeApplication()方法来加载App的classes到内存中。
二、App启动方式
1、冷启动
当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动。冷启动因为系统会重新创建一个新的进程分配给它,所以会先创建和初始化Application类,再创建和初始化MainActivity类(包括一系列的测量、布局、绘制),最后显示在界面上。
2、热启动
当启动应用时,后台已有该应用的进程(例:按back键、home键,应用虽然会退出,但是该应用的进程是依然会保留在后台,可进入任务列表查看),所以在已有进程的情况下,这种启动会从已有的进程中来启动应用,这个方式叫热启动。热启动因为会从已有的进程中来启动,所以热启动就不会走Application这步了,而是直接走MainActivity(包括一系列的测量、布局、绘制),所以热启动的过程只需要创建和初始化一个MainActivity就行了,而不必创建和初始化Application,因为一个应用从新进程的创建到进程的销毁,Application只会初始化一次。
三、影响APP启动性能的因素
1、密集型应用初始化
如果您在代码中替换了Application对象,且在Application对象进行初始化的时候执行了密集的工作或者复杂的逻辑,那么您的启动性能就会受到影响。如果您的应用子类执行尚不需要完成的初始化,则应用可能会在启动过程中浪费更多的时间,并且有些初始化可能是完全不必要的。
如果Application 里面的初始化操作不结束的话,其他任意的程序操作都是无法进行的。因此,在 Application 初始化的地方做太多密集的工作或者复杂的逻辑是导致启动性能问题的元凶之一。
在做 Application的初始化工作时,很多组件是需要我们区别对待的,有些组件适合做延迟加载,有些则适合放到其他的地方做初始化操作,在此我们需要特别留意包含 Disk IO的操作,因为网络访问等严重耗时的任务,是会严重影响程序启动的。
2、密集型 Activity 初始化
我们在创建 Activity 时通常需要开展大量的高开销工作,用来提升 Activity 的创建速度,因为提升 Activity 的创建速度是优化 APP 启动速度的首要目标。从桌面点击 APP 图标启动应用开始,程序会显示一个启动窗口等待 Activity 的创建加载完毕再进行显示。在 Activity 的创建加载过程中,应用会执行很多的操作,例如设置页面的主题,初始化页面的布局,加载图片,获取网络数据,读写 Preference 等等。
上述操作的任何一个环节出现性能问题都可能导致画面不能及时显示,从而影响应用程序的启动速度。
延伸阅读1:密集型应用初始化导致app启动性能差的解决方法
优化这些问题的解决方案是给应用做延迟加载处理,可以在 Application 里面做延迟加载,也可以将一些初始化的操作延迟到组件真正被调用的时候再做加载。例如,不创建全局静态对象,而是转为单例模式,其中应用仅在名列前茅次访问对象时初始化它们。
相关推荐HOT
更多>>python正则表达式中的零宽断言
python正则表达式中的零宽断言1、概念有些元字符不匹配任何字符,只是简单的表示成功或失败,所以这些字符也叫零宽断言。2、符号举例(1)|或操作...详情>>
2023-11-14 11:35:03python方法的绑定和未绑定
python方法的绑定和未绑定1、说明未绑定对象的方法:无self参数的方法,通过定义类调用函数,返回未绑定self的方法。绑定对象的方法:带self参...详情>>
2023-11-14 09:53:02python海象运算符的使用
python海象运算符的使用1、在判断条件下允许操作。在一定程度上简化了代码,但降低了可读性。i=len((l:=[1,2,3]))#先对l进行赋值,在对i赋值whi...详情>>
2023-11-14 02:38:21pythonelif语句报错是什么原因
python的else和elif语句也可以叫做子句,因为它们不能独立使用,两者都是出现在if、for、while语句内部的。else子句可以增加一种选择;而elif子...详情>>
2023-11-13 21:46:35