其他分享
首页 > 其他分享> > 【安卓开发系列 -- APP】APP 性能优化 -- 启动优化

【安卓开发系列 -- APP】APP 性能优化 -- 启动优化

作者:互联网

【安卓开发系列 -- APP】APP 性能优化 -- 启动优化

【1】APP 启动优化的必要性

原因 : 用户希望应用能够及时响应并快速加载,启动时间长的 APP 不能满足该期望;
启动太慢的结果 : 体验效果差,用户流失,产品失败;

【2】启动流程以及分类

【2.1】开机启动流程

 注意,该流程图所示的启动过程为系统创建并启动应用的过程,一般不需要优化;

【2.2】冷启动

冷启动指应用从头开始启动,系统进程在冷启动后才创建应用进程,发生冷启动的情况包括应用自设备启动后或系统终止应用后首次启动;
冷启动特点 : 耗时最多,衡量 APP 启动时间的标准
冷启动流程 :
加载并启动 APP -> 启动后立即为该 APP 显示一个空白启动窗口 -> 创建 APP 进程(创建应用程序对象) -> 
创建主线程,创建主 Activity -> 加载布局并绘制
click event -> IPC -> Process.start -> ActivityThread -> bindApplication -> LifeCycle -> ViewRootImpl

【2.3】热启动

热启动中系统所有的工作便是将 Activity 带到前台,若应用中所有的 Activity 仍驻留在内存中,
则应用可以无须重复对象初始化、布局扩充和呈现;
热启动速度 : 最快

【2.4】温启动

温启动涵盖在冷启动期间发生的操作的一些子集,其开销比热启动多;
温启动速度 : 较快

【3】黑白屏优化

解决方案,为应用的加载设置主题背景,从而使应用的启动屏幕在主题背景上与应用的后续效果保持一致,而不是采用系统主题;

设置 LauncherTheme,该方案不推荐

自定义 AppTheme 主题

【4】测量启动时间

【4.1】系统输出

在 Android 4.4 及更高的版本中,logcat 包括一个输出行,其中包含命名为 Displayed 的值,该值代表从启动进程到在屏幕上完成对应 Activity 绘制所经过的时间;

【4.2】adb 命令获取

【4.3】手动获取

手动打印日志计算启动时间,缺点只能记录应用内耗时;优点可以在线上使用;

启动时间统计结果案例

1. Logcat 输出
2020-08-03 14:10:03.481 1371-1641/? I/ActivityTaskManager: Displayed com.sample.performance/.MainActivity: +324ms

2. ADB 命令获取
adb shell am start -W com.sample.performance/.MainActivity
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER]
    cmp=com.sample.performance/.MainActivity }
Status: ok
LaunchState: COLD
Activity: com.sample.performance/.MainActivity
TotalTime: 324
WaitTime: 325
Complete

3. 日志方式手动获取
2020-08-03 14:10:03.410 22639-23409/? D/Time: 1/tag1 launcher time=98
2020-08-03 14:10:03.447 22639-23409/? D/Time: 1/tag3 launcher time=136
2020-08-03 14:10:03.458 22639-23409/? D/Time: 1/tag2 launcher time=147

【5】方法中的耗时统计

【5.1】traceview 统计

缺点,会拖慢代码的运行;

【5.2】systrace 统计

【5.2.1】windows 安装 python 环境

windows python 安装包下载路径,python2.7,注意 systrace 命令最好用 python2.7 运行;

常见问题

No module named 'win32con'
解决办法
pip install pypiwin32

ImportError: No module named six
解决办法
下载six安装文件,https://pypi.python.org/pypi/six/
解压到 Python 安装目录的 Scripts 文件夹下
打开 cmd,打开放置 six 解压文件的目录,执行命令 python setup.py install

【5.2.2】命令格式与统计结果示意

【5.2.3】使用 systrace 统计启动时间的注意事项

问题 1,systrace 捕捉的过程中,可能会捕捉不到 tag

可能原因

1. beginSection和endSection没有成对出现;
2. 命令行设置了-t N | --time=N,但是这个时间段没有执行tag所在的那段功能代码;
2.1 在Application中的onCreate中设置了tag,命令行中 -t 5(跟踪设备5秒),如果应用活着的时候,执行了这段命令,
    生成的html中肯定是找不到我们设置的tag的;
2.2 如果应用是冷启动,命令行中还没提示Starting tracing… 这时App已经启动完成了,这也是不行的;
3. App的包名写错了;
4. 有的手机需要在开发者选项中打开trace的功能;

操作步骤

1.在代码中设置tag,beginSection 对应 endSection;
TraceCompat.beginSection(“Tag1”);
TraceCompat.endSection();
2.连接真机或者模拟器运行代码
3.将程序杀死(如果不是对app启动进行的监控,这一步可以省略)
4.用终端cd到systrace.py所在目录
5.终端执行python systrace.py -a 包名 sched freq idle am wm gfx view binder_driver hal dalvik camera input res
6.在终端提示“Starting tracing (stop with enter)”后,再在手机或者模拟器上打开app
(如果不是对app启动进行监控,这一步就是执行你要监控的那个操作,比方说监控页面跳转,就执行页面跳转的操作),
主页面加载完成后,点击键盘Enter;

注意事项

1.如果要在跟踪输出中查看任务的名称,则必须在命令参数中包含sched
2.如果执行命令后报一句
These categories are unavailable: ***说明当前设备不支持这个类别或选项
查看当前设备所支持的类别或选项:
python systrace.py --list-categorie

【6】启动时间优化方法的一般性总结

1. 异步优化,采用子线程进行初始化,并行执行减少执行时间;
注意点 : 确定能不能异步优化;执行的方法是否存在先后顺序;确定异步执行后程序是否能够正常执行;
2. 延迟初始化,仅初始化立即需要的对象,不要创建全局静态对象,而是使用单例模式,并在应用中仅在第一次访问该对象时执行初始化;
3. 空闲时初始化,监听应用空闲时间,在空闲时间进行初始化;

参考
本博客为博主的学习实践总结,并参考了众多博主的博文,在此表示感谢,博主若有不足之处,请批评指正。

【1】应用启动时间

【2】网易云课堂 -- 安卓性能优化

【3】ImportError: No module named six,已解决

【4】解决Android性能分析工具systrace使用时找不到section name(或者叫找不到tag)

标签:systrace,启动,--,APP,冷启动,应用,优化
来源: https://blog.csdn.net/qq_27788177/article/details/107768449