记录
| 日期 | 说明 |
|---|---|
| 2023/1/2 | 首次创建 |
| 2023/2/18 | 增加优化内容 |
总纲
关于优化的一些概念
anr
- 定义:程序无响应(ANR:Application NotResponding)
- 原因:AMS和WMS会检测App的响应时间,如果App在特定时间无法响应屏幕触摸或键盘输入时间,或者特定事件没有处理完毕,就会出现ANR。还有Activity Service,Input Manager Service这些服务,也参与了ANR的管理。耗时只是很容易触发anr,并不是anr的根本原因。
- 类别:
- KeyDispatchTimeout: 5s
- BroadcastTimeout: 10s(前台),60s(后台)
- ServiceTimeout:20s(前台),200s(后台)
- ContentProviderTimeout:10s
- 避免:
-
- 避免在主线程进行耗时操作(比如IO,耗时计算,Thread.sleep,长时间不反馈等)
-
- 避免死锁
-
- 分析方法
-
- Logcat。系统的日志会打印出anr信息
- 包含信息:进程id,包名,anr原因,anr时间,cpu消耗,anr堆栈
-
- anr文件。文件路径:/data/anr/traces.txt
- 包含信息:进程id,包名,anr原因,anr时间,cpu消耗,anr堆栈,各个线程堆栈 ---参考:ANR的定位与解决
-
Load: 2.62 / 2.55 / 2.25
CPU usage from 0ms to 1987ms later (2020-03-10 08:31:55.169 to 2020-03-10 08:32:17.156):
41% 2080/system_server: 28% user + 12% kernel / faults: 76445 minor 180 major
26% 9378/com.xiaomi.store: 20% user + 6.8% kernel / faults: 68408 minor 68 major
........省略N行.....
66% TOTAL: 20% user + 15% kernel + 28% iowait + 0.7% irq + 0.7% softirq
- 2.1 CPU负载:参卡---ANR分析
04-02 22:00:08.195 1531 1544 I am_meminfo: [350937088,41086976,492830720,427937792,291887104]
- 2.2 普通的eventlog中也有可能有信息:am_meminfo[Cached, Free, Zram, Kernel, Native]。Cached+Free的内存代表着当前整个手机的可用内存,如果值很小,意味着处于内存紧张状态。如果ANR时间点前后,日志里有打印onTrimMemory,也可以作为内存紧张的一个参考判断
- 参考:
稳定
- 内存
- 内存抖动
- 常见
- 自定义view的onMeasure,onLayout,onDraw直接new创建对象
- 列表,比如recyclerview的onBindViewHolder直接new创建对象
- 有循环的代码中创建对象
- 常见
- 内存泄漏
- 原因
- 静态强引用对象
- 内部类
- 资源使用完后未释放,比如文件IO
- 原因
- 内存溢出
- 工具
- 查询工具
- ProcRank
- dumpsys meminfo
- car /proc/meminfo
- 测试工具
- 坏点测试工具
- 填充测试工具
- 分析工具
- DDMS
- MAT
- MemLeak
- LeakCanary
- Memory Profiler
- 查询工具
- 内存抖动
- 数据库
- 跨版本升级:在onGraduate回调时,针对版本号继续判断,然后递增再判断
网络
- 方法
- 缓存
- 压缩文件
- OkHttp
流畅
- 布局
- 绘制
- 工具:Systrace
- 优化
- 测量、布局、绘制时不做耗时操作
- 布局层级和复杂度要降低
- 不能嵌套使用relativeLayout
- 不在嵌套的LinearLayout中使用weight
- merge标签
- 过度绘制
- 调试GPU过度绘制
- 去掉多余背景色,减少复杂shape使用
- 避免层级叠加
- 其他:ViewStub
- 卡顿
- 基础概念
- fps:30fps可以接受,60fps有很好的交互感,75fps以上的提升就很少,VR设备高于75fps才能消除眩晕
- 1000/60=16ms,系统每个16ms发出VSYNSC信号,触发UI渲染。单位时间内丢帧数可以反映出应用是否流畅,每秒丢6-7帧可以接受,超过10就需要优化了
- 原因分析
- UI层优化
- 问题:过度绘制、布局复杂、层级过深
- 工具:过度绘制查看,HierarchyViewer
- 代码问题查找
- 工具:Lint
- 优化app的逻辑层
- 工具:TraceView
- UI层优化
- 测试工具:Profile gpu rendering
- 基础概念
- 图片
- 启动
- 过程:
graph TD
启动APP --> 加载空白Window --> 创建进程
graph TD
创建Application --> 启动主进程 --> 创建activity --> 加载布局 --> 绘制
- 工具:TraceView
- 优化
- theme:视觉上优化
- 异步初始化
- 延迟初始化
- recyclerview
- 减少onBindViewHolder内的逻辑处理
- 尽可能使用局部刷新
- 减少监听器对象的创建
- 优化ItemView布局
- 设置滚动监听
RecyclerView.addOnScrollListener,在滑动过程中暂停修改视图
功耗
- 耗电