android性能分析工具
⑴ 如何提升Android應用的性能
1. 利用SDK來優化應用的java代碼的技巧;
2. 通過高效使用內存來提升性能的技巧;
3. 使用多線程的時機及技巧;
4. 盡量使用RelativeLayout相對布局
5. 盡量減少布局層次
⑵ 如何實現一個android的log自動化分析工具
首先,讓我們看一看AndroidLog的格式。下面這段log是以所謂的long格式列印出來的。從前面Logcat的介紹中可以知道,long格式會把時間,標簽等作為單獨的一行顯示。
[ 12-09 21:39:35.510 396: 416 I/ActivityManager ]
Start procnet.coollet.infzmreader:umengService_v1 for service
net.coollet.infzmreader/com.umeng.message.
UmengService:pid=21745 uid=10039 gids={50039, 3003, 1015,1028}
[ 12-09 21:39:35.518 21745:21745I/dalvikvm ]
Turning on JNI app bug workarounds fortarget SDK version 8...
[ 12-09 21:39:35.611 21745:21745D/AgooService ]
onCreate()
我們以第一行為例:12-09 是日期,21:39:35.510是時間396是進程號,416是線程號;I代表log優先順序,ActivityManager是log標簽。
在應用開發中,這些信息的作用可能不是很大。但是在系統開發中,這些都是很重要的輔助信息。開發工程師分析的log很多都是由測試工程師抓取的,所以可能有些log根本就不是當時出錯的log。如果出現這種情況,無論你怎麼分析都不太可能得出正確的結論。如何能最大限度的避免這種情況呢?筆者就要求測試工程師報bug時必須填上bug發生的時間。這樣結合log里的時間戳信息就能大致判斷是否是發生錯誤時的log。而且根據測試工程師提供的bug發生時間點,開發工程師可以在長長的log信息中快速的定位錯誤的位置,縮小分析的范圍。
同時我們也要注意,時間信息在log分析中可能被錯誤的使用。例如:在分析多線程相關的問題時,我們有時需要根據兩段不同線程中log語句執行的先後順序來判斷錯誤發生的原因,但是我們不能以兩段log在log文件中出現的先後做為判斷的條件,這是因為在小段時間內兩個線程輸出log的先後是隨機的,log列印的先後順序並不完全等同於執行的順序。那麼我們是否能以log的時間戳來判斷呢?同樣是不可以,因為這個時間戳實際上是系統列印輸出log時的時間,並不是調用log函數時的時間。遇到這種情況唯一的辦法是在輸出log前,調用系統時間函數獲取當時時間,然後再通過log信息列印輸出。這樣雖然麻煩一點,但是只有這樣取得的時間才是可靠的,才能做為我們判斷的依據。
另外一種誤用log中時間戳的情況是用它來分析程序的性能。一個有多年工作經驗的工程師拿著他的性能分析結果給筆者看,但是筆者對這份和實際情況相差很遠的報告表示懷疑,於是詢問這位工程師是如何得出結論的。他的回答讓筆者很驚訝,他計算所採用的數據就是log信息前面的時間戳。前面我們已經講過,log前面時間戳和調用log函數的時間並不相同,這是由於系統緩沖log信息引起的,而且這兩個時間的時間差並不固定。所以用log信息前附帶的時間戳來計算兩段log間代碼的性能會有比較大的誤差。正確的方法還是上面提到的:在程序中獲取系統時間然後列印輸出,利用我們列印的時間來計算所花費的時間。
了解了時間,我們再談談進程Id和線程Id,它們也是分析log時很重要的依據。我們看到的log文件,不同進程的log信息實際上是混雜在一起輸出的,這給我們分析log帶來了很大的麻煩。有時即使是一個函數內的兩條相鄰的log,也會出現不同進程的log交替輸出的情況,也就是A進程的第一條log後面跟著的是B進程的第二條log,對於這樣的組合如果不細心分析,就很容易得出錯誤的結論。這時一定要仔細看log前面的進程Id,把相同Id的log放到一起看。
不同進程的log有這樣的問題,不同的線程輸出的log當然也存在著相同的問題。Logcat加上-vthread就能列印出線程Id。但是有一點也要引起注意,就是Android的線程Id和我們平時所講的linux線程Id並不完全等同。首先,在Android系統中,C++層使用的Linux獲取線程Id的函數gettid()是不能得到線程Id的,調用gettid()實際上返回的是進程Id。作為替代,我們可以調用pthread_self()得到一個唯一的值來標示當前的native線程。Android也提供了一個函數androidGetThreaId()來獲取線程Id,這個函數實際上就是在調用pthread_self函數。但是在Java層線程Id又是另外一個值,Java層的線程Id是通過調用Thread的getId方法得到的,這個方法的返回值實際上來自Android在每個進程的java層中維護的一個全局變數,所以這個值和C++層所獲得的值並不相同。這也是我們分析log時要注意的問題,如果是Java層線程Id,一般值會比較小,幾百左右;如果是C++層的線程,值會比較大。在前裡面的log樣本中,就能很容易的看出,第一條log是Jave層輸出的log,第二條是native層輸出的。明白了這些,我們在分析log時就不要看見兩段log前面的線程Id不相同就得出是兩個不同線程log的簡單結論,還要注意Jave層和native層的區別,這樣才能防止被誤導。
AndroidLog的優先順序在列印輸出時會被轉換成V,I,D,W,E等簡單的字元標記。在做系統log分析時,我們很難把一個log文件從頭看到尾,都是利用搜索工具來查找出錯的標記。比如搜索「E/」來看看有沒有指示錯誤的log。所以如果參與系統開發的每個工程師都能遵守Android定義的優先順序含義來輸出log,這會讓我們繁重的log分析工作變得相對輕鬆些。
Android比較常見的嚴重問題有兩大類,一是程序發生崩潰;二是產生了ANR。程序崩潰和ANR既可能發生在java層,也可能發生在native層。如果問題發生在java層,出錯的原因一般比較容易定位。如果是native層的問題,在很多情況下,解決問題就不是那麼的容易了。我們先看一個java層的崩潰例子:
I/ActivityManager( 396): Start proccom.test.crash for activity com.test.crash/.MainActivity:
pid=1760 uid=10065 gids={50065, 1028}
D/AndroidRuntime( 1760): Shutting downVM
W/dalvikvm( 1760): threadid=1: threadexiting with uncaught exception(group=0x40c38930)
E/AndroidRuntime( 1760): FATALEXCEPTION: main
E/AndroidRuntime( 1760):java.lang.RuntimeException: Unable to start activityComponentInfo
{com.test.crash/com.test.crash.MainActivity}:java.lang.NullPointerException
E/AndroidRuntime( 1760): atandroid.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
E/AndroidRuntime( 1760): atandroid.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
E/AndroidRuntime( 1760): atandroid.app.ActivityThread.access$600(ActivityThread.java:141)
E/AndroidRuntime( 1760): atandroid.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
E/AndroidRuntime( 1760): atandroid.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 1760): atandroid.os.Looper.loop(Looper.java:137)
E/AndroidRuntime( 1760): atandroid.app.ActivityThread.main(ActivityThread.java:5050)
E/AndroidRuntime( 1760): atjava.lang.reflect.Method.invokeNative(NativeMethod)
E/AndroidRuntime( 1760): atjava.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime( 1760): atcom.android.internal.os.ZygoteInit$MethodAndArgsCaller.run
(ZygoteInit.java:793)
E/AndroidRuntime( 1760): atcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
E/AndroidRuntime( 1760): atdalvik.system.NativeStart.main(NativeMethod)
E/AndroidRuntime( 1760): Caused by:java.lang.NullPointerException
E/AndroidRuntime( 1760): atcom.test.crash.MainActivity.setViewText(MainActivity.java:29)
E/AndroidRuntime( 1760): atcom.test.crash.MainActivity.onCreate(MainActivity.java:17)
E/AndroidRuntime( 1760): atandroid.app.Activity.performCreate(Activity.java:5104)
E/AndroidRuntime( 1760): atandroid.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
E/AndroidRuntime( 1760): atandroid.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
E/AndroidRuntime( 1760): ... 11more
I/Process ( 1760): Sending signal.PID: 1760 SIG: 9
W/ActivityManager( 396): Force finishing activitycom.test.crash/.MainActivity
Jave層的代碼發生crash問題時,系統往往會列印出很詳細的出錯信息。比如上面這個例子,不但給出了出錯的原因,還有出錯的文件和行數。根據這些信息,我們會很容易的定位問題所在。native層的crash雖然也有棧log信息輸出,但是就不那麼容易看懂了。下面我們再看一個native層crash的例子:
F/libc ( 2102): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread2102 (testapp)
D/dalvikvm(26630):GC_FOR_ALLOC freed 604K, 11% free 11980K/13368K, paused 36ms, total36ms
I/dalvikvm-heap(26630):Grow heap (frag case) to 11.831MB for 102416-byteallocation
D/dalvikvm(26630):GC_FOR_ALLOC freed 1K, 11% free 12078K/13472K, paused 34ms, total34ms
I/DEBUG ( 127):*** *** *** *** *** *** *** *** *** *** *** *** *** *** ******
I/DEBUG ( 127):Build fingerprint:
'Android/full_maguro/maguro:4.2.2/JDQ39/eng.liuchao.20130619.201255:userdebug/test-keys'
I/DEBUG ( 127):Revision: '9'
I/DEBUG ( 127):pid: 2102, tid: 2102, name: testapp >>>./testapp <<<
I/DEBUG ( 127):signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr00000000
I/DEBUG ( 127): r0 00000020 r173696874 r2 400ff520 r300000000
I/DEBUG ( 127): r4 400ff469 r5beb4ab24 r6 00000001 r7beb4ab2c
I/DEBUG ( 127): r8 00000000 r900000000 sl 00000000 fpbeb4ab1c
I/DEBUG ( 127): ip 4009b5dc spbeb4aae8 lr 400ff46f pc400ff45e cpsr 60000030
I/DEBUG ( 127): d0 000000004108dae8 d1 4108ced84108cec8
I/DEBUG ( 127): d2 4108cef84108cee8 d3 4108cf184108cf08
I/DEBUG ( 127): d4 4108c5a84108c598 d5 4108ca084108c5b8
I/DEBUG ( 127): d6 4108ce684108ce58 d7 4108ce884108ce78
I/DEBUG ( 127): d8 0000000000000000 d9 0000000000000000
I/DEBUG ( 127): d10 0000000000000000 d110000000000000000
I/DEBUG ( 127): d120000000000000000 d130000000000000000
I/DEBUG ( 127): d14 0000000000000000 d150000000000000000
I/DEBUG ( 127): d16 c1dcf7c087fec8b4 d173f50624dd2f1a9fc
I/DEBUG ( 127): d18 41c7b1ac89800000 d190000000000000000
I/DEBUG ( 127): d20 0000000000000000 d210000000000000000
I/DEBUG ( 127): d22 0000000000000000 d230000000000000000
I/DEBUG ( 127): d24 0000000000000000 d250000000000000000
I/DEBUG ( 127): d26 0000000000000000 d270000000000000000
I/DEBUG ( 127): d28 0000000000000000 d290000000000000000
I/DEBUG ( 127): d30 0000000000000000 d310000000000000000
I/DEBUG ( 127): scr 00000010
I/DEBUG ( 127):
I/DEBUG ( 127):backtrace:
I/DEBUG ( 127): #00 pc0000045e /system/bin/testapp
I/DEBUG ( 127): #01 pc0000046b /system/bin/testapp
I/DEBUG ( 127): #02 pc0001271f /system/lib/libc.so (__libc_init+38)
I/DEBUG ( 127): #03 pc00000400 /system/bin/testapp
I/DEBUG ( 127):
I/DEBUG ( 127):stack:
I/DEBUG ( 127): beb4aaa8 000000c8
I/DEBUG ( 127): beb4aaac 00000000
I/DEBUG ( 127): beb4aab0 00000000
I/DEBUG ( 127): beb4aab4 401cbee0 /system/bin/linker
I/DEBUG ( 127): beb4aab8 00001000
I/DEBUG ( 127): beb4aabc 4020191d /system/lib/libc.so (__libc_fini)
I/DEBUG ( 127): beb4aac0 4020191d /system/lib/libc.so (__libc_fini)
I/DEBUG ( 127): beb4aac4 40100eac /system/bin/testapp
I/DEBUG ( 127): beb4aac8 00000000
I/DEBUG ( 127): beb4aacc 400ff469 /system/bin/testapp
I/DEBUG ( 127): beb4aad0 beb4ab24 [stack]
I/DEBUG ( 127): beb4aad4 00000001
I/DEBUG ( 127): beb4aad8 beb4ab2c [stack]
I/DEBUG ( 127): beb4aadc 00000000
I/DEBUG ( 127): beb4aae0 df0027ad
I/DEBUG ( 127): beb4aae4 00000000
I/DEBUG ( 127): #00 beb4aae8 00000000
I/DEBUG ( 127): ........ ........
I/DEBUG ( 127): #01 beb4aae8 00000000
I/DEBUG ( 127): beb4aaec 401e9721 /system/lib/libc.so (__libc_init+40)
I/DEBUG ( 127): #02 beb4aaf0 beb4ab08 [stack]
I/DEBUG ( 127): beb4aaf4 00000000
I/DEBUG ( 127): beb4aaf8 00000000
I/DEBUG ( 127): beb4aafc 00000000
I/DEBUG ( 127): beb4ab00 00000000
I/DEBUG ( 127): beb4ab04 400ff404 /system/bin/testapp
I/DEBUG ( 127):
這個log就不那麼容易懂了,但是還是能從中看出很多信息,讓我們一起來學習如何分析這種log。首先看下面這行:
pid: 2102, tid: 2102,name: testapp >>>./testapp <<<
從這一行我們可以知道crash進程的pid和tid,前文我們已經提到過,Android調用gettid函數得到的實際是進程Id號,所以這里的pid和tid相同。知道進程號後我們可以往前翻翻log,看看該進程最後一次列印的log是什麼,這樣能縮小一點范圍。
接下來內容是進程名和啟動參數。再接下來的一行比較重要了,它告訴了我們從系統角度看,出錯的原因:
signal 11 (SIGSEGV), code 1(SEGV_MAPERR), fault addr 00000000
signal11是Linux定義的信號之一,含義是Invalidmemory reference,無效的內存引用。加上後面的「faultaddr 00000000」我們基本可以判定這是一個空指針導致的crash。當然這是筆者為了講解而特地製造的一個Crash的例子,比較容易判斷,大部分實際的例子可能就沒有那麼容易了。
再接下來的log列印出了cpu的所有寄存器的信息和堆棧的信息,這裡面最重要的是從堆棧中得到的backtrace信息:
I/DEBUG ( 127):backtrace:
I/DEBUG ( 127): #00 pc0000045e /system/bin/testapp
I/DEBUG ( 127): #01 pc0000046b /system/bin/testapp
I/DEBUG ( 127): #02 pc0001271f /system/lib/libc.so (__libc_init+38)
I/DEBUG ( 127): #03 pc00000400 /system/bin/testapp
因為實際的運行系統里沒有符號信息,所以列印出的log里看不出文件名和行數。這就需要我們藉助編譯時留下的符號信息表來翻譯了。Android提供了一個工具可以來做這種翻譯工作:arm-eabi-addr2line,位於prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin目錄下。用法很簡單:
#./arm-eabi-addr2line -f -eout/target/proct/hammerhead/symbols/system/bin/testapp0x0000045e
參數-f表示列印函數名;參數-e表示帶符號表的模塊路徑;最後是要轉換的地址。這條命令在筆者的編譯環境中得到的結果是:
memcpy /home/rd/compile/android-4.4_r1.2/bionic/libc/include/string.h:108
剩餘三個地址翻譯如下:
main /home/rd/compile/android-4.4_r1.2/packages/apps/testapp/app_main.cpp:38
out_vformat /home/rd/compile/android-4.4_r1.2/bionic/libc/bionic/libc_logging.cpp:361
_start libgcc2.c:0
利用這些信息我們很快就能定位問題了。不過這樣手動一條一條的翻譯比較麻煩,筆者使用的是從網上找到的一個腳本,可以一次翻譯所有的行,有需要的讀者可以在網上找一找。
了解了如何分析普通的Log文件,下面讓我們再看看如何分析ANR的Log文件。
⑶ android studio有哪些性能分析工具
導言:
Android應用在CPU佔用,內存消耗方面的性能指標是影響產品質量的重要因素,由於QQ管家,360手機助手等應用都提供直觀的內存消耗,流量監控功能,致使用戶比以往更加關注軟體的性能,並以此進行軟體選用的決策。
目前,已經有很多可以監控android app 性能的工具可以供開發人員使用,如:基於Eclipse插件體系的MAT,其通過生成.hprof文件對內存泄露情況進行排查;內存檢測工具APT:提供CPU利用率實時曲線圖,方便對比測試內存泄露問題[圖0-1]
⑷ 常見的大數據分析工具有哪些
大數據分析的前瞻性使得很多公司以及企業都開始使用大數據分析對公司的決策做出幫助,而大數據分析是去分析海量的數據,所以就不得不藉助一些工具去分析大數據,。一般來說,數據分析工作中都是有很多層次的,這些層次分別是數據存儲層、數據報表層、數據分析層、數據展現層。對於不同的層次是有不同的工具進行工作的。下面小編就對大數據分析工具給大家好好介紹一下。
首先我們從數據存儲來講數據分析的工具。我們在分析數據的時候首先需要存儲數據,數據的存儲是一個非常重要的事情,如果懂得資料庫技術,並且能夠操作好資料庫技術,這就能夠提高數據分析的效率。而數據存儲的工具主要是以下的工具。
1、MySQL資料庫,這個對於部門級或者互聯網的資料庫應用是必要的,這個時候關鍵掌握資料庫的庫結構和SQL語言的數據查詢能力。
2、SQL Server的最新版本,對中小企業,一些大型企業也可以採用SQL Server資料庫,其實這個時候本身除了數據存儲,也包括了數據報表和數據分析了,甚至數據挖掘工具都在其中了。
3、DB2,Oracle資料庫都是大型資料庫了,主要是企業級,特別是大型企業或者對數據海量存儲需求的就是必須的了,一般大型資料庫公司都提供非常好的數據整合應用平台;
接著說數據報表層。一般來說,當企業存儲了數據後,首先要解決報表的問題。解決報表的問題才能夠正確的分析好資料庫。關於數據報表所用到的數據分析工具就是以下的工具。
1、Crystal Report水晶報表,Bill報表,這都是全球最流行的報表工具,非常規范的報表設計思想,早期商業智能其實大部分人的理解就是報表系統,不藉助IT技術人員就可以獲取企業各種信息——報表。
2、Tableau軟體,這個軟體是近年來非常棒的一個軟體,當然它已經不是單純的數據報表軟體了,而是更為可視化的數據分析軟體,因為很多人經常用它來從資料庫中進行報表和可視化分析。
第三說的是數據分析層。這個層其實有很多分析工具,當然我們最常用的就是Excel,我經常用的就是統計分析和數據挖掘工具;
1、Excel軟體,首先版本越高越好用這是肯定的;當然對Excel來講很多人只是掌握了5%Excel功能,Excel功能非常強大,甚至可以完成所有的統計分析工作!但是我也常說,有能力把Excel玩成統計工具不如專門學會統計軟體;
2、SPSS軟體:當前版本是18,名字也改成了PASW Statistics;我從3.0開始Dos環境下編程分析,到現在版本的變遷也可以看出SPSS社會科學統計軟體包的變化,從重視醫學、化學等開始越來越重視商業分析,現在已經成為了預測分析軟體。
最後說表現層的軟體。一般來說表現層的軟體都是很實用的工具。表現層的軟體就是下面提到的內容。
1、PowerPoint軟體:大部分人都是用PPT寫報告。
2、Visio、SmartDraw軟體:這些都是非常好用的流程圖、營銷圖表、地圖等,而且從這里可以得到很多零件;
3、Swiff Chart軟體:製作圖表的軟體,生成的是Flash
⑸ Android studio如何分析內存泄漏,是否有自帶的分析工具
Android studio是沒有自帶這個工具的,不能分析內存泄露。需要用已經ROOT過的真機來獲取APP運行過程中的內存信息,這需要獲取該手機的最高許可權。如果沒有這樣的手機,或者沒有相應的機型,可以去testbird上面試試雲手機吧,上面的手機都是開放最高許可權的,而且機型很全。
⑹ 怎麼樣進行Android應用的性能分析
對於手機應用性能可以從兩方面關注:
1.app產品做好之後必須從每個控制項在國內不同的手機品牌和不同系統版本進行兼容性測試,業內也叫遍歷測試,所謂的遍歷測試是可以移動識別應用的控制項從而進行多層次的運行測試,當中包含了安裝測試,啟動測試,控制項遍歷測試,最後是卸載測試!
2.兼容性測試,也就是適配測試完成之後需要開始對網路性能進行測試,這里大概有幾個方面需要進行的:網路性能測試,元素載入性能測試,網路可用性測試等等!
國內現有的測試周期和測試手段都是通過人工化測試,真正實現自動化又節省時間與人力的只有藉助第三方應用性能管理提供商才可以實現!
⑺ android上app應用的壓力測試用什麼工具好
Android App漏洞測試工具:Safe.ijiami
Safe.ijiami四大特色
1. 文件檢查
檢查dex、res文件是否存在源代碼、資源文件被竊取、替換等安全問題。
2. 漏洞掃描
掃描簽名、XML文件是否存在安全漏洞、存在被注入、嵌入代碼等風險。
3. 後門檢測
檢測App是否存在被二次打包,然後植入後門程序或第三方代碼等風險。
4. 一鍵生成
一鍵生成App關於源碼、文件、許可權、關鍵字等方面的安全風險分析報告。
國內首家自動化App安全檢測平台,只需一鍵上傳APK就可完成安全漏洞檢測,檢測結果清晰、詳細、全面,並可一鍵生成報告,極大的提高了開發者的開發效率,有效幫助開發者了解App安全狀況,提高App安全性。
Android App性能測試工具:iTest
iTest產品特色
1、 功能強大:iTest獨有的自動控制技術,讓您輕松完成手機應用的自動測試。
2、 操作簡單:只需用滑鼠操作,點擊或拖動屏幕,即可錄制功能復雜的腳本。
3、 無限次運行:設定運行次數之後,iTest即可幫您自動運行腳本,只要您願意,運行上億次也沒問題。
4、 腳本共享:您在iTest上錄制的腳本,無需任何改動,即可在另一台連接iTest的手機上運行,只要它們擁有相同的解析度。
⑻ 性能測試有那些免費工具
Grinder:Grinder是一個開源的JVM負載測試框架,它通過很多負載注射器來為分布式測試提供了便利。支持用於執行測試腳本的Jython腳本引擎HTTP測試可通過HTTP代理進行管理。根據項目網站的說法,Grinder的主要目標用戶是「理解他們所測代碼的人——Grinder不僅僅是帶有一組相關響應時間的『黑盒』測試。由於測試過程可以進行編碼——而不是簡單地腳本化,所以程序員能測試應用中內部的各個層次,而不僅僅是通過用戶界面測試響應時間。
Pylot:Pylot是一款開源的測試Webservice性能和擴展性的工具,它運行HTTP負載測試,這對容量計劃,確定基準點,分析以及系統調優都很有用處。Pylot產生並發負載(HTTPRequests),檢驗伺服器響應,以及產生帶有metrics的報表。通過GUI或者shell/console來執行和監視testsuites。
Web Capacity Analysis Tool(WCAT):這是一種輕量級負載生成實用工具,不僅能夠重現對Web伺服器(或負載平衡伺服器場)的腳本HTTP請求,同時還可以收集性能統計數據供日後分析之用。WCAT是多線程應用程序,並且支持從單個源控制多個負載測試客戶端,因此您可以模擬數千個並發用戶。該實用工具利用您的舊機器作為測試客戶端,其中每個測試客戶端又可以產生多個虛擬客戶端(最大數量取決於客戶端機器的網路適配器和其他硬體)。
fwptt:fwptt也是一個用來進行Web應用負載測試的工具。它可以記錄一般的請求,也可以記錄Ajax請求。它可以用來測試ASP.NET,JSP,PHP或是其它的Web應用。
JCrawler:JCrawler是一個開源(CPL)的Web應用壓力測試工具。通過其名字,你就可以知道這是一個用Java寫的像網頁爬蟲一樣的工具。只要你給其幾個URL,它就可以開始爬過去了,它用一種特殊的方式來產生你Web應用的負載。這個工具可以用來測試搜索引擎對你站點產生的負載。當然,其還有另一功能,你可以建立你的網站地圖和再點擊一下,將自動提交Sitemap給前5名的搜索引擎!
⑼ android性能測試工具有哪些
大概有如下幾個工具:
android針對上面這些會影響到應用性能的情況提供了一些列的工具:
1 布局復雜度:
hierarchyviewer:檢測布局復雜度,各視圖的布局耗時情況:
Android開發者模式—GPU過渡繪制:
2 耗電量:Android開發者模式中的電量統計;
3 內存:
應用運行時內存使用情況查看:Android Studio—Memory/CPU/GPU;
內存泄露檢測工具:DDMS—MAT;
4 網路:Android Studio—NetWork;
5 程序執行效率:
靜態代碼檢查工具:Android studio—Analyze—Inspect Code.../Code cleanup... ,用於檢測代碼中潛在的問題、存在效率問題的代碼段並提供改善方案;
DDMS—TraceView,用於查找程序運行時具體耗時在哪;
StrictMode:用於查找程序運行時具體耗時在哪,需要集成到代碼中;
Andorid開發者模式—GPU呈現模式分析。
6 程序穩定性:monkey,通過monkey對程序在提交測試前做自測,可以檢測出明顯的導致程序不穩定的問題,執行monkey只需要一行命令,提交測試前跑一次可以避免應用剛提交就被打回的問題。
說明:
上面提到的這些工具可以進Android開發者官網性能工具介紹查看每個工具的介紹和使用說明;
Android開發者選項中有很多測試應用性能的工具,對應用性能的檢測非常有幫助,具體可以查看:All about your phone's developer options和15個必知的Android開發者選項對Android開發者選項中每一項的介紹;
針對Android應用性能的優化,Google官方提供了一系列的性能優化視頻教程,對應用性能優化具有非常好的指導作用,具體可以查看:優酷Google Developers或者Android Performance Patterns。
二 第三方性能優化工具介紹
除了android官方提供的一系列性能檢測工具,還有很多優秀的第三方性能檢測工具使用起來更方便,比如對內存泄露的檢測,使用leakcanry比MAT更人性化,能夠快速查到具體是哪存在內存泄露。
leakcanary:square/leakcanary · GitHub,通過集成到程序中的方式,在程序運行時檢測應用中存在的內存泄露,並在頁面中顯示,在應用中集成leancanry後,程序運行時會存在卡頓的情況,這個是正常的,因為leancanry就是通過gc操作來檢測內存泄露的,gc會知道應用卡頓,說明文檔:LeakCanary 中文使用說明、LeakCanary: 讓內存泄露無所遁形。
GT:GT Home,GT是騰訊開發的一款APP的隨身調測平台,利用GT,可以對CPU、內存、流量、點亮、幀率/流暢度進行測試,還可以查看開發日誌、crash日誌、抓取網路數據包、APP內部參數調試、真機代碼耗時統計等等,需要說明的是,應用需要集成GT的sdk後,GT這個apk才能在應用運行時對各個性能進行檢測。
⑽ android app怎樣進行性能測試
eclipse軟體的DDMS模塊有專門的性能測試 包括線程分析 內存消耗情況等......