Android APP启动方式、启动流程及启动优化分析

本文章向大家介绍Android app应用启动的一些相关知识,包括app启动方式、app启动流程和app启动优化等知识!

app应用启动方式

1、冷启动

当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动。冷启动因为系统会重新创建一个新的进程分配给它,所以会先创建和初始化Application类,再创建和初始化MainActivity类(包括一系列的测量、布局、绘制),最后显示在界面上。

2、热启动

当启动应用时,后台已有该应用的进程(例:按back键、home键,应用虽然会退出,但是该应用的进程是依然会保留在后台,可进入任务列表查看),所以在已有进程的情况下,这种启动会从已有的进程中来启动应用,这个方式叫热启动。热启动因为会从已有的进程中来启动,所以热启动就不会走Application这步了,而是直接走MainActivity(包括一系列的测量、布局、绘制),所以热启动的过程只需要创建和初始化一个MainActivity就行了,而不必创建和初始化Application,因为一个应用从新进程的创建到进程的销毁,Application只会初始化一次。

app应用启动流程

为方便排版,去掉部分方法中的参数:

从Activity类的startActivity()方法开始,这个方法会调用Activity类中的public void startActivityForResult()方法 startActivityForResult()方法会调用Instrumentation类中的public ActivityResult execStartActivity()方法,这个方法加上了{@hide}对外是不可见的 execStartActivity()方法中有如下的调用语句ActivityManagerNative.getDefault().startActivity(),它调用了IActivityManager类中的startActivity()方法 但IActivityManager其实只是一个接口,这里实际调用的是public abstract classActivityManagerNative这个类(它继承自Binder类)的内部类ActivityManagerProxy中的public int startActivity()方法,ActivityManagerProxy实现了IActivityManager接口 ActivityManagerProxy类的public int startActivity()方法中有如下代码,mRemote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0),这里mRemote是一个IBinder对象,这个对象在ActivityManagerProxy构造方法中实例化,实际由外部类ActivityManagerNative的static public IActivityManager asInterface(IBinder obj)方法实例化,asInterface(IBinder obj)方法中参数实际在ActivityManagerNative类的static public IActivityManager getDefault()方法中,由ServiceManager.getService("activity")实例化 mRemote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0)这条语句通过IBinder的transact()方法,将方法中的参数跨进程传递给ActivityManagerService类 以上除ActivityManagerService类之外的类都位于android.app包下 下面进入ActivityManagerService类,它位于源码的/frameworks/base/services/java/com/android/server/am/路径下,包名是com.android.server.am ActivityManagerService继承了ActivityManagerNative类,从ActivityManagerProxy类的mRemote.transact()传递过来的参数,被传递到ActivityManagerService类的onTransact()方法来处理 ActivityManagerService类的onTransact()方法实际上通过super.onTransact(code, data, reply, flags)这条语句又调用了ActivityManagerNative类中的onTransact()方法 super.onTransact(code, data, reply, flags)这条语句会调用到ActivityManagerService类的public final int startActivity()方法 ActivityManagerService类的startActivity()方法会调用到ActivityStack类的startActivityMayWait()方法 ActivityStack类位于com.android.server.am包下,startActivityMayWait()方法final int startActivityLocked()方法 startActivityLocked()方法最后会调用final boolean resumeTopActivityLocked()方法 resumeTopActivityLocked()方法会调用private final void startSpecificActivityLocked()方法 startSpecificActivityLocked()方法会调用startProcessLocked()方法 startProcessLocked()方法会调用android.os.Process类的public static final int start()方法 int pid = Process.start("android.app.ActivityThread", mSimpleProcessManagement ? app.processName : null, uid, uid, gids, debugFlags, null) 下面进入android.os包下的Process类中 start()方法会调用private static int startViaZygote()方法 startViaZygote()方法会调用private static int zygoteSendArgsAndGetPid()方法 zygoteSendArgsAndGetPid()方法会使用socket与zygote进程通信 sZygoteSocket = new LocalSocket(); sZygoteSocket.connect(new LocalSocketAddress(ZYGOTE_SOCKET, LocalSocketAddress.Namespace.RESERVED)); 下面进入com.android.internal.os包下的ZygoteInit类 ZygoteInit类里面含有LocalSocketServer的实例,会与上面提到的zygoteSendArgsAndGetPid()方法使用socket进行通信 实际逻辑在ZygoteConnection这个类中的boolean runOnce()方法中 runOnce()方法会调用dalvik.system.Zygote这个类中的静态方法forkAndSpecialize() 下面进入dalvik.system包中的Zygote类 forkAndSpecialize()最终调用了native的方法native public static int forkAndSpecialize() 在c代码中开启应用程序的进程 应用的进程从android.app包下的ActivityThread类开始运行 ActivityThread类中含有main()方法 ActivityThread.main()是应用的启动入口,在应用程序启动的时候就会调用

app的启动优化:

基于上面的启动流程我们尽量做到如下几点

Application的创建过程中尽量少的进行耗时操作 如果用到SharePreference,尽量在异步线程中操作 减少布局的层次,并且生命周期回调的方法中尽量减少耗时的操作

通过此文,希望能帮助到大家,谢谢大家对本站的支持!

时间: 2024-12-20 19:19:36

Android APP启动方式、启动流程及启动优化分析的相关文章

如何把一个软件的的启动方式改为usbkey启动?

问题描述 如何把一个软件的的启动方式改为usbkey启动? usbkey启动代替手动输入密码,是不是要先写一个程序读取usbkey中的秘钥写入到磁盘,然后在修改软件的启动方式到磁盘中找秘钥?本人小白,求大神指点,比如用到什么技术,参考什么资料或者案例···跪谢!!! 解决方案 去看看JAVA加密与解密的艺术.USBKEY启动里面的安全算法用的是硬实现,如果没有用USBKEY的话,加密算法就是软实现.需要提供和USBKEY里面用到的加密算法相同的软实现的provider:这部分内容非常多,建议楼主

如何确定windows启动方式是uefi还是legacy bios

  如何确定windows启动类型是uefi还是legacy bios?安装系统过程中,经常需要判断电脑上的windows启动方式是什么?是uefi还是legacy bios?下文小乐哥教大家如何确定windows启动方式是uefi还是legacy bios的. 适用于Win10.Win8.1.Win8.Win7.Vista. 最装X方法: 在安装操作系统时,安装程序会收集一些必备信息,电脑的启动方式就是其中之一.在你的电脑C:WindowsPanther文件夹中找到setupact.log文件

解析WinPE的两种启动方式

  winPE一般有两种方式,包括普通启动方式和RAM启动方式. 一.RAM启动方式 这种就是把WinPE文件打包成一个映像文件,然后把这些文件导入内存里,从内存里面对其进行启动,速度很快,一般我们会把它们打包成ISO或IMG格式的镜象文件,最后再来个压缩.这种凡事的镜像可以很好的控制, 镜象的体积就可以很好的控制了,这也是老毛桃WinPE这么小的原因了,但是它导入内存时会解压,因此这种方式启动对内存容量的要求还是很大的,有些WinPE至少要256的内存才可以启动. 优点:启动速度快,几乎是不受

如何判断windows启动方式是uefi还是legacy bios

  如何确定windows启动类型是uefi还是legacy bios?安装系统过程中,经常需要判断电脑上的windows启动方式是什么?是uefi还是legacy bios?下文小乐哥教大家如何确定windows启动方式是uefi还是legacy bios的. 适用于Win10.Win8.1.Win8.Win7.Vista. 最装X方法: 在安装操作系统时,安装程序会收集一些必备信息,电脑的启动方式就是其中之一.在你的电脑C:WindowsPanther文件夹中找到setupact.log文件

Windows启动方式UEFI/BIOS的判断方法

为了方便后来人查看,这里总结三个方法,适用于Win10.Win8.1.Win8.Win7.Vista系统. 最装X方法: 在安装操作系统时,安装程序会收集一些必备信息,电脑的启动方式就是其中之一.在你的电脑C:\Windows\Panther文件夹中找到setupact.log文件,用记事本打开,然后搜索Detected Boot Environment,在这里你就可以看到系统启动方式了. 当朋友看见你从这个几十MB的log文档中找到这一行文字时,那可真是太装X了. 最智慧方法: 如果你知晓GP

ART世界探险(20) - Android N上的编译流程

ART世界探险(20) - Android N上的编译流程 就在我们分析Android M版本的ART还只走出了一小段路的时候,Android N的新ART就问世了. Android N上的ART还是有不小的改进的.不过做为一个关注细节的系列文章,我们还是从Compile的过程说起. 流程概述 在安装的时候,默认情况下,Android N只做interpret-only的编译,如下命令行所示: /system/bin/dex2oat --zip-fd=7 --zip-location=base.

Android app 别用中文名

/************************************************************************* * Android app 别用中文名 * 说明: * 本来想分析一下这份源代码,结果发现因为项目名中有中文不能自动生成R * 文件,于是不想分析了. * * 2016-5-12 深圳 南山平山村 曾剑锋 ************************************************************************

Android APP启动方式、启动流程及启动优化分析_Android

本文章向大家介绍Android app应用启动的一些相关知识,包括app启动方式.app启动流程和app启动优化等知识!  app应用启动方式 1.冷启动  当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动.冷启动因为系统会重新创建一个新的进程分配给它,所以会先创建和初始化Application类,再创建和初始化MainActivity类(包括一系列的测量.布局.绘制),最后显示在界面上. 2.热启动 当启动应用时,后台已有该应用的进程(例:

Android App性能评测分析-启动时间篇

1.前言 随着项目版本的迭代,App的性能问题会逐渐暴露出来,而好的用户体验与性能表现紧密相关,性能问题从应用的启动优化开始,下面会根据实际app性能测试案例,进行app性能评测之启动时间的分析和总结. 2.App启动方式了解 通常来说, 一个App启动也会分如下三中不同的状态: 冷启动 当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动,也就是先实例化Application 冷启动的流程即为App启动流程的全过程, 需要创建App进程, 加载