Android 《Android移动性能实战》学习笔记
一、简介
最近忙着吸收营养都没什么时间乱搞了。不过想想还是不能放弃更新步伐,即使没什么营养,废话一大堆 也要写出来,不然别人就不知道作者有多啰嗦了。最近刚看完了一本《Android移动性能实战》,文采不好,观后感我就不写了。这篇文章记录一下开发注意事项。当然为了不花费更多时间在写文章上面,就直接CP了,没读过这本书的朋友可以了解一下里面有什么内容。读过可以再复习一遍。。。
二、《Android移动性能实战》笔记
一句话概括:本书来自腾讯SNG专项测试团队,记录了优化QQ性能过程的案例并总结优化性能的方法。
文章摘录如下:
遵循原则 |
标准 | 优先级 | 规则起源 |
避免主线程I/O | 避免主线程操作文件和数据库 | P0 | 50%以上的卡顿问题都是由主线程I/0引起的 |
用apply代替Sharepreference.commit | P1 | apply是异步操作,commit是同步操作 | |
提前初始化Sharepreference | P1 | 在多进程和旧版本的Android中,初始化过程的I/O读/写是在主线程的 | |
减少I/O读写量 | 减少使用select * | P1 | 减少从数据库读取的数据量,减少耗时 |
利用缓存减少重复读写 | P2 | 内存缓存命中率极高,投入产出高 | |
数据库减少AUTOINCREMENT | P1 | 因为要多操作一个表,所以Insert耗时减少2~4倍 | |
使用合适的数据库分页 | P0 | sqlite读/写磁盘是以page为单位的,在3.12.0版本之前,Sql默认page size是1KB,从3.12.0开始,page size调整为4KB | |
频繁查询的表使用索引 | P0 | 索引可以极大地减少读磁盘的数据量,极大的提升效率 | |
避免无效索引 | P0 | 无效索引的问题通常是严重的。除了触发全表扫描,产生大量冗余的读/写之外,还降低了写入性能。 | |
减少I/O操作次数 | 使用8KB buffer读/写 | P0 | 可以减少2~3倍的耗时 |
批量更新数据库使用事务 | P0 | 启用事务,根据业务规模,会大量减少I/O读/写量和操作次数,从而提升效率 | |
ZIP压缩大量小文件时建议使用ZipInputStream | P2 |
遵循原则 |
标准 | 优先级 | 规则起源 |
避免内存泄漏 | 避免Activity泄漏 | P0 | 大部分严重的内存泄漏都是Activity泄漏,因为这意味着被引用的View,图片等全部泄漏 |
减少常驻内存 | 尽量使用RGB565 | P1 | 手机QQ使用RGB565将节省部分图片的内存,高达50% |
避免内存重复 | P1 | 手机QQ去掉头像30%的重复缓存,提升缓存的命中率与流畅度 | |
res/drawable里的图片,建议使用Drawable.createFromStream来加载 | P1 | 使用错误的文件夹,导致图片被放大,最终APP使用的内存增加 | |
将图片放置到合适的资源文件夹(hdpi/xxhdpi等) | P1 | ||
减少GC | Bitmap尽量使用inBitmap | P1 | 可以减少GC,提升流畅度 |
建议使用SpraseMap或者ArrayMap | P2 | ||
建议StringBuilder重用(如果有线程使用可配合ThreadLocal) | P1 | 手机QQ与QQ空间的日志改造,利用delete来替代new,给予合理的初始化长度,写日志性能提升多倍 |
遵循原则 |
标准 | 优先级 | 规则起源 |
避免无效流量消耗 | 避免重复上传与下载 | P0 | |
JS/CSS/HTML需要进行压缩 | P0 | 手机QQ之前部分JSON没有使用gzip,优化后成功率上升50%,速度提升2倍 | |
使用更优的图片压缩 | P1 | QQ空间装扮WebP优化后,图片下载/图片展示的速度提升了,带宽优化20% | |
前台网络I/O<60KB(要依赖网络下载完成才能展示内容) | P1 | 大于60KB用户体验极差 | |
定时网络请求尽量合并在一个时间进行 | P2 | 无论是4G还是3G都有所谓的网络状态机,合并请求可以让网络尽量处在低功耗的状态 | |
网络请求失败的重试必须有明显的结束条件 | P2 | 会导致严重耗电和服务器压力过大 | |
降低流量风险 | 流量兜底能力 | P0 | 微信发现流量异常会通过后台服务器终止协议交互。这是不让问题恶化的好方法 |
遵循原则 |
标准 | 优先级 | 规则起源 |
核心场景CPU算法最优 | 建议能用int的不要用float | P2 | 比较两个float数值大小的执行时间是int数值的4倍左右。这是因为CPU的运算架构所致 |
选择合适的容器 | P0 | 一般的容器:Vector/HashMap/LinkedHashMap等;Android提供在内存稀缺的性能场景使用的容器:ArrayMap/SparseArray等;基于线程安全。ConcurrentHashMap等。 | |
使用缓存和批量预处理来提升算法效率 | P1 | QQ空间装扮WebP优化后,图片下载、图片展示的速度提升了,带宽优化20% | |
充分利用CPU | 根据CPU性能,选择合适的线程数 | P0 |
遵循原则 |
标准 | 优先级 | 规则起源 |
尽量让CPU休眠 | 锁屏、灭屏、程序放置后台时,释放或停止Android涉及耗电的服务 | P1 | 包括GPS/WifiManager/Sensor等 |
锁屏、灭屏释放WakeLock | P0 | 必须释放WakeLock,无论是间接还是直接的,否则会让CPU无法休眠,导致严重的耗电问题 | |
使用缓存和批量预处理来提升算法效率 | P1 |
QQ空间装扮WebP优化后,图片下载/图片展示的的速度提升了,带宽优化20% |
|
避免无端电量消耗 | 程序后台CPU不能连续工作5分钟且平均超高5% | P0 |
遵循原则 |
标准 | 优先级 | 规则起源 |
界面流畅 | 核心界面必须有流畅度和掉帧率的数据上报 | P0 | |
FPS平均值大于30,最小值大于24 | P0 | Intel的研究表明,动画大于24FPS是用户可以接受的最低标准 | |
避免>8的掉帧,尽量减少掉帧 | P1 |
遵循原则 |
标准 | 优先级 | 规则起源 |
响应时延 | 核心界面必须有响应时延的数据上报 | P0 | |
启动速度大于2秒 | P0 | ||
界面切换速度小于500ms | P0 | Intel的研究表明,时延小于500ms是用户可以接受的最低标准 | |
避免黑屏 | P0 | 黑屏的用户体验是最差的,而且可以有很多手段避免 |
具体案例细节请查阅书籍..
三、内容推荐
简书:《Android 《Android移动性能实战》学习笔记》
《Android Notification通知简单封装(适配8.0)》
如果你觉得写的不错或者对您有所帮助的话
不妨顶一个【微笑】,别忘了点赞、收藏、加关注哈
看在花了这么多时间整理写成文章分享给大家的份上,记得手下留情哈
您的每个举动都是对我莫大的支持