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)系類(lèi)圖

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

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

            此時(shí)目錄下生成類(lèi)圖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è)為可寫(xiě)

            $ 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 閱讀(2284) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Android
          主站蜘蛛池模板: 体育| 吉林省| 郸城县| 诏安县| 望都县| 巴中市| 德化县| 光山县| 土默特右旗| 荃湾区| 桃园县| 容城县| 新河县| 祁门县| 汤阴县| 马龙县| 武定县| 牙克石市| 定兴县| 青神县| 绵阳市| 晋江市| 江城| 德钦县| 绥滨县| 屏东县| 洞头县| 台南县| 池州市| 沙田区| 旌德县| 镇雄县| 法库县| 济源市| 永寿县| 两当县| 城固县| 阿克陶县| 北票市| 朝阳市| 霍州市|