最近下来了一个比较棘手的任务,优化项目的启动速度!我们解决问题的第一步,首先就是找到问题,我们需要借助分析工具的帮助。熟练使用分析工具准确定位问题的关键,下面来介绍一下android代码的分析工具。
常用的Android代码分析工具:
1、Android profiler
2、TraceView
工具:Android Studio 3.0+
Android Studio 3.0 采用全新的 **Android Profiler ** 窗口取代 Android Monitor 工具。 这些全新的分析工具能够提供关于应用 CPU、内存和网络 Activity 的实时数据。 您可以执行基于样本的函数跟踪来记录代码执行时间、采集堆转储数据、查看内存分配,以及查看网络传输文件的详情。
要打开 Android Profiler 窗口,请按以下步骤操作:
选择你需要分析的应用启动后,Android studio底部会出现Android Profiler窗口,如下图
Android Profiler 目前可显示共享时间线视图,其中包括带有 CPU、内存和网络使用信息实时图表的时间线。 分析器窗口还包含时间线缩放控件 3、实时更新跳转按钮 4,以及显示 Activity 状态、用户输入 Event 和屏幕旋转 Event 的 Event 时间线5。
当您启动 Android Profiler 后,它会持续收集分析数据,直至您断开设备连接或点击 Close。
但并不是所有分析数据均默认可见。 如果您看到一条消息,显示“Advanced profiling is unavailable for the selected process”,则需在运行配置中启用高级分析 。
分析模块对应的分析内容为:
注:对于原生代码,不可使用高级分析功能。 如果您的应用是纯原生应用(不含 Java Activity
类),则不可使用高级分析功能。 如果您的应用使用了 JNI,则可使用部分高级分析功能,例如 Event 时间线、GC Event、Java 分配对象和基于 Java 的网络 Activity,但不能检测基于原生的分配和网络 Activity。
1、标记分析开始位置,点击下图红点开始记录。再次点击,标记结束位置。
建议记录的时间不要过长,否者会记录不完整,或者出现卡死机的现象。如果非要这样做,可以修改配置参数,方法如下:
2、分析结果
最喜欢他的Call Chart视图,非常直观,可以知道方法的调用情况。
使用Top Down视图可以知道具体方法所使用的具体时间。如上图onCreate()方法里调用了start(),init(),GetIns()等方法。这些方法所对应的时间为
方法名 方法自身耗时(Self) 方法里面的子方法耗时(Children) 方法总耗时(Total)
onCreate 523,532微秒 10,166,559微秒 10,690,091微秒
由此,我们可以知道哪个函数最为耗时,可以定位该函数并对其分析优化。
以前用过eclipse开发Android的开发工程师都知道,在Google还没有推出Android Studio之前,我们都是用的Android Device Monitor工具来进行分析。虽然Google推出了这个Android Profiler蛮好用的,但是实际使用中会发现有几个不尽人意的地方:
1、无法使用代码来准确设置开始和结束记录标记位置
2、无法查看方法的递归次数
如果想解决上面这两个问题,可以通过另外的分析工具——Android Device Monitor
Android Studio 3.1中只能通过打开android-sdk/tools/nonitor的方式来打开工具页面。
打开工具:Tools->Android->Android Device Monitor
使用步骤:
(无须精确开始、结束record的位置)标志开始记录位置
标志结束记录位置
停止记录后,工具会自动打开trace文件
代码标记开始、结束记录位置,生成.trace文件。
Debug.startMethodTracing("trace_file_name");//开始记录
//todo 需要分析的代码块
...
Debug.stopMethodTracing();//结束记录
生成的.trace日志文件路径:
/sdcard/trace_file_name.trace
获取生成的.trace文件:
adb pull /sdcard/trace_file_name.trace
打开trace文件:
.trace
file you want to inspect.
表头的意思是:
名称 意义
Name 方法的详细信息,包括包名和参数信息
Incl Cpu Time Cpu执行该方法该方法及其子方法所花费的时间
Incl Cpu Time % Cpu执行该方法该方法及其子方法所花费占Cpu总执行时间的百分比
Excl Cpu Time Cpu执行该方法所话费的时间
Excl Cpu Time % Cpu执行该方法所话费的时间占Cpu总时间的百分比
Incl Real Time 该方法及其子方法执行所话费的实际时间,从执行该方法到结束一共花了多少时间
Incl Real Time % 上述时间占总的运行时间的百分比
Excl Real Time % 该方法自身的实际允许时间
Excl Real Time 上述时间占总的允许时间的百分比
Calls+Recur 调用次数+递归次数,只在方法中显示,在子展开后的父类和子类方法这一栏被下面的数据代替
Calls/Total 调用次数和总次数的占比
Cpu Time/Call Cpu执行时间和调用次数的百分比,代表该函数消耗cpu的平均时间
Real Time/Call 实际时间于调用次数的百分比,该表该函数平均执行时间
因为Calls+Recur是Android Profiler中没有提及到的,所以这里重点讲一下:
假设有一个递归方法reduceNum(),外部被调用1次,内部递归100次!方法如下:
具官方文档说,Android Device Monitor 在Android Studio 3.1中已弃用,已从Android Studio 3.2中删除。 所有功能都可以使用Android Profiler来代替。
参考:
https://developer.android.google.cn/studio/profile/android-profiler
https://developer.android.google.cn/studio/profile/monitor?hl=en
https://blog.csdn.net/itfootball/article/details/48792435