列表页卡顿

常规方案

convertView复用、使用ViewHolder
耗时任务异步处理

升级方案

布局相关

减少布局层级、避免过度绘制
异步inflate或者X2C

图片相关

避免过大尺寸:GC频繁、内存抖动
滑动时取消加载显示
图片不应该超过控件大小

线程相关

使用线程池收敛线程、降低线程优先级
避免UI线程时间片被抢占

TextView优化

背景

原因:面对复杂文本性能不佳
BoringLayout单行、StaticLayout多行
DynamicLayout可编辑

优化

展示类StaticLayout即可,性能优于DynamicLayout
异步创建StaticLayout
facebook/TextLayoutBuilder

存储优化

SharePreferences

  • 加载慢:初始化加载整个文件(加载在异步线程中进行,取值会等待加载完成,取值在主线程会出现主线程等待异步线程的情况,导致UI线程阻塞)
  • 全量写入:单次改动都会导致整体写入
  • 卡顿:补偿策略导致(提供了apply异步写sp,程序异常或其他情况可能导致数据丢失,所以每次有系统消息发生的时候(handleStopActivity, handlePauseActivity),都会去检查已经提交的apply写操作是否完成,如果没有完成则阻塞主线程)

MMKV

  • mmap和文件锁保证数据完整
  • 增量写入、使用Protocol Buffer
  • 支持从SharePreferences迁移

日志

  • 大量服务需要日志库支持
  • 对于性能的要求:不影响性能、日志不丢失、安全

常规方案

  • 每产生一个日志,写一遍到磁盘中:不丢失、性能损耗
  • 开辟一个内存buffer,先存buffer,再存文件:丢日志

mmap

  • 内存映射文件
  • 优势:高性能、不丢失
  • 业界实现:Xlog、Logan