Android性能之冷启动优化详析

1.前言

APP冷启动比较慢,点击桌面图片需要用户等待很久,体验较差。

2.APP启动方式

冷启动(Cold start)

场景:冷启动是指APP在手机启动后第一次运行,或者APP进程被kill掉后在再次启动。

可见冷启动的必要条件是该APP进程不存在,这就意味着系统需要创建进程,APP需要初始化。在这三种启动方式中,冷启动耗时最长,对于冷启动的优化也是最具挑战的。因此本文重点谈论的是对冷启动相关的优化。

生命周期:Process.start->Application创建->attachBaseContext->onCreate->onStart->onResume->Activity生命周期
启动速度:在几种启动类型中最慢,也是我们优化启动速度最大的拦路虎

温启动(Warm start)

场景:App进程存在,当时Activity可能因为内存不足被回收。这时候启动App不需要重新创建进程,但是Activity的onCrate还是需要重新执行的。场景类似打开淘宝逛了一圈然后切到微信去聊天去了,过了半小时再次回到淘宝。这时候淘宝的进程存在,但是Activity可能被回收,这时候只需要重新加载Activity即可。

生命周期:onCreate->onStart->onResume->Activity生命周期

启动速度:较快

热启动(Hot start)

场景:App进程存在,并且Activity对象仍然存在内存中没有被回收。可以重复避免对象初始化,布局解析绘制。

场景就类似你打开微信聊了一会天这时候出去看了下日历 在打开微信 微信这时候启动就属于热启动。

生命周期:onResume->Activity生命周期

启动速度:快

3.如何统计Android App启动时间(使用命令行)

adb shell am start -W [packageName]/[packageName.***Activity]

例如:

adb shell am start -W com.dateyou.test/com.datayou.test.ui.home.PageLoadingActivity

当然为了结果更加准确,可以执行多次取平均值。

adb shell am start -S -R 10 -W com.dateyou.test/com.datayou.test.ui.home.PageLoadingActivity

其中-S表示每次启动前先强行停止,-R表示重复测试次数。每一次的输出如下所示信息。

其中TotalTime代表当前Activity启动时间

4.冷启动流程

冷启动指的是应用程序从进程在系统不存在,到系统创建应用运行进程空间的过程。冷启动通常会发生在一下两种情况:

1)设备启动以来首次启动应用程序

2)系统杀死应用程序之后再次启动应用程序

在冷启动的最开始,系统需要负责做三件事:

1)加载以及启动app

2)app启动之后立刻显示一个空白的预览窗口

3)创建app进程

一旦系统完成创建app进程后,app进程将要接着负责完成下面的工作:

1)创建Application对象

2)创建并且启动主线程ActivityThread

3)创建启动第一个Activity

4)Inflating views

5)布局屏幕

6)执行第一次绘制

一旦app进程完完成了第一次绘制工作,系统进程就会用main activity替换前面显示的预览窗口,这个时候,用户就可以正式开始与app进行交互了。

从冷启动的流程看,我们无法干预app进程创建等系统操作,我们能够干预的有:

1)预览窗口

2)Application生命周期回调

3)Activity生命周期回调

5.冷启动优化

1)预览窗口

为什么启动时会出现短暂黑屏或白屏的现象?当用户点击你的app那一刻到系统调用Activity.onCreate()之间的这个时间段内,WindowManager会先加载app主题样式中的windowBackground做为app的预览元素,然后再真正去加载activity的layout布局。
很显然,如果你的application或activity启动的过程太慢,导致系统的BackgroundWindow没有及时被替换,就会出现启动时白屏或黑屏的情况(取决于你的主题是Dark还是Light)。

解决办法:在style中自定义一个主题,在其中放一张背景图片或者广告页,让用户先看默认图。

2)Application OnCrate()优化

1.耗时操作子线程中进行

2.非必要初始化懒加载

3)Activity onCreate()优化

1.耗时操作子线程中进行

2.布局层次减少

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。

(0)

相关推荐

  • 详解Android冷启动实现APP秒开的方法

    一.前言 在阅读这篇文章之前,首先需要理解几个东西: 1.什么是Android的冷启动时间? 冷启动时间是指用户从手机桌面点击APP的那一刻起到启动页面的Activity调用onCreate()方法之间的这个时间段. 2.在冷启动的时间段内发生了什么? 首先我们要知道当打开一个Activity的时候发生了什么,在一个Activity打开时,如果该Activity所属的Application还没有启动,那么系统会为这个Activity创建一个进程(每创建一个进程都会调用一次Application,

  • 浅谈android性能优化之启动过程(冷启动和热启动)

    本文介绍了浅谈android性能优化之启动过程(冷启动和热启动) ,分享给大家,具体如下: 一.应用的启动方式 通常来说,启动方式分为两种:冷启动和热启动. 1.冷启动:当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动. 2.热启动:当启动应用时,后台已有该应用的进程(例:按back键.home键,应用虽然会退出,但是该应用的进程是依然会保留在后台,可进入任务列表查看),所以在已有进程的情况下,这种启动会从已有的进程中来启动应用,这个方式叫热

  • 解决Android应用冷启动时出现的白屏问题的方法

    Android 应用冷启动时,需要从Application开始启动,加载时间就会比较长,容易出现白色或黑色闪屏,观察一下手机上一些 其他APP 比如 微信.京东等就不存在这个现象. 原因分析 分析一下原因,其实是跟闪屏Activity的主题有关,比如使用了Theme.AppCompat.Light.DarkActionBar主题的话,其中指定了windowBackground,所以背景就是白色的了. 复制代码 代码如下: <itemname="android:windowBackgroun

  • Android冷启动实现app秒开的实现代码

    本文介绍了Android冷启动实现app秒开的实现代码,分享给大家,具体如下: AndroidManifest里对应activity添加属性android:theme="@style/AppSplash" <activity android:name="com.senyint.edu.college.stu.view.activity.SplashActivity" android:screenOrientation="portrait"

  • Android性能之冷启动优化详析

    1.前言 APP冷启动比较慢,点击桌面图片需要用户等待很久,体验较差. 2.APP启动方式 冷启动(Cold start) 场景:冷启动是指APP在手机启动后第一次运行,或者APP进程被kill掉后在再次启动. 可见冷启动的必要条件是该APP进程不存在,这就意味着系统需要创建进程,APP需要初始化.在这三种启动方式中,冷启动耗时最长,对于冷启动的优化也是最具挑战的.因此本文重点谈论的是对冷启动相关的优化. 生命周期:Process.start->Application创建->attachBas

  • JS 加载性能Tree Shaking优化详解

    目录 正文 什么是 Tree Shaking 寻找 Tree Shaking 的机会 防止 Babel 将 ES6 模块转换为 CommonJS 模块 留意 side effects 只导入你需要的 更复杂的情况 总结 正文 随着 web 应用复杂性增加,JS 代码文件的大小也在不断的攀升,截住 2021年9月,在 httparchive 上有统计显示——在移动设备上 JS 传输大小大约为 447 KB,桌面端 JS 传输大小大约为 495 KB,注意这仅仅是在网络中传输的 JS 文件大小,JS

  • MySQL中or、in、union与索引优化详析

    本文缘起自<一分钟了解索引技巧>的作业题. 假设订单业务表结构为: order(oid, date, uid, status, money, time, -) 其中: oid,订单ID,主键 date,下单日期,有普通索引,管理后台经常按照date查询 uid,用户ID,有普通索引,用户查询自己订单 status,订单状态,有普通索引,管理后台经常按照status查询 money/time,订单金额/时间,被查询字段,无索引 - 假设订单有三种状态:0已下单,1已支付,2已完成 业务需求,查询

  • Android性能优化之弱网优化详解

    目录 弱网优化 1.Serializable原理 1.1 分析过程 1.2 Serializable接口 1.3 ObjectOutputStream 1.4 序列化后二进制文件的一点解读 1.5 常见的集合类的序列化问题 1.5.1 HashMap 1.5.2 ArrayList 2.Parcelable 2.1 Parcel的简介 2.2 Parcelable的三大过程介绍(序列化.反序列化.描述) 2.2.1 描述 2.2.2 序列化 2.2.3 反序列化 2.3 Parcelable的实

  • 详解Android性能优化之启动优化

    1.为什么要进行启动优化 网上流行一种说法,就是8秒定律,意思是说,如果用户在打开一个页面,在8秒的时间内还没有打开,那么用户大概的会放弃掉,意味着一个用户的流失.从这里就可以看出,启动优化的重要性了. 2.启动的分类 2.1 冷启动 先来看看冷启动的流程图 从图中可以看出,APP启动的过程是:ActivityManagerProxy 通过IPC来调用AMS(ActivityManagerService),AMS通过IPC启动一个APP进程,ApplicationThread通过反射来创建App

  • 关于Android冷启动耗时优化详解

    目录 1,背景 2,调研 2.1,Android中启动的方式 2.2,冷启动流程 2.3,启动时间 3,方案 1,冷启动白屏现象 2,启动时间优化 总结 1,背景 最近开发了一个新的App,前期工期紧,做的比较粗放,上线以后发现App启动时间比较长,达到3秒, 启动有白屏,体验也不好,这个只能后期优化了,最好是前期开发就考虑的 2,调研 2.1,Android中启动的方式 1,冷启动:如果App启动时,后台没有该应用进程,那么系统会重新创建一个进程分配给该应用,这种启动方式就是冷启动 2,热启动

  • Android性能优化大图治理示例详解

    目录 引言 1 自定义大图View 1.1 准备工作 1.2 图片宽高适配 1.3 BitmapRegionDecoder 2 大图View的手势事件处理 2.1 GestureDetector 2.2 双击放大效果处理 2.3 手指放大效果处理 引言 在实际的Android项目开发中,图片是必不可少的元素,几乎所有的界面都是由图片构成的:像列表页.查看大图页等,都是需要展示图片,而且这两者是有共同点的,列表展示的Item数量多,如果全部加载进来势必会造成OOM,因此列表页通常采用分页加载,加上

  • Android性能优化之RecyclerView分页加载组件功能详解

    目录 引言 1 分页加载组件 1.1 功能定制 1.2 手写分页列表 1.3 生命周期管理 2 github 引言 在Android应用中,列表有着举足轻重的地位,几乎所有的应用都有列表的身影,但是对于列表的交互体验一直是一个大问题.在性能比较好的设备上,列表滑动几乎看不出任何卡顿,但是放在低端机上,卡顿会比较明显,而且列表中经常会伴随图片的加载,卡顿会更加严重,因此本章从手写分页加载组件入手,并对列表卡顿做出对应的优化 1 分页加载组件 为什么要分页加载,通常列表数据存储在服务端会超过100条

  • Android性能优化之plt hook与native线程监控详解

    目录 背景 native 线程创建 PLT PLT Hook xhook bhook plt hook总结 背景 我们在android超级优化-线程监控与线程统一可以知道,我们能够通过asm插桩的方式,进行了线程的监控与线程的统一,通过一系列的黑科技,我们能够将项目中的线程控制在一个非常可观的水平,但是这个只局限在java层线程的控制,如果我们项目中存在着native库,或者存在着很多其他so库,那么native层的线程我们就没办法通过ASM或者其他字节码手段去监控了,但是并不是就没有办法,还有

随机推荐