App性能优化学习

2018-08-14  本文已影响0人  海南鸡

App性能优化

对于一个Android开发,一个好的App:

流畅

使用时避免出现卡顿,提高响应速度

卡顿

根本原因:

  1. 界面绘制:绘制的层级深、页面复杂、刷新不合理,绘制任务太重,绘制内容耗时太长(>16ms)。
  2. 数据处理:导致这种卡顿场景的原因是数据处理量太大,一般分为三种情况,一是数据在处理UI线程,二是数据处理占用CPU高,导致主线程拿不到时间片,三是内存增加导致GC频繁,从而引起卡顿。

布局优化

一个页面的显示测量和绘制过程都是通过递归来完成的,多叉树遍历的时间与树的高度h有关,其时间复杂度O(h),如果层级太深,每增加一层则会增加更多的页面显示时间。

主要通过减少层级、减少测量和绘制时间,保持布局层级的扁平化、提高复用性三个方面入手

避免过度绘制

过度绘制是指在屏幕上的某个像素在同一帧的时间内被绘制了多次。某些像素区域被绘制了多次,从而浪费了多余的CPU以及GPU源。

避免过度绘制:

如何检测?

App启动优化

从心理学角度而言,越快的启动速度往往给用户以性能好,高效可靠的心理暗示,这就很容易让用户对其产生好感。通过ADB命令统计应用的启动时间:adb shell am start -W 首屏Activity。

安卓应用的启动方式分为三种:冷启动、暖启动、热启动,应用发生冷启动时,系统一定会执行:

暖启动

当应用中的 Activities 被销毁,但在内存中常驻时,应用的启动方式就会变为暖启动。相比冷启动,暖启动过程减少了对象初始化、布局加载等工作,启动时间更短。但启动时,系统依然会展示闪屏页,直到第一个 Activity 的内容呈现为止。

热启动

相比暖启动,热启动时应用做的工作更少,启动时间更短。热启动产生的场景很多,常见如:用户使用返回键退出应用,然后马上又重新启动应用。

优化方法:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
            setTheme(R.style.ThemeApp);
           super.onCreate(savedInstanceState);
    }

通过对traceview的详细跟踪以及代码的详细比对,我发现Phihome卡顿发生在:

部分数据库及IO的操作发生在首屏Activity主线程;
Application中创建了线程池;
首屏Activity网络请求密集;
工作线程使用未设置优先级;
信息未缓存,重复获取同样信息;
流程问题:例如闪屏图每次下载,当次使用;

以及其它细节问题:

执行无用老代码;
执行开发阶段使用的代码;
执行重复逻辑;
调用三方SDK里或者Demo里的多余代码;

启动总结

利用主题快速显示界面
** 异步初始化组件;**
** 梳理业务逻辑,延迟初始化组件、操作;**
** 正确使用线程;**
** 去掉无用代码、重复逻辑等。**

合理的刷新机制

有时数据的变化会促使页面刷新,但频繁的刷新会导致资源开销增加。如ListView、RecycleView。

内存优化

Android系统会限制每个App可分配的最大内存。当内存不足时,会导致内存溢出,爆出OutOfMemoryError。当内存紧张时,会触发GC,占用cpu的时间片,因此频繁的GC会导致会导致系统卡顿。

优化内存空间

在移动设备上,由于物理设备的存储空间有限,因此使用最小内存对象或者资源可以减小内存开销,同时让GC 能更高效地回收不再需要使用的对象,让应用堆内存保持充足的可用内存,使应用更稳定高效地运行。常见做法如下:

常见内存泄漏场景

内存分析工具

稳定

Android应用的稳定性定义很宽泛,影响稳定性的原因很多,比如内存使用不合理、代码异常场景考虑不周全、代码逻辑不合理等,都会对应用的稳定性造成影响。其中最常见的两个场景是:Crash和ANR,这两个错误将会使得程序无法使用,比较常用的解决方式如下:

ANR问题
Android官方规定:activity如果5s内无响应事件(屏幕触摸事件或者键盘输入事件)。BroadcastReceiver如果在10s内无法处理完成。Service如果20s内无法处理完成。绝大多数就是因为线程阻塞导致的。

省电

节省流量和好点,减少cpu和Gpu的计算,优化网络访问。

计算优化,避开浮点运算等。

如何检测:

网络优化

做好网络优化一方面可以提高体验,另一方面可以减少流量和电量的损耗.

如何优化:

安装包小

应用的安装包越大,用户下载的门槛越高,特别是在移动网络情况下,用户在下载应用时,对安装包大小的要求更高,因此,减小安装包大小可以让更多用户愿意下载和体验产品。

减少安装包大小的常用方案:

使代码高效的建议

数据库操作方法的优化

上一篇下一篇

猜你喜欢

热点阅读