Android Tech And Thoughts.

Android Profile Learing

Word count: 2.1kReading time: 7 min
2019/12/30 Share

如果应用响应速度慢,动画播放不流畅,卡顿崩溃或者及其耗电,则表示其性能差。要避免出现这些性能问题,往往需要借助工具来分析确定哪方面的资源(例如CPU、内存、显卡、网络和设备电池)的利用率低下

注意:

分析应用时。您应该停用 Instant Run,使用Instant run会轻微影响性能,而更新方法时则会产生稍大的影响。这种性能影响会干扰性能分析工具提供的信息。此外,使用此功能时生成的存根方法会使堆栈轨迹变得很复杂

Android Studio工具

  • Hierarchy Viewer: 分析布局
  • Android Profile :提供了 CPU、Memory、Network和电池相关的检测功能

命令行工具

  • Systrace :在命令行上捕获跟踪信息
  • dmtracedump:
  • dumpsys:

利用Android Profile测量应用性能

android-profiler-callouts_2x.png

①:Android Profile显示当前正在分析的进程和设备
②:在Session窗格中,选择要查看的会话,或启动一个新的分析会话(之前的会保留下来,便于查看对比)
③:放大缩小时间轴范围,或者使用 Attach to live 按钮(就是那个播放暂停键)跳转到实时更新
④:显示交互事件,包括按键、Activity、音量控制更改和屏幕旋转等
⑤:共享时间轴视图,包括CPU、内存、网络和耗电量图表

要显示更详细的数据以及方法和数据跟踪,应点击任意的项目,进入到分析页面。例如,要使用相关工具检查堆数据和跟踪内存分配,请点击 Memory 图表。
并非所有的分析数据在默认情况下都可见。通常我们可以在运行时配置中启用高级分析(8.0或更高版本则默认使用高级分析)以查看其它数据。

高级分析提供的功能包括:

  • 所有分析器窗口中的事件时间轴
  • Memory Profiler 中已分配对象的数量
  • Memory Profiler 中的垃圾回收事件
  • Network Profiler 中有关所有已传输文件的详细信息

具体的步骤如下:

  1. Run -> Edit Configurations
  2. 在左侧窗格中选择您的应用模块
  3. 点击Profile标签,然后勾选Enable advanced profiling.
  4. 重新编译并运行您的应用

使用 Memory Profile 查看 Java 堆和内存分配

Memory可帮助您识别可能会导致应用卡顿、冻结甚至崩溃的内存泄露和内存抖动。它显示一个应用内存使用量的实时图表,让您可以捕获堆转储、强制执行垃圾回收以及跟踪内存分配。

使用方式,从Android Profile工具栏中选择要分析的设备和应用进程(确保启用了USB调试),然后点击Memory 时间轴上的任意位置以打开 Memory Profile。
您还可以从命令行使用 dumpsys 来检查您的应用内存,还可以在 logcat 中查看GC事件

GC事件log解读:

Dalvik:

1
<GC_Reason> <Amount_freed>, <Heap_stats>, <External_memory_stats>, <Pause_time>

ART:

1
<GC_Reason> <GC_Name> <Objects_freed>(<Size_freed>) AllocSpace Objects, <Large_objects_freed>(<Large_object_size_freed>) <Heap_stats> LOS objects, <Pause_time(s)>

与Dalvik不同,ART不会log非显式请求(隐式)的GC,GC只会在判定为很慢时输出信息,更准确地说,条件是GC停顿超过5ms,或者GC耗时超过100ms。如果app不是处于一种可察觉的停顿状态,那么GC不会被判定为很慢。而显式GC会被log出来

为什么分析您的应用内存

Android提供了托管内存环境-当它确定您的应用不再使用某些对象时,垃圾回收器会将未使用的内存释放回堆中。虽然Android查找未使用内存的方式不断改进,但对于所有Android版本,系统都必须在某个时间点短暂地暂停您的代码。
尽管您的应用不会表现出变慢,但如果存在内存泄漏,则即使应用在后台运行也会保留该内存。此行为会强制执行不必要的垃圾回收事件,因而拖慢系统其余部分的内存性能。最后,系统被迫终止您的应用进程以回收内存。然后,当用户返回您的应用时,它必须完全重启。

Memory Profile 概览

memory-profiler-callouts_2x.png
①:用于强制执行垃圾回收事件的按钮
②:用于捕获堆转储的按钮
注意:只有在连接到搭载Android 7.1或更低版本的设备时,才会在堆转储按钮右侧显示 Record 按钮
③:一个下拉菜单,用于指定分析器捕获内存分配的频率,选择适当的选项可以帮助您在分析时提高应用性能
⑥:事件时间轴,显示活动状态、用户输入事件和屏幕旋转事件
⑦:内存使用量时间轴,它包含以下内容

  • 一个堆叠图表,显示每个内存类型当前使用多少内存,如左侧y轴以及顶部的彩色键所示
  • 一条虚线,表示分配的对象数,参考右侧y轴所示
  • 每个垃圾回收事件的图标

不过,如果您使用的是搭载 Android 7.1 或更低版本的设备,则并非所有分析数据在默认情况下都可见。如果您看到一条消息,显示“Advanced profiling is unavailable for the selected process”,您需要才能看到以下内容:

  • 事件时间轴
  • 分配的对象数
  • 垃圾回收事件

如何计算内存

您在 Memory Profiler 顶部看到的数字(图 2)基于您的应用根据 Android 系统机制所提交的所有私有内存页面。此计数不包含与系统或其他应用共享的页面。
memory-profiler-counts_2x.png

内存计数中的类别如下:

  • Java:从Java或kotlin代码分配的对象的内存

  • Native:从C或C++代码分配的对象的内存

    即使您的应用中不使用 C++,您也可能会看到此处使用的一些原生内存,因为 Android 框架使用原生内存代表您处理各种任务,如处理图像资源和其他图形时,即使您编写的代码采用 Java 或 Kotlin 语言。

  • Graphics:图形缓冲区队列向屏幕显示像素(包括GL表面、GL纹理等等)所使用的内存。(请注意这是与CPU共享的内存,不是GPU专用内存)

  • Stack:您的应用中的原生堆栈和Java堆栈使用的内存,这通常与您的运行线程数目有关

  • Code:您的应用用于处理代码和资源(如dex字节码、经过优化或编译的dex代码、so库和字体)的内存

  • Others:系统不确定的分类

  • Allocated:您的应用分配的Java/Kotlin对象数,此数字没有计入C或C++中分配的对象

    如果连接到搭载 Android 7.1 及更低版本的设备,只有在 Memory Profiler 连接到您运行的应用时,才开始此分配计数。因此,您开始分析之前分配的任何对象都不会被计入。不过,Android 8.0 及更高版本附带一个设备内置分析工具,该工具可跟踪所有分配,因此,在 Android 8.0 及更高版本上,此数字始终表示您的应用中待处理的 Java 对象总数。

查看内存分配

如果是在Android 7.1 以上的设备上的话,你可以通过拉动切面来选择时间范围,得到的也是一个累计值,分配的数量以及所占用的内存的一个累计数值。7.1以前你需要手动点击左上方的 Record 按钮,类似于 CPU 的Record,截取一个时间区域,从而进行分析。

1577780928_1_.png

你也可以使用 Dump Heat查看堆转储的相关信息,得到的就是当前的堆内存信息(不是累计的,就是当前的状况)

结合MAT(Memory Analys Tool)

我个人感觉Android Profile提供的信息有时候有些冗余,查看起来不太方便,当然你也可以利用MAT进行一些更细致化的分析。或者利用LeakGanary来进行内存泄漏的分析。

1577775413_1_.png
1577775894_1_.png
1577777028_1_.png

通过分析gc_root往往能找到泄露的原因所在

Bitmap相关的一些东西

Thanks:

Android Developer/Android Studio Guide
Android Studio 3.0 Android Profile 分析器
Android GC-log 解读
Android Bitmap详解

CATALOG
  1. 1. 利用Android Profile测量应用性能
    1. 1.1. 使用 Memory Profile 查看 Java 堆和内存分配
      1. 1.1.1. GC事件log解读:
      2. 1.1.2. 为什么分析您的应用内存
      3. 1.1.3. Memory Profile 概览
      4. 1.1.4. 如何计算内存
    2. 1.2. 查看内存分配
      1. 1.2.0.1. 结合MAT(Memory Analys Tool)
  2. 1.3. Bitmap相关的一些东西
  3. 1.4. Thanks: