磁盘I/O优化
规则 | 方案 | 原因 |
---|---|---|
避免主线程 I/O | 避免主线程操作文件及数据库 | 一半的卡顿问题由主线程I/O 引起 |
apply替代commit | apply异步,commit同步操作 | |
提前初始化Sharepreference | 多进程中初始化过程时在主线程中 | |
减少I/O读写量 | 减少使用select查找语句 | 减少从数据库中读的数据量,耗时操作 |
利用缓存减少重复读写 | 内存缓存命中率高 | |
减少使用AUTOINCREMENT创建表 | 维护一个sqlite_squence的内部表来记录该表的最大行号,表操作update,insert和delete都要修改此表内容,带来额外的开销,降低效率 | |
使用合适的数据库分页 | sqlite是以页为单位,默认1KB(3.12.0版本以前),现在默认为4KB | |
频繁查询时,建立索引 | 建立索引减少读磁盘数据量 | |
避免无效索引 | 产生冗余读写操作和写入性能 | |
减少I/O操作次数 | 使用8KB Buffer size读/写 | 减少耗时 |
批量更新数据库使用事务 | 启用事务,减少大量读写操作和次数,提升效率 | |
使用ZipInputStream压缩大量小文件 | zopFile在Native读取文件,每次在1KB到64KB,而ZipInputStream每次只传递512字节给Native层,如果小文件使用ZipFile,导致Buffer利用率不高。 |
内存优化
规则 | 方案 | 原因 |
---|---|---|
避免内存泄漏 | 避免Activity泄漏 | 被引用的View、picture等泄漏 |
减少常驻内存 | 使用RGB565 | 每个像素使用2字节 |
避免内存重复 | 提升缓存命中率与流畅度 | |
drawable里图片使用Drawable.createFromStream加载 | 使用错误的文件夹,导致图片放大,增加内存 | |
将图片对应的资源文件夹下 | 使用错误的文件夹,导致图片放大,增加内存 | |
减少GC | 使用inBitmap替代Bitmap | 减少GC |
尽量使用SpraseMap或ArrayMap | ||
重用StringBuilder(如有线程可使用ThreadLocal) | 利用delete替代new, 给出合理的初始化长度 |
网络优化
规则 | 方案 | 原因 |
---|---|---|
避免无效流量消耗 | 避免重复上传和下载 | 增加带宽成本 |
JS/CSS/HTML进行压缩 | 提升速度 | |
避免无效流量消耗 | 使用更优图片压缩 | 优化带宽,提升速度 |
前台网络I/O < 60KB | ||
定时网络请求合并在一个时间点进行 | 合并请求让网络尽量处在低功耗状态 | |
网络请求失败的充实必须有明显的结束条件 | 导致严重的耗电和服务器压力过大 | |
降低流量风险 | 流量兜底 | 流量异常会通过后台服务器终止协议交互 |
CPU优化
规则 | 方案 | 原因 |
---|---|---|
核心场景CPU算法最优 | 能用int不要用float | float执行时间比int长 |
选择合适的容器 | android内存缺乏时,使用ArrayMap、SparseArray等,线程安全考虑使用ConcurrentHashMap等 | |
使用缓存和批量处理来提升算法 | ||
充分利用CPU | 合理选择适当的线程数根据CPU性能 |
电池优化
规则 | 方案 | 原因 |
---|---|---|
让CPU休眠 | 锁屏,灭屏,放置后台程序,释放活停止耗电服务 | GPS、WifeManager、Sensor等 |
锁屏,灭屏释放WakeLock锁 | 不释放无法让CPU休眠,导致耗电 | |
使用缓存和批量预处理来提高算法效率 | ||
避免无端电量消耗 | 后台程序CPU不要连续工作5分钟以上。 |
流畅度优化
规则 | 方案 | 原因 |
---|---|---|
界面流畅 | 核心界面有流畅度和丢帧率的数据上报 | |
FPS平均值>30,Mix>24 | 动画大于24FPS,人眼可以接受 | |
丢帧避免>8,减少丢帧>4 |
响应时间
规则 | 方案 | 原因 |
---|---|---|
响应时延 | 核心界面要有响应时延数据上报 | |
启动速度小于2s | ||
界面切换速度小于500ms | 时延小于500ms,用户可以接受 | |
避免黑屏 | 黑屏影响用户体验 |