【Android】之【App启动】

一、启动方式

Android 应用的启动方式大概分为热启动、冷启动、温启动三种,关于冷启动、热启动、温启动三者启动方式对比可以参考下面的流程图学习。

在这里插入图片描述

1.1 冷启动

冷启动具有耗时最多,衡量标准的特征,冷启动常见的场景是 APP 首次启动或 APP 被完全杀死,冷启动、热启动和温启动中冷启动 CPU 时间开销最大。启动流程简化如下。

1.2 温启动

当启动应用时,后台已有该应用的进程,但是 Activity 可能因为内存不足被回收。这样系统会从已有的进程中来启动这个 Activity,这个启动方式叫温启动。

温启动常见的场景有两种:第一种是首先用户按连续按返回退出了 app,最后重新启动 app,第二种是首先系统收回了 app 的内存,最后重新启动 app。

1.3 热启动

热启动只执行了冷启动的第二阶段,如果由于内存不足导致对象被回收,那么需要在热启动时重建对象,后面与冷启动时将界面显示到手机屏幕流程是一样的。

热启动时,系统将 activity 带回前台。如果应用程序的所有 activity 存在内存中,那么应用程序可以避免重复对象初始化、渲染、绘制操作。

热启动常见的场景如: 当我们按了 Home 键或其它情况 app 被切换到后台,再次启动 app 的过程。

二、启动流程

应用的启动流程一般指的是冷启动流程,即应用进程不存在的情况下,从点击桌面应用图标,到应用启动的过程。

在这里插入图片描述

在这里插入图片描述

首先

用户进行了一个点击操作,这个点击事件它会触发一个 IPC 的操作,之后便会执行到 Process 的 start 方法中,这个方法是用于进程创建的。

然后

便会执行到 ActivityThread 的 main 方法,这个方法可以看做是我们单个 App 进程的入口,相当于 Java 进程的 main 方法,在其中会执行消息循环的创建与主线程 Handler 的创建。

接着

创建完成之后,就会执行到 bindApplication 方法,在这里使用了反射去创建 Application以及调用了 Application 相关的生命周期。

最后

Application 结束之后,便会执行 Activity 的生命周期,在 Activity LifeCycle 结束之后,就会执行到 ViewRootImpl,这时才会进行真正的一个页面的绘制。

三、优化方向

我们说说优化方向,创建 Application、启动主线程、创建 MainActivity、加载布局、布置屏幕和界面首帧绘制完成后,我们就可以认为启动已经结束了。

综上所述,除了 Application atttachBaseContext、Appication onCreate 和 Activity LifeCycle,无需 Hook 源码,其余流程都是系统层面的。因此,我们能优化的空间只有 Application atttachBaseContext、Appication onCreate 和 Activity LifeCycle 三个流程。

App启动过程中我们优化的地方包括主进程启动流程和主界面启动流程,主进程启动就是Application的创建过程,主界面启动就是MainActivity的创建过程;

只需要分别对这两个部分进行优化即可
① Application中attachBaseContext最早被调用,随后是onCreate方法,尽量在这两个方法中不要有耗时操作;
② MainActivity中重点关注onCreate,onResume,onWindowFocusChange;

四、优化步骤

1、Application中加入异步线程

是把不必要提前做的操作放到异步线程中去做,也就是我们经常做的异步加载;

2、主页面加入异步线程和延迟加载功能

与Application的优化思路一样,也是封装onSyncLoad和onAsyncLoad方法对现有代码进行一个分类,但是这两个方法的调用时机要晚一点,是在主界面首屏绘制完成的时候调用。这个步骤也需要new一个Thead,属于额外的开销,不过这不影响我们整体性能;

3、态加载布局:主布局文件优化

把主界面中不需要第一次就用到的布局全部使用动态加载的方式来处理,使用ViewStub或者直接在使用时动态addView的方式;

4、主布局文件深度优化

如果做了上面这些优化还是会发现进入主界面还是有些慢,那么需要重点关注主布局文件了。主布局文件的复杂度直接影响到了Activity的加载速度,这个时候需要对主布局文件进行深度优化了;

Activity在加载布局的时候,会对整个布局文件进行解析,测量(measure),布局(layout)和绘制(draw),所以设计简单合理的布局尤为重要。
几个重要的优化如下:
a)减少布局层级
b)减少首次加载View的数量
c)减少过度绘制

5、页面功能的分模块化和懒加载

一个页面上有很多功能模块,最好每个功能模块都单独的分开,模块之间用接口进行数据沟通;
按需加载所需要的功能,不要打开一个页面都加载所有的功能;
加载完所需要的功能,如果是一次性加载不需要保持在内存中,尽快销毁掉,形成良好的习惯;

总结
优化是一条持续之路,通过优化我们可以了解到影响启动性能的因素有哪些,这样我们平时在编码的过程中就会多注意自己的代码性能;
其实优化还有很多办法,比如资源文件的优化、耗性能的写在c++层、合理的设计模式等等,我们做的就是规范我们的代码,让我们自己变的更强大更好。

五、参考

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Crazy程序猿2020

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值