Android 性能优化工具及代码代码
Performance
- Overdraw: 避免过渡绘制,打开开发者模式
Show GPU Overdraw
进行观察; - Frame Rate/Refresh Rate: 屏幕一秒刷新次数为60次,操作时间需要小于 60ms,打开开发者模式
Profile GPU Rendering
(GPU呈现模式分析); - layout: 改变View的属性,可能导致整个HierarcyView的重绘,所以需要减少layout层次,减少Overdraw;
- onDraw: 自定义View,使用
clipRect
,quickReject
(删除不在屏幕上的元素),避免绘制在屏幕之外的内容,避免在onDraw中进行对象创建,比如Rect,Paint; - Memory Churn: 瞬间产生大量对象,严重占用Young Generation内存,达到阀值剩余空间不足,导致GC,严重的情况下甚至会引起Old/Permanent Generatation的内存回收;
- GC: Android优化了jvm,分为三级内存Yonug/Old/Permanent,使用
Memory Monitor
来查看内存占用情况,使用AllocationTracker
查看具体是哪些对象; - Memory Leaks: 内存泄漏,handler,异步处理,内部类;
- Battery: 每次网络请求都会保持无线信号一段时间,所以需要减少请求频次,Wifi比无线信息省电,可以针对不同的场景做不同的请求时间控制,使用
WakeLock
,JobScheduler
唤醒设备,发起请求的瞬间,接收到数据的瞬间,耗电量都会增加,所以需要考虑数据压缩(数据量大耗电量大),捆绑请求; - Anim: Bitmap旋转繁重,谨慎使用;
- For:
for index
效率更高,其次是for sample
,Iterator
,比较int数值类型比比较float数值类型效率更高; - Lint: Ayalysis -> Inspect Code
- Alpha: 设置alpha,将增加页面渲染次数;
- StrictMode: 开发都选项中打开严格模式,如果页面有隐藏的隐患则屏幕变红;
- OOM: 尽量使用小图片,或者是.jpeg,图片在加载的时候需要连续的一块内存区域,所以图片过大可能导致分配连续的内存区域失败,加载Bitmap的时候,可以给Options指定inBitmap属性,这样在加载新图片的时候,新图片将可能会直接复用上一张图片的内存区域,而不是直接重新申请内存;
- Battery Analysis: 使用BatteryHistorian分析耗电量,
adb shell dumpsys battery > xx.txt
;
Coding
- ArrayMap:
HashMap
占内存,改用ArrayMap
; - Boxing: 避免自动装箱,Map/List中使用基本数据类型Bool、Int,可以使用SparseBoolArray、SparseInt/LongArray;
- Enum: 枚举占内存,少使用;
- onLowMemory/onTrimMemory: 内存告警,此时清理内存,添加缓存;
- Location: 如果两次请求位置时位置未改变,增加取点时间间隔;
- Network: 网络硬件激活后,持续保持几十秒,直到没有新的网络请求时才停止,避免轮循,数据无更新时,延长请求间隔;
- Prefetching: 3G 1-5M
- Service: 使用IntentService,它是一个后台线程;
- Proguard: Proguard工具可以移除类中未使用到的java code;
- build.grade: 配置
shrinkResource
,minifEnabled
排除未引用的资源,未使用的java代码,减小apk; - Serializable: 序列化,使用Gson等高效的工具库,传统序列化低效,耗内存,xml布局文件在编译阶段转换成更复杂的格式,具有更高效的执行性能;
- CPU: 系统会动态调整cpu频率,延长电量,使用
systrace
导出cpu使用信息; - HandlerThread: 给线程设置优先级(-20, 24),cpu会根据优先级进行调度优化,值越小,优先级越高;
- VectorDrawable: 只需要一个文件,不需要很多图片;
- Launch Time: 加载时间,入口加载时间,优化布局,延迟加载非必要组件,真正使用到的时候再加载;