yunshuipiao / Potato

Read the fucking source code for the Android interview
Apache License 2.0
80 stars 12 forks source link

Android Performance Optimization Tool #57

Open yunshuipiao opened 5 years ago

yunshuipiao commented 5 years ago

Android Performance Optimization Tool

[TOC]

Android 性能优化工具的汇总

StrictMode

Android 2.3 引入的工具,可以帮助开发者发现代码中的不规范问题。

使用严格模式,系统检测出主线程违例的情况会做出相应的反应,如日志打印,弹出对话框亦或者崩溃等。换言之,严格模式会用不同的策略对应用的违例细节做监控,通过一定的方式暴露给开发者方便优化与改善。

StrictMode通过策略方式来让你自定义需要检查哪些方面的问题,主要有两种策略:

detectNetwork():用于检查UI线程中是否有网络请求

detectDiskReads()和detectDiskWrites():是磁盘读写检查

detectCustomSlowCalls():主要用于帮助开发者发现UI线程中调用的哪些方法执行的比较慢,要和StrictMode.noteSlowCall配合使用,只有通过  StrictMode.noteSlowCall标记“可能会”执行比较慢的方法,只有标记过的方法才能被检测到,日志中会记录方法的执行时间(注意:只有在主线程中执行的方法才会显示执行时间,在其他线程中执行的方法,就算是使用StrictMode.noteSlowCall标记,在日志中也不会打印执行时间)
detectActivityLeaks() 用户检查 Activity 的内存泄露情况

detectLeakedClosableObjects() 和 detectLeakedSqlLiteObjects(),资源没有正确关闭时回触发,detectLeakedSqlLiteObjects() 和 detectLeakedClosableObjects()的用法类似,只不过是用来检查 SQLiteCursor 或者 其他 SQLite 对象是否被正确关闭

detectLeakedRegistrationObjects() 用来检查 BroadcastReceiver 或者 ServiceConnection 注册类对象是否被正确释放

setClassInstanceLimit(),设置某个类的同时处于内存中的实例上限,可以协助检查内存泄露

Systrace

Systrace是分析Android性能问题的神器,Google IO 2017上更是对其各种强推. 是分析卡顿掉帧问题核心工具,只要能提供卡顿现场,systrace就能很好定位问题.

原理

在系统的一些关键链路(比如System Service,虚拟机,Binder驱动)插入一些信息(我这里称之为Label),通过Label的开始和结束来确定某个核心过程的执行时间,然后把这些Label信息收集起来得到系统关键路径的运行时间信息,进而得到整个系统的运行性能信息。

TraceView

TraceView 是 Android SDK 中内置的一个工具,它可以加载 trace 文件,用图形的形式展示代码的执行时间、次数及调用栈,主要便于我们分析及优化方法的执行.

生成和分析traceView文件

使用代码

android.os.Debug.startMethodTracing()
// 目标代码块
android.os.Debug.stopMethodTracing()

当你调用开始代码的时候,系统会生产 trace 文件,并且产生追踪数据,当你调用结束代码时,会将追踪数据写入到 trace 文件中: /sdcard/Android/data/包名/files/dmtrace.trace 文件.

Android Studio 中 monitor 点击闹钟按钮

Layout Inspector

Layout Inspector是Android studio自带的视图层次结构分析工具(Android Studio 2.2及其之后版本)。Android Studio中的Layout Inspector允许您在运行时从Android Studio IDE中检查应用程序的视图层次结构。当您的布局在运行时构建而不是完全在XML布局中定义时,这尤其有用。

调试GPU过度绘制 & GPU呈现模式分析

调试GPU过度绘制和GPU呈现模式分析是Android手机自带的分析工具。能比较方便的帮助开发者检验是否存在overdraw和卡顿的问题,但是不能帮忙定位问题。 位置:开发者选项

MAT

MAT是Memory Analyzer tool的缩写,是一种快速,功能丰富的Java堆分析工具,能帮助你查找内存泄漏和减少内存消耗。很多情况下,我们需要处理测试提供的hprof文件,分析内存相关问题,那么MAT也绝对是不二之选。 Eclipse可以下载插件结合使用,也可以作为一个独立分析工具使用.

LeakCanary

首先尝试着从ReferenceQueue队列中获取待分析对象(软引用和弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用或弱引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用或弱引用加入到与之关联的引用队列中),如果不为空,那么说明正在被系统回收,如果直接就返回DONE,说明已经被系统回收了,如果没有被系统回收,可能存在内存泄漏,手动触发系统GC,然后再尝试移除待分析对象,如果还存在,说明存在内存泄漏。

CPU Activity

CPU Profiler 可帮助您实时检查应用的 CPU 使用率和线程 Activity,并记录函数跟踪,以便您可以优化和调试您的应用代码.

Memory Profiler

Network Profiler