Android 性能优化总结一

Android 性能优化工具及代码代码

Performance

  1. Overdraw: 避免过渡绘制,打开开发者模式Show GPU Overdraw进行观察;
  2. Frame Rate/Refresh Rate: 屏幕一秒刷新次数为60次,操作时间需要小于 60ms,打开开发者模式Profile GPU Rendering(GPU呈现模式分析);
  3. layout: 改变View的属性,可能导致整个HierarcyView的重绘,所以需要减少layout层次,减少Overdraw;
  4. onDraw: 自定义View,使用clipRectquickReject(删除不在屏幕上的元素),避免绘制在屏幕之外的内容,避免在onDraw中进行对象创建,比如Rect,Paint;
  5. Memory Churn: 瞬间产生大量对象,严重占用Young Generation内存,达到阀值剩余空间不足,导致GC,严重的情况下甚至会引起Old/Permanent Generatation的内存回收;
  6. GC: Android优化了jvm,分为三级内存Yonug/Old/Permanent,使用Memory Monitor来查看内存占用情况,使用AllocationTracker查看具体是哪些对象;
  7. Memory Leaks: 内存泄漏,handler,异步处理,内部类;
  8. Battery: 每次网络请求都会保持无线信号一段时间,所以需要减少请求频次,Wifi比无线信息省电,可以针对不同的场景做不同的请求时间控制,使用WakeLockJobScheduler唤醒设备,发起请求的瞬间,接收到数据的瞬间,耗电量都会增加,所以需要考虑数据压缩(数据量大耗电量大),捆绑请求;
  9. Anim: Bitmap旋转繁重,谨慎使用;
  10. For: for index效率更高,其次是for sampleIterator,比较int数值类型比比较float数值类型效率更高;
  11. Lint: Ayalysis -> Inspect Code
  12. Alpha: 设置alpha,将增加页面渲染次数;
  13. StrictMode: 开发都选项中打开严格模式,如果页面有隐藏的隐患则屏幕变红;
  14. OOM: 尽量使用小图片,或者是.jpeg,图片在加载的时候需要连续的一块内存区域,所以图片过大可能导致分配连续的内存区域失败,加载Bitmap的时候,可以给Options指定inBitmap属性,这样在加载新图片的时候,新图片将可能会直接复用上一张图片的内存区域,而不是直接重新申请内存;
  15. Battery Analysis: 使用BatteryHistorian分析耗电量,adb shell dumpsys battery > xx.txt

Coding

  1. ArrayMap: HashMap占内存,改用ArrayMap
  2. Boxing: 避免自动装箱,Map/List中使用基本数据类型Bool、Int,可以使用SparseBoolArray、SparseInt/LongArray;
  3. Enum: 枚举占内存,少使用;
  4. onLowMemory/onTrimMemory: 内存告警,此时清理内存,添加缓存;
  5. Location: 如果两次请求位置时位置未改变,增加取点时间间隔;
  6. Network: 网络硬件激活后,持续保持几十秒,直到没有新的网络请求时才停止,避免轮循,数据无更新时,延长请求间隔;
  7. Prefetching: 3G 1-5M
  8. Service: 使用IntentService,它是一个后台线程;
  9. Proguard: Proguard工具可以移除类中未使用到的java code;
  10. build.grade: 配置shrinkResourceminifEnabled排除未引用的资源,未使用的java代码,减小apk;
  11. Serializable: 序列化,使用Gson等高效的工具库,传统序列化低效,耗内存,xml布局文件在编译阶段转换成更复杂的格式,具有更高效的执行性能;
  12. CPU: 系统会动态调整cpu频率,延长电量,使用systrace导出cpu使用信息;
  13. HandlerThread: 给线程设置优先级(-20, 24),cpu会根据优先级进行调度优化,值越小,优先级越高;
  14. VectorDrawable: 只需要一个文件,不需要很多图片;
  15. Launch Time: 加载时间,入口加载时间,优化布局,延迟加载非必要组件,真正使用到的时候再加载;