android性能优化总结
1.绘制优化
卡顿造成原因:
- 界面绘制:①页面复杂,层级较深,造成measure,layout,draw都有可能耗时较长,导致vsync信号到达时,数据无法准备好,无法刷新界面
- 数据处理:①UI线程处理大量数据,导致主线程不能及时进行界面绘制;②内存紧张,导致频繁GC,会阻塞主线程
优化方式:
<1>定性分析
①在安卓的开发者模式中,打开GPU调试,当条形图的高度高过绿色的横线时,代表绘制耗时过长。
②在安卓的开发者模式中,打开过度绘制,当一片区域的颜色是红色或者粉红色时,代表UI嵌套过深,可能有无用的UI层级存在。
③使用过程中,用户感觉到卡顿
<2>定量分析和优化
①使用systrace,查找卡顿点,可在代码中添加调试点,逐步排除,重点关注Alerts提示 和 Frames颜色为红色的部分;可以使用android device monitor进行大范围追踪,也可在代码中使用系统提供的api定量追踪。
代码中使用api如下:
android device monitor使用如下:
monitor_sys_trace.png
生成的html文件如下,下图展示了可以优化的点,比如绘制耗时等:
alert
②然后使用traceview查找具体耗时方法,针对优化:
在代码中api如下,可以生成.trace文件:
traceview.png
当然,也可以使用android device monitor,如下:
生成traceview
下面这示例可以看出:测试的testWriter()方法中,md5()方法消耗了大量时间,就可以找到优化点,从而进行针对性优化
example
③在android device monitor中,使用hierarchy view查看UI布局,优化嵌套层级,示例如下:
hierarchy view
④使用android lint进行代码检查,可以配置各种规则,可以对代码进行全方位的静态检查。
⑤自定义主线程的printer,检测每次消息处理时间,进行卡顿定位
可优化点
①性能framelayout>linearlayout>relativelayout,优先使用framelayout
②减少布局层级
③使用merge减少层级,使用viewstub绘制较少使用的布局
④已知宽高,不使用wrap_content属性
⑤界面只刷新必要的区域
⑥recycleview,listview只刷新对应的item
⑦硬件加速(api兼容问题)
⑧启动速度优化
2.内存优化
潜在问题
①频繁GC,导致线程阻塞
②内存泄漏,内存一致增长
优化点
①内存抖动,一般现象为锯齿状的内存状态图
②内存泄漏
优化工具
①借助leakcanary定位问题,找到内存泄漏的页面
②在androidstudio的profiler - memeory中,通过查看当前存在问题页面的内存快照,精准定位,查找泄漏点,进行问题修复。
常见内存泄漏
①静态类持有activity context
②handler内存泄漏
③第三方框架未释放
④实例变量持有fragment,导致fragment无法释放
⑤cursor,file未关闭
常用优化方式
①借助弱引用解决 handler内存泄漏;;实例变量持有fragment,导致fragment无法释放;静态类持有activity context
②静态类持有context,提供释放方法,将context置null
③正确关闭文件流,cursor
④图片优化,图片大小,图片编码,采样率,三级缓存
⑤lru缓存优化
⑥使用最优数据结构,靠经验
3.存储优化
常用方式及特点
①sharedpreference:适合存储简单配置信息,开关等
②file:适合存储大数据,音视频或者网络内容
③sqlite:适合存储复杂的数据类型
④contentprovider:进程之间的数据交换
优化点
①sharedpreference:使用apply异步存储
②sqlite:使用sqlitestatement;使用事务一次插入多条数据;使用索引提高查询效率,异步存储;分页
③file:文件读写并发
④contentprovider:权限管理
4.稳定性优化
存在问题
①crash:java层,native层
②anr:触摸事件超时5s,广播超时10s,service超时20s
检测工具
①java层crash,实现Thread.UncaughtException,捕捉异常
②anr发生时,系统会生成trace文件,低版本手机会有trace.txt文件,高版本手机在adb中,执行adb bugreport,可导出anr记录文件
保活方法,归根结底是提高进程优先级
①长连接保持心跳,保持进程活跃
②注册系统广播,相应系统消息
③使用syncadapter提供的账号同步机制提高进程优先级,demo地址https://github.com/dongdaniqng/SyncAdapter
④双进程,一像素,不推荐,流氓程序才这么干
5.耗电优化
耗电问题
①屏幕常亮
②频繁调用传感器,蓝牙,相机,定位,视频,音频等
③代码问题,频繁刷新,cpu使用率高,比如频繁刷新广告,刷新后台任务等
优化工具
①androidstudio profiler
②battery-historian
优化点
①及时关闭不再使用的传感器
②代码合理优化,使用workmanager或者jobscheduler优化任务
6.安装包体积优化
常用方案
①代码优化,使用混淆
②资源优化,使用android lint移除无用资源(存在误删,需要注意);配置shrinkResources;移除无用的lib,so,无用的assets目录文件
③图片优化,尽量使用一套图片文件,多个dimen尺寸文件;或者使用webp,svg图片
④插件化,将不频繁使用的模块存放到服务器,然后下载
⑤第三方框架择优使用
7.网络优化
①Dns:解析使用httpdns;直接使用ip
②Http :版本升级,比如从1.x升级到2.x,3.x,减少三次握手时间
③Https:升级ssl/tls加密协议版本,减少https的tls握手事件
④Cdn:使用cdn,缓存一些资源,加快访问速度
8.安全优化
本地安全
①敏感信息加密存储,使用keystore等,或者先加密再存储
②apk下载安装完整性校验,防劫持校验
③运行环境检查,如root,xposed环境
④安全键盘
⑤防止截屏
⑥代码安全检查,四大组件的权限等
⑦登录等隐私界面防劫持
网络安全
①使用https
②重要信息加密传输