Android-优化

221 阅读4分钟

记录

日期说明
2023/1/2首次创建
2023/2/18增加优化内容

总纲

关于优化的一些概念

anr

  • 定义:程序无响应(ANR:Application NotResponding)
  • 原因:AMS和WMS会检测App的响应时间,如果App在特定时间无法响应屏幕触摸或键盘输入时间,或者特定事件没有处理完毕,就会出现ANR。还有Activity ServiceInput Manager Service这些服务,也参与了ANR的管理。耗时只是很容易触发anr,并不是anr的根本原因。
  • 类别:
    • KeyDispatchTimeout: 5s
    • BroadcastTimeout: 10s(前台),60s(后台)
    • ServiceTimeout:20s(前台),200s(后台)
    • ContentProviderTimeout:10s
  • 避免:
      1. 避免在主线程进行耗时操作(比如IO,耗时计算,Thread.sleep,长时间不反馈等)
      1. 避免死锁
  • 分析方法
      1. Logcat。系统的日志会打印出anr信息
      • 包含信息:进程id,包名,anr原因,anr时间,cpu消耗,anr堆栈
      1. anr文件。文件路径:/data/anr/traces.txt
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
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
    • 测试工具:Profile gpu rendering
  • 图片
  • 启动
    • 过程:
graph TD
启动APP --> 加载空白Window --> 创建进程
graph TD
创建Application --> 启动主进程 --> 创建activity --> 加载布局 --> 绘制
  • 工具:TraceView
  • 优化
    • theme:视觉上优化
    • 异步初始化
    • 延迟初始化
  • recyclerview
    • 减少onBindViewHolder内的逻辑处理
    • 尽可能使用局部刷新
    • 减少监听器对象的创建
    • 优化ItemView布局
    • 设置滚动监听RecyclerView.addOnScrollListener,在滑动过程中暂停修改视图

功耗

  • 耗电