App 启动时间优化详解
创始人
2024-09-26 09:22:24
0

App 启动模式分以下 三 类 :

  1. 冷启动

  2. 热启动

  3. 温热启动

1.冷启动

APP从零开始,APP启动之前,系统没有为此 APP创建独立进程。比如:设备启动后,APP第一次Launch或者APPKill掉后的重启。这种类型的启动优化存在很大挑战,因为Android系统或应用还有其他更多的后台进程在运行。

启动流程大致如下:

点击Launcher 上的 icon开加载app -->立即显示白屏或黑屏等 --> Application onCreate --> Activity Init----> Activity onCreate —> 初始化数据,填充显示View —> Activity onResume等,详细请看下图:

App启动进程优化

2. 热启动

APP的热启动要比 冷启动简单得多,内存开销也更低。APP热启动时候,所有的系统都是把你的Activity带到前台。如果APP的所有Activity仍驻留在内存中,则APP可以避免重复对象初始化、布局绘制和显示等工作。

如果APP 在内存中被清理掉,比如调用ontrimmemory(),当响应热启动时,这些对象将重新被创建。

热启动与冷启动相同的屏幕行为:

系统进程会显示一个空白屏幕,直到应用程序完成渲染后将此空白屏幕移除掉,此屏幕创建会在加载APP时候立即创建,如需查看创建流程,需要查看PhoneWindosMangerAddWindows方法。

3. 温热启动

处于冷启动与热启动之间,既包含一些冷启动的操作,又含有部分热启动的功能。例如以下两种状态:

1. 用户退出APP后重新Launch

此时此APP的进程可能会存在,然鹅,Activity 必须重新创建并调用onCreate方法

2. APP 被缓存中清理掉时。

此时用户重新Launch APP时,此APP的进程和Activity都需要重新创建,但是任务栈中会保存部分APP实例数据(bundle类型)传递个Activity onCreate方法

二、App 启动时间测量与分析

===============

为了更加准确的测量 APP 启动的耗时,请务必使用User版本进行验证。UserDebug 或者eng版本会开很多调试开关影响测试的正常结果。

如何获取APP启动时间,请看以下测量方法

ps:以下测试方法请在Android 4.4(含) 以上的版本进行

1.通过 adb 命令测量APP 冷启动时间

使用adb 命令直接启动APP进而测量APP启动耗时 的方法如下:

 adb shell am start -W [packageName]/[packageName.MainActivity]`    

 adb [-d|-e|-s ] shell am start -S -W [packageName]/[packageName.MainActivity] -c android.intent.category.LAUNCHER -a android.intent.action.MAIN    

如要测量的app没有源码,比如:QQ,请用以下命令获取, 当前获取焦点的Activity ,方法信息如下:

 adb shell dumpsys activity |findstr "mFocused"    

APP 启动时间详情 请看以下图片中椭圆 红框区域内容。

测量APP冷启动时间的方法

2.通过 adb logcat 查看APP 启动时间

Log中,主要是 通过分析 logcatAPP在 ActivityManager: Displayed的时间值 ,此时间值包含以下时间综合信息:

  1. Launch 进程

  2. 初始化对象

  3. 创建并初始化Activity

  4. 填充布局

  5. 第一次绘制app 内容

比如下图:ProgramAndroid程序启动时间700ms

adb logcat 查看APP 启动时间

3. 在代码中测量app启动性能的方法如下:

Activity代码用调用 reportFullyDrawn(); 方法,将绘制完成后信息反馈到Log上,此方法跟logcat中查看的时间相似。

比如自己运行ProgramAndrod APP的启动时间信息如下

 11-24 11:47:00.363   982  1191 I ActivityManager:   Fully drawn com.programandroid/.MainActivity: +998ms    

reportFullyDrawn()方法告知系统app Launch 成功时间

4. 使用Systrace 工具分析app启动时间

当然如果感觉上述方法比较麻烦,可以使用Systrace工具进行分析,工具分析情况,下次贴出。

在代码中测量app启动性能的方法,使用工具分析

三、应用中冷启动避免白屏、黑屏方案

=================

手机中 APP首次启动(未在最近任务列表中,或已经运行过,但在最近任务列表中已清除启动记录)称为冷启动,此时打开APP时候回闪白屏或黑屏,特别是当系统主题为黑色或白色时候比较明显。

在应用端规避掉打开APP闪白屏、黑屏问题,主要是从android:windowIsTranslucent上让白屏变透明,进而不让用户看到白屏、黑屏现象。

但是,此解决方案会导致在Launcher中点击APP`` icon 是会有轻微的卡顿现象,此现象会让用户误认为手机卡,APP启动慢,从而将打开APP闪白屏的黑锅甩给手机制造厂商。

1. 透明样式Theme 解决方案如下:

1. 自定义透明样式

res/values/style.xml中自定义样式

自定义透明样式

2. App 启动入口Activity 中使用自定义样式

App 启动入口Activity 中使用自定义样式

注意: windowDisablePreview =false 属性可以不让白屏显示,失去中间白屏过度,会给用户带来不是太好的体验,比如点击后需要稍微等一下才会打开APP,会让用户错误的怀疑自己是否成功点击过icon。Google 很不推荐此种做法。

2. 使用app logo等图片样式使用方法如下

1. 自定义Theme

自定义Theme

2. 为 要启动的Activity设置自定义样式

为 要启动的Activity设置自定义样式

3. 同样也可以在Java类中的 设置样式

Java类中的 设置样式

此方法也是Google推荐的方法,建议大家可以用自定义Theme替换掉系统中的白屏,当然也可以搞成什么广告页面等等。

四、 Framework 层解决冷启动白屏、黑屏方案

==========================

打开APP闪黑屏、白屏的根本原因在于PhonewindowManger中的addStartingWindow 方法。

addStartingWindow方法

自定义填充Window 背景

Framwork上 这样修改后,会将白色屏幕替换成我们客制化的颜色,此修改会影响到所有APP的启动。

五、App 启动优化原理

============

L版本之后,手机上所有APP都要经过dex2oat处理之后,才能运行.

dex2oat 是将原来的dex文件预先的翻译处理,从而加快APP运行的时间,但由于某些APP比较复杂,优化的时间可能会比较长,进而给用户感觉运行卡顿。

dex2oat 优化是以dex文件中的method为单位,dex2oat 会根据需要优化一定量的method,也就是说并不是优化的method都会被翻译成oat模式。

实战系列

话不多说,Android实战系列集合都已经系统分类好,由于文章篇幅问题没法过多展示


===

L版本之后,手机上所有APP都要经过dex2oat处理之后,才能运行.

dex2oat 是将原来的dex文件预先的翻译处理,从而加快APP运行的时间,但由于某些APP比较复杂,优化的时间可能会比较长,进而给用户感觉运行卡顿。

dex2oat 优化是以dex文件中的method为单位,dex2oat 会根据需要优化一定量的method,也就是说并不是优化的method都会被翻译成oat模式。

实战系列

话不多说,Android实战系列集合都已经系统分类好,由于文章篇幅问题没法过多展示

[外链图片转存中…(img-rsaRWABX-1719804535628)]
[外链图片转存中…(img-dAUTRyfs-1719804535628)]

相关内容

热门资讯

一分钟内幕!科乐吉林麻将系统发... 一分钟内幕!科乐吉林麻将系统发牌规律,福建大玩家确实真的是有挂,技巧教程(有挂ai代打);所有人都在...
一分钟揭秘!微扑克辅助软件(透... 一分钟揭秘!微扑克辅助软件(透视辅助)确实是有挂(2024已更新)(哔哩哔哩);1、用户打开应用后不...
五分钟发现!广东雀神麻雀怎么赢... 五分钟发现!广东雀神麻雀怎么赢,朋朋棋牌都是是真的有挂,高科技教程(有挂方法)1、广东雀神麻雀怎么赢...
每日必看!人皇大厅吗(透明挂)... 每日必看!人皇大厅吗(透明挂)好像存在有挂(2026已更新)(哔哩哔哩);人皇大厅吗辅助器中分为三种...
重大科普!新华棋牌有挂吗(透视... 重大科普!新华棋牌有挂吗(透视)一直是有挂(2021已更新)(哔哩哔哩)1、完成新华棋牌有挂吗的残局...
二分钟内幕!微信小程序途游辅助... 二分钟内幕!微信小程序途游辅助器,掌中乐游戏中心其实存在有挂,微扑克教程(有挂规律)二分钟内幕!微信...
科技揭秘!jj斗地主系统控牌吗... 科技揭秘!jj斗地主系统控牌吗(透视)本来真的是有挂(2025已更新)(哔哩哔哩)1、科技揭秘!jj...
1分钟普及!哈灵麻将攻略小,微... 1分钟普及!哈灵麻将攻略小,微信小程序十三张好像存在有挂,规律教程(有挂技巧)哈灵麻将攻略小是一种具...
9分钟教程!科乐麻将有挂吗,传... 9分钟教程!科乐麻将有挂吗,传送屋高防版辅助(总是存在有挂)1、完成传送屋高防版辅助透视辅助安装,帮...
每日必看教程!兴动游戏辅助器下... 每日必看教程!兴动游戏辅助器下载(辅助)真是真的有挂(2025已更新)(哔哩哔哩)1、打开软件启动之...