<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Calvin's Tech Space

    成于堅(jiān)忍,毀于浮躁

       :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理

    1.TraceView
    1)功能:用于熱點(diǎn)分析和性能優(yōu)化,分析每個(gè)函數(shù)占用的CPU時(shí)間,調(diào)用次數(shù),函數(shù)調(diào)用關(guān)系等

     2)方法:

      a)在程序代碼中加入追蹤開(kāi)關(guān)

      import android.os.Debug;

      ……

      android.os.Debug.startMethodTracing(“/data/tmp/test”);// 先建/data/tmp目錄

      ……// 被追蹤的程序段

      android.os.Debug.stopMethodTracing();

      b)編譯,運(yùn)行后,設(shè)備端生成/data/tmp/test.trace文件

      c)把trace文件復(fù)制到PC端

      $ adb pull /data/tmp/test.trace ./

      d)使用android自帶工具分析trace文件

      $ANDROID_SRC/out/host/linux-x86/bin/traceview test.trace

      此時(shí)可看到各個(gè)函數(shù)被調(diào)用的次數(shù)CPU占用率等信息

      e)使用android自帶工具分析生成調(diào)用關(guān)系類圖

      $ apt-get install graphviz# 安裝圖片相關(guān)軟件

      $ANDROID_SRC/out/host/linux-x86/bin/dmtracedump -g test.png test.trace

      此時(shí)目錄下生成類圖test.png

     3)注意

      trace文件生成與libdvm模塊DEBUG版本相沖突,所以此方法只適用于對(duì)非DEBUG版本模擬器的調(diào)試,否則在分析trace文件時(shí)會(huì)報(bào)錯(cuò)


    2.HProf (Heap Profile)

     1)功能:

      用于java層面的內(nèi)存分析,顯示詳細(xì)的內(nèi)存占用信息,指出可疑的內(nèi)存泄漏對(duì)象

     2)方法:

      a)在代碼中加入dump動(dòng)作

      import android.os.Debug;

      import java.io.IOException;

      ……

      try {

      android.os.Debug.dumpHprofData(“/data/tmp/input.hprof”); // 先建/data/tmp目錄

      } catch (IOException ioe) {

      }

      b)把hprof文件復(fù)制到PC端

      $ adb pull /data/tmp/input.hprof ./

      c)使用命令hprof-conv把hprof轉(zhuǎn)成MAT識(shí)別的標(biāo)準(zhǔn)的hprof

      $ $ANDROID_SRC/out/host/linux-x86/bin/hprof-conv input.hprof output.hprof

      d)使用MAT工具看hprof信息

      下載MAT工具:http://www.eclipse.org/mat/downloads.php

      用工具打開(kāi)output.hprof

     3)注意:此工具只能顯示java層面的,而不能顯示C層的內(nèi)存占用信息


    3.SamplingProfile (android 2.0上版本使用)

     1)功能

      每隔N毫秒對(duì)當(dāng)前正在運(yùn)行的函數(shù)取樣,并輸出到log中

     2)在代碼中加入取樣設(shè)定

      import dalvik.system.SamplingProfiler

      ……

      SamplingProfile sp = SamplingProfiler.getInstance();

      sp.start(n);// n為設(shè)定每秒采樣次數(shù)

      sp.logSnapshot(sp.snapshot());

      ……

      sp.shutDown();

      它會(huì)啟一個(gè)線程監(jiān)測(cè),在logcat中打印信息


    4.用發(fā)系統(tǒng)信號(hào)的方式取當(dāng)前堆棧情況和內(nèi)存信息

     1)原理

      dalvik虛擬機(jī)對(duì)SIGQUIT和SIGUSR1信號(hào)進(jìn)行處理(dalvik/vm/SignalCatcher.c),分別完成取當(dāng)前堆棧和取當(dāng)前內(nèi)存情況的功能

     2)用法

      a)$ chmod 777 /data/anr -R# 把a(bǔ)nr目錄權(quán)限設(shè)為可寫

      $ rm /data/anr/traces.txt# 刪除之前的trace信息

      $ ps # 找到進(jìn)程號(hào)

      $ kill -3 進(jìn)程號(hào) # 發(fā)送SIGQUIT信號(hào)給該進(jìn)程,此時(shí)生成trace信息

      $ cat /data/anr/traces.txt

      功能實(shí)現(xiàn):遍歷thread list(dalvik/vm/Thread.c:dvmDumpAllThreadEx()),并打印當(dāng)前函數(shù)調(diào)用關(guān)系(dalvik/vm/interp/Stack.c:dumpFrames())

      b)$ chmod 777 /data/misc -R

      $ ps # 找到進(jìn)程號(hào)

      $ kill -10 進(jìn)程號(hào) # 發(fā)送SIGQUIT信事信號(hào)給該進(jìn)程,此時(shí)生成hprof信息

      $ ls /data/misc/*.hprof

      此時(shí)生成hprf文件,如何使用此文件,見(jiàn)第二部分(HProf)

      注意:hprof文件都很大,注意用完馬上刪除,以免占滿存儲(chǔ)器


    5.logcat及原理

     1)android.util.Log利用println的標(biāo)準(zhǔn)java輸出詞句,并加前綴I/V/D….

     2)dalvik利用管道加線程的方式,先利用dup2把stdout和stderr重定向到管理中(vm/StdioConverter.c:dvmstdioConverterStartup),然后再啟動(dòng)一個(gè)線程從管道另一端讀出內(nèi)容(dalvik/vm/StdioConverter.c:stdioconverterThreadSt art()),使用LOG公共工具(system/core/liblog/logd_write.c: __android_log_print())輸出到/dev/log/*中去

     3)logcat通過(guò)加不同參數(shù)看/dev/log/下的不同輸入信息

      # logcat -b main顯示主緩沖區(qū)中的信息

      # logcat -b radio顯示無(wú)線緩沖區(qū)中的信息

      # logcat -b events顯示事件緩沖區(qū)中的信息


    6.jdwp(java debug wire protocol)及原理

     1)虛擬機(jī)(設(shè)備端)在啟動(dòng)時(shí)加載了Agent JDWP 從而具備了調(diào)試功能。在調(diào)試器端(PC端)通過(guò)JDWP協(xié)議與設(shè)備連接,通過(guò)發(fā)送命令來(lái)獲取的狀態(tài)和控制Java程序的執(zhí)行。JDWP 是通過(guò)命令(command)和回復(fù)(reply)進(jìn)行通信的。

     2)JDK 中調(diào)試工具 jdb 就是一個(gè)調(diào)試器,DDMS也提供調(diào)試器與設(shè)備相連。

     3)dalvik為JDWP提供了兩種連接方式:tcp方式和adb方式,tcp方式可以手工指定端口,adb方式自動(dòng)設(shè)定為8700端口,通常使用DDMS調(diào)試就是通過(guò)adb方式


    7.monkey

     1)monkey是一個(gè)android自帶的命令行工具。它向系統(tǒng)發(fā)送偽隨機(jī)的用戶事件流,實(shí)現(xiàn)對(duì)正在開(kāi)發(fā)的應(yīng)用程序進(jìn)行壓力測(cè)試。

     2)方法

      在設(shè)備端打開(kāi)setting界面

      $ adb shell 
       # monkey -p com.android.settings -v 500

      此時(shí)可以看到界面不斷被切換


    8.其它小工具

     具體見(jiàn)android.os.Debug中提供的工具

     1)取毫微秒級(jí)的時(shí)間,用于計(jì)算時(shí)間

      threadCpuTimeNanos()

     2)統(tǒng)計(jì)兩點(diǎn)間的內(nèi)存分配情況

      startAllocCounting()

      stopAllocCounting()

      getGlobalAllocCount()

      get…..

     3)打印當(dāng)前已load的class

      getLoadedClassCount()

      printLoadedClasses()它需要打開(kāi)NDEBUG功能才能打開(kāi)system/core/中Log功能


    9.打印debug信息

      $ adb bugreport

    轉(zhuǎn)自:http://hi.baidu.com/donghaozheng/blog/item/72943b2a187ef3355343c191.html

    posted on 2010-10-02 22:44 calvin 閱讀(2276) 評(píng)論(0)  編輯  收藏 所屬分類: Android
    主站蜘蛛池模板: 亚洲精品国产精品乱码不卞| 亚洲天堂中文资源| 中文字幕一区二区免费| 亚洲综合综合在线| 免费爱爱的视频太爽了| 和老外3p爽粗大免费视频| 久久久久亚洲AV无码麻豆| 成在线人永久免费视频播放| 东方aⅴ免费观看久久av | 国产小视频免费观看| 中文字幕免费人成乱码中国| 亚洲国产精品日韩在线| 国产亚洲情侣一区二区无| 噼里啪啦电影在线观看免费高清 | 亚洲欧洲免费无码| 国产亚洲精品成人a v小说| 91麻豆最新在线人成免费观看| 色哟哟国产精品免费观看| 蜜芽亚洲av无码精品色午夜| 亚洲av麻豆aⅴ无码电影| 国产精品色拉拉免费看| a级毛片毛片免费观看久潮| 亚洲av无码专区在线观看下载| 亚洲AV人人澡人人爽人人夜夜| 亚洲A∨精品一区二区三区| 无码国产精品一区二区免费| 中文在线免费不卡视频| 精品无码专区亚洲| 亚洲乱码中文字幕小综合| 亚洲成a人片在线观看日本| mm1313亚洲精品国产| 老司机永久免费网站在线观看| 久久精品无码专区免费东京热| 东北美女野外bbwbbw免费| 黑人粗长大战亚洲女2021国产精品成人免费视频 | 亚洲日本在线播放| 亚洲精品自产拍在线观看| 亚洲av无码乱码在线观看野外| AV片在线观看免费| 99久久久国产精品免费无卡顿 | 亚洲国模精品一区|