美文网首页
Monitor--DDMS

Monitor--DDMS

作者: ArcherZang | 来源:发表于2019-05-03 21:56 被阅读0次

    Android\sdk\tools\monitor.bat
    添加不同的监视组件窗: Window--->open Perspective或者DDMS按钮旁边的加号窗。
    给当前组件窗添加小窗口Window--->Show View,这里选择需要的,点击OK

    添加View窗口
    • DDMS

      • Update Heap -- 查看进程的堆栈使用情况

        1. 选中你要查看的进程;
        2. 点击“ Update Heap”按钮开启该进程的该项功能;
        3. 点击“Cause GC”按钮来进行垃圾回收,当操作完成后,您会看到一组对象类型和为每种类型已分配的内存;
        4. 点击列表中的一个对象类型,为该种特定内存大小的对象分配的数量。


          Update Heap
          列名 描述
          Heap Size 堆栈分配给App的内存大小
          Allocated 已分配使用的内存大小
          Free 空闲的内存大小
          %Used Allocated /Heap Size 使用率
          Objects 对象数量
          Type 类型
          Count 数量
          Total Size 总共占用的内存大小
          Smallest 占用内存最小的对象内存大小
          Largest 占用内存最大的对象内存大小
          Median 从小到大,排在最中间的对象内存大小
          Average 平均值
          Allocation count per size 按分配大小计算
      • Dump HPROF file -- 导出hprof 文件
        目前版本移除了Analyzer Tasks窗口,stackoverflow链接
        通过以下语句可以将android规范的HPROF文件转换成java se的,以便使用其他分析工具例如MAT。
        hprof-conv C:\Users\zchw\Desktop\render.hprof C:\Users\zchw\Desktop\heap-converted.hprof

        1. 在代码中生成Hprof文件
          在android代码,可以使用如下代码把hprof文件生成到sd卡上。
          Debug.dumpHprofData("/sdcard/input.hprof");
          可以不用sd卡,而将hprof文件直接生成在手机上,但是只能在"/data/data/"+packageName的目录下。
          实例1:
        void generateHprof() {
           String packageName=getApplicationInfo().packageName;
           String hpFilePath="/data/data/"+packageName+"/input.hprof";
               try {
                   //Debug.dumpHprofData("/sdcard/input.hprof");
                   Debug.dumpHprofData(hpFilePath);
               } catch (IOException e) {
                   // TODO Auto-generated catch block
                   e.printStackTrace();
               }
        }
        
        1. 通过按钮导出
          导出文件是这样的com.example.android.mobileperf.render.hprof,将.hprof之前的小数点删除,可以是render.hprof,然后AndroidStudio
          保存HPROF文件
          AndroidStudio导入
          AndroidStudio查看
        列名 描述
        zygote heap 与 android zygote 进程共享的 heap
        image heap 与系统共享的 heap
        app heap 应用本身的 heap
        Arrange by class 按类排序
        Arrange by package 按包排序
        Arrange by callstack 按调用堆栈排序
        Allocations 数量
        Native Size native所选实例大小总和
        Shallow Size 堆里所选实例大小总和
        Retained Size 表示该类的所有实例的 dominatin size 之和;当一次 GC并发生内存回收后,能被虚拟机回收的最大内存大小。只能说是最大,不能完全回收掉,因为可能有些类还会被别的类引用到,就不能进行回收。
        Depth GC根节点到所选实例的最短路径的深度
        instance 表示类所对应的实例的个数
        reference 引用的树形链
      • Cause GC -- 垃圾回收
        刚进去update heap,需要进行一次垃圾回收。
        1.选中你要查看的进程;
        2.点击“ Cause GC ”按钮开启该进程的该项功能;

      • Update Threads -- 获取线程信息
        1.选中你要查看的进程;
        2.点击“ Update Threads ”按钮开启该进程的该项功能;
        3.选中具体线程,下方是线程的堆栈调用信息。

        列名 描述
        ID 虚拟机分配的唯一的线程ID,在Dalvik里,它们是从3开始的奇数。
        Tid linux的线程ID,For the main thread in a process, this will match the process ID.
        Status 线程状态
        utime 执行用户代码的累计时间
        stime 执行系统代码的累计时间
        name 线程的名字
        Status状态 状态描述
        running 正在执行程序代码
        sleeping 执行了Thread.sleep()
        monitor 等待接受一个监听锁
        wait Object.wait()
        native 正在执行native代码
        vmwait 等待虚拟机
        zombie 线程在垂死的进程
        init 线程在初始化(看不到)
        starting 线程正在启动(看不到)
      查看子线程
      • Start Method Profiling-- 获取线程信息

        1. 选中你要查看的进程;
        2. 点击“ Start Method Profiling”按钮开启trace功能;
        3. 去操作应用中我们关注的流程
        4. 点击“ Stop Method Profiling”按钮进入trace结果分析页面;
          在我们分析应用性能如CPU消耗、卡顿现象时非常有用,特别是方法消耗cpu时间的分析,可以比较准确定位到应用存在性能问题的方法调用。它其实调用的是Android SDK的traceview工具进行分析。
          时间面板以每个线程为一行,右边是该线程在整个过程中方法执行的情况。
          分析面板则是以表格的形式展示所有线程的方法的各项指标

          时间线面板:
              左边是线程信息; main线程就是Android应用的主线程,这个线程是每个应用都会有的,其他的线程可能因操作不同而发生改变。
              右边是每个线程中每个方法的执行信息; 左边第一个是第一个方法执行开始,右边最后一个是第一个方法执行结束,其中的每一个小立柱就代表一次方法的调用,你可以把鼠标放到立柱上,就会显示该方法调用的详细信息。只有一个立柱表示该方法内部不调用或者是画面显示太小,放大后能看到两个立柱。
          分析面板:
              方法展开后,大多数有以下两个类别:
              Parent,是调用当前方法的父方法
              Child,是当前方法调用的子方法
          列名 描述
          Name 方法的详细信息,包括包名、类名、对象和参数信息
          Incl Cpu Time Cpu执行该方法及其子方法所花费的时间
          Incl Cpu Time % Cpu执行该方法及其子方法所花费的时间占Cpu总执行时间的百分比
          Excl Cpu Time Cpu执行该方法所花费的时间
          Excl Cpu Time % Cpu执行该方法所花费的时间占Cpu总执行时间的百分比
          Incl Real Time Cpu执行该方法及其子方法所花费的实际时间,从执行该方法到结束一共花了多少时间
          Incl Real Time % Cpu执行该方法及其子方法所花费的实际时间占Cpu总运行时间的百分比
          Excl Real Time Cpu执行该方法所花费的实际时间
          Excl Real Time % Cpu执行该方法所花费的实际时间占Cpu总运行时间的百分比
          Calls+RecurCalls/Total 当前方法的调用次数+递归次数/总次数; 调用次数 + 递归次数 只在当前方法中显示,调用次数 / 总次数 只在当前方法的子展开中显示,Parents 和 Parents while recursive的总和才是总次数,Children和Children while recursive不是当前方法的次数
          Cpu Time/Call Cpu执行该方法的时间和调用次数的百分比,代表该方法消耗Cpu的平均时间
          Real Time/Call Cpu时间执行该方法的时间和调用次数的百分比,代表该方法消耗Cpu的实际平均时间
          Find 栏位通过关键字寻找方法。
          Start Method Profiling
          Stop Method Profiling
      • Stop Process -- 关闭进程
        强制关闭当前进程

      • Screen Capture -- 获取设备界面
        会按照设备的分辨率获取设备上的当前界面到Monitor工具中展示。
        Refresh:  刷新,重新抓取当前页面
        Rotate:    旋转,向左旋转 90度
        Save:      保存,保存当前工具上展示的页面到指定路径
        Copy:      复制,复制后可以粘贴到画图工具里
        Done:      关闭当前工具界面

        Screen Capture
      • Dump View Hierarchy for UI Automator -- UI自动监视View层次
        该功能是调用的Android SDK在API17以后提供的一个重要自动化测试框架UIAutomator的辅助工具UIAutomatorViewer,我们一般单独使用该工具。Monitor中对该工具进行了集成。
        UIAutomatorViewer可以获取当前设备界面上的所用控件元素素,并给出每个控件的属性值。我们在实施自动化时,经常需要利用该工具来确定元素的属性。

        Dump View Hierarchy for UI Automator
      • Capture system wide trace using Android systrace -- 使用Android systrace 获取系统范围跟踪 Google 链接
        Systrace是一个platform-provided工具,用于记录设备在短时间内的活动。 允许在系统级别上收集和检查设备上运行的所有进程的时间信息。将来自Android内核的数据(如CPU调度程序、磁盘活动和应用程序线程)结合起来生成一个HTML报告,帮助确定如何最好地提高应用程序或游戏的性能。该报告突出了它观察到的问题(如在显示动作或动画时的ui jank),并且提供了有关如何修复这些问题的建议。但是,Systrace不会在应用程序进程中收集有关代码执行的信息。有关应用正在执行的方法以及使用多少CPU资源的详细信息使用Android Studio CPU Profiler,你也可以生成trace logs后使用Profiler查看。
            在Android5.0(API级别21)或更高版本的设备上,渲染一个frame的工作被UI Thread和Render Thread拆分。在以前的版本上,创建一个frame的所有工作都是在UI thread上完成的。
            三种使用方式:命令行调用,System Tracing APP,DDMS
            Systrace工具在android sdk工具包中提供,位于android-sdk/platform-tools/systrace/
        启动界面说明:
        Destination File: 生成文件存放哪里;
        Trace duration (seconds): 追踪周期时间
        Trace Buffer Size(kb): 追踪缓冲区大小
        Enable Application Traces from: 选择需要追踪的进程
        Commonly Used Tags: 常用标签     具体内容看图
        Advanced Options: 高级选项     具体内容看图

        报告分析:
        1. 左边呈现是UI Frames的每个进程,选择你要观察的APP,右边是沿时间线指示呈现每个Frame。
        绿色圆表示: 16.6毫秒内渲染完成的Frames。
        黄色或红色圆表示: 渲染时间超过16.6毫秒的Frames。
        2. 单击一个frame 圆将高亮显示它,并提供系统渲染该frame所做的相关信息包括系统在呈现该帧时正在执行的方法(因此可以调查这些导致ui-jank的方法)和Alert。 Alert指出主要问题是在ListView回收和重新绑定中花费太多时间。Alert中有相关事件的链接,这些链接可以更详细地解释系统在这段时间内所做的工作。如图Android System Trace A Frame
        3. 若要查看每个Alert,以及触发每个Alert的次数,请单击窗口右侧的Alerts选项卡,如图Android System Trace Alert 所示。Alerts panel中查看跟踪出现的问题,以及它们对jank的影响频率。将Alerts panel视为要修复的错误列表。通常,一个领域的微小变化或改进可以消除应用中的整个Alerts。
        4. 如果UI Thread做了太多的工作,需要找出哪些方法占用了太多的CPU时间:
        为导致这些瓶颈的方法添加自定义事件,查看这些函数调用次数在Systrace中。
        如果不确定哪些方法会导致UI Thread出现瓶颈,请使用Android Studio Cpu Profiler

        Capture system wide trace using Android systrace
        Android System Trace
        Android System Trace Zoom
        Android System Trace A Frame
        Android System Trace Alert
      • Trace OpenGL calls -- 追踪OpenGL
        待处理

      • Reset adb -- 重启adb

        Reset adb
      • Allocation Tracker -- 跟踪对象的内存分配
        目前最新版已放弃修复Bug,
        可以看下面的链接Allocation Tracker旧版操作链接

      • File Explorer -- 文件管理
        这个功能用于管理设备中的文件可以完成基本文件操作,右上部的几个按钮分别是pull 文件、push 文件、删除文件、添加目录。

        File Explorer
      • Emulator Control --模拟器控制 Google链接
        下面的功能都已经集成到模拟器上,不需要通过DDMS了

        1. Telephony Status 电话状态
          Voice - unregistered, home, roaming, searching, denied
          Data - unregistered, home, roaming, searching, denied 信号状态
          Speed - Full, GSM, HSCSD, GPRS, EDGE, UMTS, HSDPA 网络传输速率
          Latency - None, GPRS, EDGE, UMTS 网络延迟级别

          Voice CALL就是我们打电话的语音通话,Data CALL就是数据通话,如拨号上网和GPRS数据连接不是一个概念。

          Value Description
          unregistered No network available
          home On local network, non-roaming
          roaming On roaming network
          searching Searching networks
          denied Emergency calls only
          off Same as 'unregistered'
          on Same as 'home'

          通过控制台使用命令修改网络延迟,以便在不同的网络环境下测试应用运行:
              emulator -netdelay gprs
              emulator -netdelay 40 100
          当模拟器已经运行起来:
              network delay gprs
          网络延迟级别对照表:

          Value Description Comments
          gprs GPRS (min 150, max 550)
          edge EDGE/EGPRS (min 80, max 400)
          umts UMTS/3G (min 35, max 200)
          none No latency (min 0, max 0)

          通过控制台使用命令修改网络速率,以便在不同的网络环境下测试应用运行:
              emulator -netspeed gsm
              emulator -netspeed 14.4 80
          当模拟器已经运行起来:
              network speed 14.4 80
          网络速率对照表:

          Value Description Comments
          gsm GSM/CSD (Up: 14.4, down: 14.4)
          hscsd HSCSD (Up: 14.4, down: 43.2)
          gprs GPRS (Up: 40.0, down: 80.0)
          edge EDGE/EGPRS (Up: 118.4, down: 236.8)
          umts UMTS/3G (Up: 128.0, down: 1920.0)
          hsdpa HSDPA (Up: 348.0, down: 14400.0)
          full no limit (Up: 0.0, down: 0.0)
        2. Telephony Actions 电话动作
          主要模拟来电和信息
          Incoming number: 来电号码
          Voice: 语音电话
          SMS: 短信
          Call: 拨打
          Hang Up: 挂断
          Send: 发送

        3. Location Controls 位置控制
          Manual(手动 ): Decimal十进制、 Sexagesimal六十进制
          GPX:GPS记录位置的文件
          KML:Google记录地标的文件

          Emulator Control
          Emulator Control SMS
      • Network Statistics -- 网络统计 链接One 链接Two
        这个功能可以用来检测应用的网络流量情况,一般用于检查应用流量消耗过大的模块。另外长时间的重复极短时间网络请求,例如为了保持连接、诊断或状态更新,会导致手机电量消耗过快,可以包装成一次大的网络请求。
        X轴 : 表示RX-下行流量 TX-上行流量。
        Y轴 : 表示传输的传输速度,单位为kb/秒,而X轴表示经过的时间,单位为秒
        Tag : 对不同模块标记不同的tag可以在 图Network Statistics Tag 下面的tag中区分不同模块的流量消耗。
        Apache HttpClient and URLConnection libraries 都支持打tag通过TrafficStats.setThreadStatsTag() 和 TrafficStats.clearThreadStatsTag()。
        sockets 通过 TrafficStats.tagSocket() 和 TrafficStats.untagSocket()。

        public void requestUrl(){
            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    TrafficStats.setThreadStatsTag(0xF00D);
                    try {
                        URL url = new URL("http://write.blog.csdn.net/postlist/0/0/enabled/1");
                        URLConnection urlConnection = url.openConnection();
                        InputStream inputStream = urlConnection.getInputStream();
                        int c ;
                        while ((c = inputStream.read()) > 0) {
                            Log.e("log", String.valueOf(c));
                        }
        
                    } catch (MalformedURLException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    } finally {
                        TrafficStats.clearThreadStatsTag();
                    }
                }
            };
        
            Runnable runnable1 = new Runnable() {
                @Override
                public void run() {
                    TrafficStats.setThreadStatsTag(0xF00F);
                    try {
                        URL url = new URL("http://write.blog.csdn.net/postlist/0/0/enabled/1");
                        URLConnection urlConnection = url.openConnection();
                        InputStream inputStream = urlConnection.getInputStream();
                        int c ;
                        while ((c = inputStream.read()) > 0) {
                            Log.e("log", String.valueOf(c));
                        }
        
                    } catch (MalformedURLException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    } finally {
                        TrafficStats.clearThreadStatsTag();
                    }
                }
            };
        
            new Thread(runnable).start();
            new Thread(runnable1).start();
        }
        
        Network Statistics
        Network Statistics Tag
      • System Information -- 系统信息
        可以用用来对CPU、Memory和Frame进行抓取,System Information抓取的是整个系统的瞬间信息,可以用Update from Device 来更新。
        Frame Render Time 要选中对应APP进程,点击Update from Device,但是没有数据显示

        System Information
      • Logcat
        在Monitor工具的底部是监测系统日志的Logcat模块,在这里可以通过日志跟踪系统正在发生什么,在我们开发、测试过程中,经常需要通过Log来确定应用执行的流向和状态

        1. 中间是Search 框,可以输入筛选内容。
          verbose所在下拉框是Log级别,不同级别的log会显示不同的颜色
          四个按钮:导出所选条目到文本文件、清除log、是否显示Save Filters栏位、log滚到最底部
          列名 描述
          列名 描述
          verbose 显示所有信息
          debug 显示调试及以上级别信息
          info 显示普通及以上级别信息
          warn 显示警告及以上级别信息
          error 显示错误信息
          assert 静默,不显示任何信息
        Logcat
        1. Saved Filters
          可以进行logcat 的log 筛选。
          三个按钮:添加、删除、修改
          列名 描述
          Filter Name Filter 栏位显示名称
          by Log Tag 通过 Log的Tag
          by Log Message 通过 Log的Message
          by PID 通过进程ID
          by Application Name 通过gradle中applicationId
          by Log Level 通过Logcat级别
          Create Filter
        2. Logcat显示界面中几个字段栏位的含义
          列名 描述
          level log的级别
          time log发生的时间
          PID 当前的进程ID
          TID 当前的线程ID
          Application 应用包名
          Tag log的tag标签
          text log描述

    相关文章

      网友评论

          本文标题:Monitor--DDMS

          本文链接:https://www.haomeiwen.com/subject/sbgenqtx.html