一、性能优化六项指标:
性能、内存、稳定性、流量、电量、安装包大小;
二、背景 ---- Android程序卡顿产生原因:
1、Android系统低效
--渲染线程、同步接口、广播机制
:没有独立的渲染线程
:广播机制引入,可能同时又几百个广播机制在后台运行
2、运行环境恶劣
--后台进程、安全软件
3、低端机占比高
--低内存、弱cpu、IO瓶颈
:开源平台,导致高中低端的机型普遍存在;;
:低内存影响最大,一般可用内存在小于50M,意味着会由于小于50M就会杀死一些进程来维护内存的大小
: GPU是其次;
:读写速度比较慢,在有的手机上;
4、产品考虑不足
--功能定义简陋、功能堆积严重
: 一般的产品只会考虑需求,我要做什么,而并没有把整个闭环考虑清楚;
:在版本迭代的过程,在不注意间可能启动过程会越来越慢;
5、技术考虑不足
--很多
三、用户反馈应用卡顿怎么办?
困难:
1、复现性
-- 用户描述模糊、不稳定出现(复现率比较低);
2、定位难
-- 不同机型、固件、系统状态表现不一
--程序细节多、可疑面广
3、衡量难
-- 卡顿严重程度难以量化
-- 卡顿问题不便分类
: 是有一点卡、非常卡、还是什么
: 没有针对性的目标,提升百分之多少等等,不知道极限在哪里;
四、解决思路
1、
卡 vs 顿,卡为主,顿为辅。卡和顿没有一个明显的界限,大部分顿的问题当环境足够恶劣时就会表现为卡。所以抓住卡,就能解决很多问题。
2、打点统计 vs 全局监控:
短期目标:主路径性能保障,打点统计;
长期目标:整体的卡顿优化,全局监控;
3、 线下分析 vs 线上监控:
线下分析:实验室调试去复现一个问题,精确定位、粒度细;
线上监控:指标衡量、粒度粗。
4、打点统计分析:
(1)、启动速度
(2)、响应速度
(3)、版本比对 : app版本、Android版本
5、用户反馈分析:
将用户性能方面的反馈,测试人员进行分析,以邮件形式发送给技术负责人,进行分析;
反馈等级:
--预警机制
--用户分类
--功能分类
-- 纵向对比
6、anr日志分析:
--精确定位 : 堆栈信息比较清晰
--数据量化
主线程超时(5s ---> 1s)
-- 暴漏更多蕾体
-- 精确定位问题
-- 方便用户联调
-- 如果一个按钮响应时间超过800ms,用户感知起来就会很难受了。
7、全局监控 -- Looper Hook
-- 监测系统消息循环
--计算消息耗时
-- 定位耗时点
卡顿:无非就是主线程被卡住了,就是主线程的消息循环里面的某一帧执行时间非常长,导致后续的消息无法来得及执行,
数据指标卡顿率: 卡顿用户数/日活总数
8、 问题回顾:
-- 下载界面展开卡顿: 分段加载
-- 二维码界面展示慢: 延时加载、先出界面在初始化相机
-- 启动完成后操作卡: 线程枪战,低优先级后台进程+队列
-- 共享存储卡顿: sharedPerference( 主线程IO , commit(主) ---> apply(子))
-- 视频播放控制卡顿(API兼容性问题,异步化,视频播放停止暂停线程)
-- 获取网络代理卡顿(IPC异常【进程间通信】,异步DNS+缓存)
-- 第三方反馈卡死(固件问题,shield Activity,全部采用一个新的activity去做,这样不会对原来activity产生影响)
-- 网页滑屏操作卡顿(GPU加速 开启硬件加速)
-- So加载/jni注册卡(异步加载 + 时序控制)
-- 安全软件事件拦截(沟通反馈)
五、经验推广:
禁止:
-- 主线程文件IO(标记文件读写外)
-- 主线程耗CPU操作
-- 主线程同步IPC调用(时间不可预期)
推荐:
-- 异步化
【1】、 产品及程序设计 : 加载肯定是需要时间的,不可能实时展现;
【2】、预加载 (数据必备,功能执行之前将这些事先数据准备好)
【3】、闲时加载: 利用cpu的闲时做一些事情,主线程会设置一个ido handler,主线程所有消息操作完成之后会回调一个handler
【4】、按需加载
-- 线程管理
1、线程量限制 + 任务队列
2、非主线程优先级调低
--压力测试
-- 防御式编程
-- 全局性能检测
六、延伸
-- 精确化 & 自动化
用户反馈、卡顿日志
-- 新监控方案
Api Hook
-- 新优化方案
卡顿率 --> 帧率
低端机优化