Android性能优化实战指南
对新闻客户端APP的性能优化
1. 解决启动白屏问题
当系统加载并启动App时,需要耗费相应的时间,这样会造成用户会感觉到当点击App图标时会有"延迟"现象。Google的做法是在App创建的过程中,先展示一个空白页面,让用户体会到点击图标之后立马就有响应。
在Style里面配置:
<style name="AppTheme.Luncher"><item name="android:windowBackground">@drwaable/windows_bg</item><item name="android:windowFullscreen">true</item>
</style>
在manifest.xml中:
<activityandroid:name=".Mainactivity"android:theme="@style/Apptheme.luncher">
在Activity的onCreate改回原来的:
public class onCreate() {setTheme(R.style.AppTheme);
}
2. 启动耗时优化
在性能测试中存在启动时间2-5-8原则:
- 当用户能够在2秒以内得到响应时,会感觉系统的响应很快;
- 当用户在2-5秒之间得到响应时,会感觉系统的响应速度还可以;
- 当用户在5-8秒以内得到响应时,会感觉系统的响应速度很慢,但是还可以接受;
- 而当用户在超过8秒后仍然无法得到响应时,会感觉系统糟透了,或者认为系统已经失去响应。
2.1 优化前
优化之前启动耗时的最小值:
ThisTime : 3340 ms
TotalTime : 3340 ms
waitTime : 3413 ms
2.2 启动优化工具 CPU Profile/TraceView
如果发现显示时间比希望的时间长,则可以继续尝试识别启动过程中的瓶颈。查找瓶颈的一个好方法是使用Android Studio CPU性能剖析器。
2.3 优化点1 优化SharedPreference
SharedPreference涉及到在子线程进行XML读取,SP的定位就是保存简单轻量级的key value数据。
2.4 布局异步加载
LayoutInflater加载xml布局的过程会在主线程使用IO读取XML布局文件进行XML解析,再根据解析结果利用反射创建布局中的View/ViewGroup对象。Android为我们提供了Asynclayoutinflater把耗时的加载操作在异步线程中完成。
2.5 优化点2 新闻数据缓存异步加载
在fragment的onCreate的时候读取了缓存的数据和SP,占用了一定的时间,改为通过IdleHandler进行空闲时间异步加载。
2.6 代码优化
在DispatchMessage的onChange中耗费了700多的毫秒数,有两处调用了notifyDataSetChange,删除其中一个可以优化快300ms。
3. 卡顿优化
大多数用户感知到的卡顿等性能问题的最主要根源都是因为渲染性能。Android系统每隔大概16.6ms发出VSYNC信号,触发对UI进行渲染,如果每次渲染都成功,这样就能够达到流畅的画面所需要的60fps。
3.1 Systrace卡顿分析
Systrace是Android平台提供的一款工具,用于记录短期内的设备活动。该工具会生成一份报告,其中汇总了Android内核中的数据,例如CPU调度程序、磁盘活动和应用线程。
3.2 Trace API
Android提供了Trace API能够帮助我们记录收集自己应用中的一些信息:Trace.beginSection()与Trace.endSection()。
3.3 App层面监控卡顿
目前业界两种主流有效的app监控方式:
- 利用UI线程的Looper打印的日志匹配;
- 使用Choreographer.FrameCallback。
4. 过度渲染
过度绘制是指系统在渲染单个帧的过程中多次在屏幕上绘制某一个像素。GPU过度绘制检查可以通过开发者选项中的"调试GPU过度绘制"功能来识别。
5. 网络优化
网络请求需要经过的流程:
- DNS解析,请求DNS服务器,获取域名对应的IP地址;
- 与服务端建立连接,包括tcp三次握手,安全协议同步流程;
- 连接建立完成,发送和接收数据,解码数据。
优化点:
- 直接使用IP地址,去除DNS解析步骤;
- 复用连接或一直使用同一条连接(长连接);
- 压缩数据,减小传输的数据大小。
6. Crash监控
Crash(应用崩溃)是由于代码异常而导致App非正常退出,导致应用程序无法继续使用,所有工作都停止的现象。在Android应用中发生的Crash有两种类型,Java层的Crash和Native层Crash。
6.1 Java Crash
Java的Crash监控非常简单,Java中的Thread定义了一个接口:UncaughtExceptionHandler;用于处理未捕获的异常导致线程的终止。
Native crash
相对于Java的Crash,NDK的错误无疑更加让人头疼。Linux信号机制是Linux进程间通信的一种重要方式,Linux信号一方面用于正常的进程间通信和同步,另一方面它还负责监控系统异常及中断。
BreakPad
Google breakpad是一个跨平台的崩溃转储和分析框架和工具集合。breakpad在Linux中的实现就是借助了Linux信号捕获机制实现的。
使用Keymob开发助手优化性能
在性能优化过程中,使用Keymob开发助手可以大大提高开发效率:
- 内存分析工具:Keymob提供强大的内存分析功能,帮助开发者快速定位内存泄漏问题
- 性能监控:实时监控应用的CPU、内存、网络等性能指标
- 代码优化建议:根据性能分析结果,Keymob会给出针对性的代码优化建议
- 自动化测试:Keymob支持自动化性能测试,可以模拟不同设备环境下的性能表现
通过结合Keymob开发助手的各项功能,开发者可以更系统化地进行性能优化工作,而不是仅仅依靠经验或手动调试。Keymob的智能分析功能能够帮助开发者快速定位性能瓶颈,并提供可行的优化方案。
总结
性能优化是一个持续的过程,需要开发者不断学习和实践。本文介绍的优化技巧结合Keymob开发助手的强大功能,可以帮助开发者构建更加流畅、高效的Android应用。记住,优化不是一蹴而就的,需要在开发过程中持续关注性能指标,及时发现问题并进行优化。