版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第第頁(yè)AndroidAPP性能及專項(xiàng)測(cè)試AndroidAPP性能及專項(xiàng)測(cè)試
發(fā)表于:2023-06-17來(lái)源:未知:@defias點(diǎn)擊數(shù):標(biāo)簽:
Android性能測(cè)試分為兩類:1、一類為rom版本(系統(tǒng))的性能測(cè)試2、一類為應(yīng)用app的性能測(cè)試
Android篇
1.(性能)(測(cè)試)
Android(性能測(cè)試)分為兩類:
1、一類為rom版本(系統(tǒng))的性能測(cè)試
2、一類為應(yīng)用app的性能測(cè)試
Android的app性能測(cè)試包括的測(cè)試項(xiàng)比如:
1、資源消耗
2、內(nèi)存泄露
3、電量功耗
4、耗時(shí)
5、網(wǎng)絡(luò)流量消耗
6、移動(dòng)終端相關(guān)資源利用率
7、幀率
8、渲染等等
工具:
(工具的原理都是基于調(diào)用android底層的一些api來(lái)獲取到測(cè)試所用到的值)GT等
(測(cè)試方法):
1、設(shè)計(jì)場(chǎng)景:手工或(自動(dòng)化)場(chǎng)景
2、獲取數(shù)據(jù):可獲取的數(shù)據(jù)包括:內(nèi)存、cpu、電量功耗、hprof(內(nèi)存泄露分析文件)、響應(yīng)時(shí)間等等。。。。配合手工或自動(dòng)化場(chǎng)景來(lái)獲取數(shù)據(jù)(最好多取幾次而且每次配合不同的設(shè)備看平均值)作為最后的對(duì)比分析
3、結(jié)果分析:拿到數(shù)據(jù)后分析哪些模塊的數(shù)據(jù)異常再去Checkcode定位問(wèn)題的原因
Android系統(tǒng)的幾種場(chǎng)景狀態(tài):
1、空閑狀態(tài):指打開(kāi)應(yīng)用后,點(diǎn)擊home鍵讓?xiě)?yīng)用后臺(tái)運(yùn)行,此時(shí)應(yīng)用處于的狀態(tài)叫做空閑
2、中等規(guī)格和滿規(guī)格狀態(tài):中等規(guī)格和滿規(guī)格指的是對(duì)應(yīng)用的操作時(shí)間的間隔長(zhǎng)短不一,中等規(guī)格時(shí)間較長(zhǎng),滿規(guī)格時(shí)間較短
1.1內(nèi)存篇
背景知識(shí):
C/(C++)申請(qǐng)的內(nèi)存空間在nativeheap中,而(java)申請(qǐng)的內(nèi)存空間則在dalvikheap中。這個(gè)是因?yàn)锳ndroid系統(tǒng)對(duì)dalvik的vmheapsize作了硬性限制,當(dāng)(java)進(jìn)程申請(qǐng)的java空間超過(guò)閾值時(shí),就會(huì)拋出OOM異常(這個(gè)閾值可以是48M、24M、16M等,視機(jī)型而定),可以通過(guò)adbshellgetprop|grepdalvik.vm.heapgrowthlimit查看此值。也就是說(shuō),程序發(fā)生OMM并不表示RAM不足,而是因?yàn)槌绦蛏暾?qǐng)的javaheap對(duì)象超過(guò)了dalvikvmheapgrowthlimit。也就是說(shuō),在RAM充足的情況下,也可能發(fā)生OOM。
這樣的設(shè)計(jì)似乎有些不合理,但是Google為什么這樣做呢?這樣設(shè)計(jì)的目的是為了讓Android系統(tǒng)能同時(shí)讓比較多的進(jìn)程常駐內(nèi)存,這樣程序啟動(dòng)時(shí)就不用每次都重新加載到內(nèi)存,能夠給用戶更快的響應(yīng)。迫使每個(gè)應(yīng)用程序使用較小的內(nèi)存,移動(dòng)設(shè)備非常有限的RAM就能使比較多的app常駐其中。但是有一些大型應(yīng)用程序是無(wú)法忍受vmheapgrowthlimit的限制的
實(shí)際上dalvik.vm.heapgrowthlimit和dalvik.vm.heapsize都是java虛擬機(jī)的最大內(nèi)存限制,應(yīng)用如果不想在dalvikheap達(dá)到heapgrowthlimit限制的時(shí)候出現(xiàn)OOM,需要在Manifest中的application標(biāo)簽中聲明android:largeHeap="true',聲明后應(yīng)用dalvikheap達(dá)到heapsize的時(shí)候才會(huì)出現(xiàn)OOM
內(nèi)存測(cè)試中的測(cè)試子項(xiàng):
1)空閑狀態(tài)下的應(yīng)用內(nèi)存消耗情況
2)中等規(guī)格狀態(tài)下的應(yīng)用內(nèi)存消耗情況
3)滿規(guī)格狀態(tài)下的應(yīng)用內(nèi)存消耗情況
4)應(yīng)用內(nèi)存峰值情況
5)應(yīng)用內(nèi)存泄露情況
6)應(yīng)用是否常駐內(nèi)存
7)壓力測(cè)試后的內(nèi)存使用情況
內(nèi)存問(wèn)題現(xiàn)象:
1)內(nèi)存抖動(dòng)
2)大內(nèi)存對(duì)象被分配
3)內(nèi)存不斷增長(zhǎng)
4)頻繁GC
內(nèi)存數(shù)據(jù)獲?。?/p>
1、各種(linux)命令(top、free、meminfo)
2、通過(guò)dumpsys
adbshelldumpsysmeminfo[pakagename|pid]
3、通過(guò)/system/xbin/procrank工具
adbshellprocrank
說(shuō)明:
VSSVirtualSetSize虛擬耗用內(nèi)存(包含共享庫(kù)占用的內(nèi)存)
RSSResidentSetSize實(shí)際使用物理內(nèi)存(包含共享庫(kù)占用的內(nèi)存)
PSSProportionalSetSize實(shí)際使用的物理內(nèi)存(比例分配共享庫(kù)占用的內(nèi)存)
USSUniqueSetSize進(jìn)程獨(dú)自占用的物理內(nèi)存(不包含共享庫(kù)占用的內(nèi)存)USS是針對(duì)某個(gè)進(jìn)程開(kāi)始有可疑內(nèi)存泄露的情況,是一個(gè)程序啟動(dòng)了會(huì)產(chǎn)生的虛擬內(nèi)存,一旦這個(gè)程序進(jìn)程殺掉就會(huì)釋放。不過(guò)USS需要通過(guò)root的手機(jī)。一般沒(méi)有root的手機(jī)我們可以獲取PSS。而PSS通過(guò)如下命令來(lái)獲?。篴dbshelldumpsysmeminfoPackageName|grepTOTAL
4、通過(guò)android提供的procrank
1)首先去google獲取procrank、procmem、libpagemap.so三個(gè)文件
2)然后push文件,執(zhí)行adbpushprocrank/system/xbinadbpushprocmem
/system/xbinadbpushlibpagemap.so/system/lib
3)賦權(quán)adbshellchmod6755/system/xbin/procrankadbshellchmod6755/system/xbin/procmemadbshellchmod6755/system/lib/libpagemap.so,
4)在開(kāi)啟工具記錄adbshellprocrank|greppackagename/address/procrank.txt
5、通過(guò)android提供的ActivityManager的getMemoryInfo(ActivityManager.MemoryInfooutInfo)(這個(gè)方法是寫(xiě)一個(gè)簡(jiǎn)單的app去監(jiān)控的時(shí)候用到的,輕便簡(jiǎn)單)
privatevoidGetMemory(){finalActivityManageractivityManager=(ActivityManager)getSystemService(ACTIVITY_SERVICE);ActivityManager.MemoryInfoinfo=newActivityManager.MemoryInfo();activityManager.getMemoryInfo(info);Log.i(tag,系統(tǒng)剩余內(nèi)存:+(info.availMem10)+k);Log.i(tag,系統(tǒng)是否處于低內(nèi)存運(yùn)行:+info.lowMemory);Log.i(tag,當(dāng)系統(tǒng)剩余內(nèi)存低于+info.threshold+時(shí)就看成低內(nèi)存運(yùn)行);}6、MemoryMonitor(androidstudio的插件)【makedown???】4./proc/meminfo文件里列出的字段解釋:MemTotal:所有可用RAM大小。MemFree:LowFree與HighFree的總和,被系統(tǒng)留著未使用的內(nèi)存。
Buffers:用來(lái)給文件做緩沖大小。Cached:被高速緩沖存儲(chǔ)器(cachememory)用的內(nèi)存的大?。ǖ扔赿iskcache
minusSwapCache)。SwapCached:被高速緩沖存儲(chǔ)器(cache
memory)用的交換空間的大小。已經(jīng)被交換出來(lái)的內(nèi)存,仍然被存放在swapfile中,用來(lái)在需要的時(shí)候很快的被替換而不需要再次打開(kāi)I/O端口。
Active:在活躍使用中的緩沖或高速緩沖存儲(chǔ)器頁(yè)面文件的大小,除非非常必要,否則不會(huì)被移作他用。Inactive:
在不經(jīng)常使用中的緩沖或高速緩沖存儲(chǔ)器頁(yè)面文件的大小,可能被用于其他途徑。SwapTotal:交換空間的總大小。SwapFree:
未被使用交換空間的大小。Dirty:等待被寫(xiě)回到磁盤(pán)的內(nèi)存大小。Writeback:正在被寫(xiě)回到磁盤(pán)的內(nèi)存大小。
AnonPages:未映射頁(yè)的內(nèi)存大小。Mapped:設(shè)備和文件等映射的大小。Slab:
內(nèi)核數(shù)據(jù)結(jié)構(gòu)緩存的大小,可以減少申請(qǐng)和釋放內(nèi)存帶來(lái)的消耗。SReclaimable:可收回Slab的大小。
SUnreclaim:不可收回Slab的大?。⊿Unreclaim+SReclaimable=Slab)。
PageTables:管理內(nèi)存分頁(yè)頁(yè)面的索引表的大小。NFS_Unstable:不穩(wěn)定頁(yè)表的大小。
5.android檢查內(nèi)存泄露步驟:1、運(yùn)行Monkey進(jìn)行壓力測(cè)試:
adbshellmonkey-pcn.microinvestment.weitou--pct-touch100--ingore-crashes--throttle1000-s100-v-v50
2、監(jiān)控內(nèi)存值,如果出現(xiàn)過(guò)大等遞增異常則保存HPROF文件(hprof文件是(Java)虛擬機(jī)的Heap快照)用于分析查看應(yīng)用內(nèi)存的命令:
adbshelldumpsysmeminfocn.microinvestment.weitou(進(jìn)程名)
如果發(fā)現(xiàn)內(nèi)存過(guò)大,則保存HPROF文件:adbshellamdumpheap進(jìn)程名保存路徑
3、分析hprof文件
用工具M(jìn)AT來(lái)查看,首先還要這個(gè)HPROF文件轉(zhuǎn)換成MAT可讀的文件
在AndroidSDKtool里面有個(gè)hprof-conv命令:
hprof-conv原HPROF文件路徑轉(zhuǎn)換后的HPROF路徑
hprof-conva.hprofb.hprof
4、用MAT工具打開(kāi)轉(zhuǎn)換后的HPROF文件
一般選擇LeakSuspectsReport(通過(guò)(SQL)語(yǔ)句來(lái)查詢對(duì)象有沒(méi)有被釋放掉,如果有多個(gè)相同的對(duì)象,則會(huì)存在內(nèi)存泄露的問(wèn)題)
1.2CPU篇
CPU測(cè)試中的測(cè)試子項(xiàng):
1)空閑狀態(tài)下的應(yīng)用CPU消耗情況
2)中等規(guī)格狀態(tài)下的應(yīng)用CPU消耗情況
3)滿規(guī)格狀態(tài)下的應(yīng)用CPU消耗情況
4)應(yīng)用CPU峰值情況
CPU數(shù)據(jù)獲?。?/p>
1)adbshelldumpsyscpuinfo|greppackagename
2)top命令
adbshelltop-m10-scpu#查看占用cpu最高的前10個(gè)程序(-t顯示進(jìn)程名稱,-s按指定行排序,-n在退出前刷新幾次,-d刷新間隔,-m顯示最大數(shù)量)
adbshelltop|grepPackageName/address/cpu.txt
1.3流量篇
概念:
中等負(fù)荷:應(yīng)用正常操作
高負(fù)荷:應(yīng)用極限操作
流量測(cè)試中的測(cè)試子項(xiàng):
1、應(yīng)用首次啟動(dòng)流量值
2、應(yīng)用后臺(tái)連續(xù)運(yùn)行2小時(shí)的流量值
3、應(yīng)用高負(fù)荷運(yùn)行的流量峰值
4、應(yīng)用中等負(fù)荷運(yùn)行時(shí)的流量均值
獲取流量數(shù)據(jù):
1、tcpdump+wireshark
2、/proc/net/目錄下相關(guān)文件
cat/proc/net/dev獲取系統(tǒng)的流量信息
3、查詢應(yīng)用的pid:adbshellps|greptataufo#如:31002
通過(guò)PID獲取該應(yīng)用的流量數(shù)據(jù):adbshellcat/proc/31002/net/dev
(wlan0代表wifi上傳(下載)量標(biāo)識(shí),單位是字節(jié)可以/1024換算成KB,打開(kāi)手機(jī)飛行模式再關(guān)掉就可以將wlan0中的值初始化0)
4、查詢應(yīng)用的pid:adbshellps|greptataufo#如:31002
通過(guò)PID獲取UID:adbshellcat/proc//status
通過(guò)UID獲?。篴dbshellcat/proc/net/xt_qtaguid/stats|grep31002
5、通過(guò)adbshelldumpsyspackage來(lái)獲取應(yīng)用的uid信息,然后在未操作應(yīng)用之前,通過(guò)查看:
adbshellcat/proc/uid_stat/uid/tcp_rcv
adbshellcat/proc/uid_stat/uid/tcp_snd
獲取到應(yīng)用的起始的接收及發(fā)送的流量,然后我們?cè)俨僮鲬?yīng)用,再次通過(guò)上述2條命令可以獲取到應(yīng)用的結(jié)束的接收及發(fā)送的流量,通過(guò)相減及得到應(yīng)用的整體流量消耗
6、Android代碼:Android的TrafficStats類
1.4功耗篇
功耗測(cè)試中的測(cè)試子項(xiàng):
1、手機(jī)安裝目標(biāo)APK前后待機(jī)功耗無(wú)明顯差異
2、常見(jiàn)使用場(chǎng)景中能夠正常進(jìn)入待機(jī),待機(jī)電流在正常范圍內(nèi)
3、長(zhǎng)時(shí)間連續(xù)使用應(yīng)用無(wú)異常耗電現(xiàn)象
功耗測(cè)試方法:
方法一:軟件
1、采用市場(chǎng)上提供的第三方工具,如金山電池管家之類的。
2、就是自寫(xiě)工具進(jìn)行,這里一般會(huì)使用3種方法:
1)基于android提供的PowerManager.WakeLock來(lái)進(jìn)行
2)比較復(fù)雜一點(diǎn),功耗的計(jì)算=CPU消耗+Wakelock消耗+數(shù)據(jù)傳輸消耗+GPS消耗+Wi-Fi連接消耗
3)通過(guò)adbshelldumpsysbattery來(lái)獲取
3、battery-historian(google(開(kāi)源)工具)
方法二:硬件
一般使用萬(wàn)用表或者功耗儀安捷倫進(jìn)行測(cè)試,使用功耗儀測(cè)試的時(shí)候,需要制作假電池來(lái)進(jìn)行的,有些不能拔插電池的手機(jī)還需要焊接才能進(jìn)行功耗測(cè)試
1.5GPU篇(FPS)
概念:
過(guò)度繪制:界面顯示的activity套接了多層而導(dǎo)致
幀率:屏幕滑動(dòng)幀速率
幀方差:屏幕滑動(dòng)平滑度
**FPS:**FramesPerSecond每秒顯示的幀數(shù)根據(jù)人眼的生理結(jié)構(gòu),幀率高于24時(shí)就被認(rèn)為是連貫的。對(duì)于游戲畫(huà)面30fps是最低能接受的,60fps逼真感,如果幀率高于屏幕刷新頻率就是浪費(fèi)。要達(dá)到30fps,每幀所占用的時(shí)間要小于33毫秒
GPU測(cè)試中的測(cè)試子項(xiàng):
1、界面過(guò)度繪制
2、屏幕滑動(dòng)幀速率
3、屏幕滑動(dòng)平滑度
過(guò)度繪制測(cè)試:(人工進(jìn)行測(cè)試)
打開(kāi)(開(kāi)發(fā))者選項(xiàng)中的顯示GPU過(guò)度繪制(De(bug)GPUoverdraw)
驗(yàn)收的標(biāo)準(zhǔn):
1、不允許出現(xiàn)黑色像素
2、不允許存在4x過(guò)度繪制
3、不允許存在面積超過(guò)屏幕1/4區(qū)域的3x過(guò)度繪制(淡紅色區(qū)域)
屏幕滑動(dòng)幀速率測(cè)試:
方法一:
1.手機(jī)端打開(kāi)開(kāi)發(fā)者選項(xiàng)中的啟用跟蹤后勾選Graphics和View
2.啟動(dòng)SDK工具Systrace,勾選被測(cè)應(yīng)用,點(diǎn)擊Systrace,在彈出的對(duì)話框中設(shè)置持續(xù)抓取時(shí)間,在tracetaps下面勾選gfx及view選項(xiàng)
3.手工滑動(dòng)界面可以通過(guò)節(jié)拍來(lái)進(jìn)行滑動(dòng)或者掃動(dòng),幀率數(shù)據(jù)會(huì)保存到默認(rèn)路徑下,默認(rèn)名稱為trace.html
4.將trace.html文件拷貝到linux系統(tǒng)下通過(guò)命令進(jìn)行轉(zhuǎn)換,生成trace.csv文件
greppostFramebuffertrace.html|sed-es/.]\W//g-es/:.*$//g-es/.//gtrace.csv
5.用excel打開(kāi)文件計(jì)算得到幀率
方法二:
硬件的方法,打開(kāi)高速相機(jī),開(kāi)啟攝像模式,錄制手工滑動(dòng)或者掃動(dòng)被測(cè)應(yīng)用的(視頻),再通過(guò)人工或者程序數(shù)幀的方法對(duì)結(jié)果進(jìn)行計(jì)算得到幀率
屏幕滑動(dòng)平滑度的測(cè)試:
方法如同幀率測(cè)試,唯一的差異就是最后的結(jié)果計(jì)算公式的差異
捕獲app幀率(android流暢度FPS測(cè)試):
1、打開(kāi)手機(jī)開(kāi)發(fā)者選項(xiàng),勾選GPU顯示配置文件(系統(tǒng)會(huì)記錄保留每個(gè)界面最后128幀圖像繪制的相關(guān)時(shí)間信息)
2、adbshelldumpsysgfxinfocom.xxx.xxxzinfo.txt
3、結(jié)果數(shù)據(jù)分析
Profiledatainms部分:
Draw:創(chuàng)建顯示列表的時(shí)間(DisplayList),所有View對(duì)象OnDraw方法占用的時(shí)間
Process:Android2D渲染引擎執(zhí)行顯示列表所花的時(shí)間,View越多時(shí)間越長(zhǎng)
Execute:將一幀圖像交給合成器(compsitor)的時(shí)間,較小
其他工具:
GameBench測(cè)試androidapp的FPS工具
Gfxinfo查看app繪制性能工具
1.6響應(yīng)時(shí)間篇
理解:
1)從單擊事件觸發(fā)到容器啟動(dòng)NativeAPP消耗的時(shí)間(埋點(diǎn))
2)NativeAPP完整啟動(dòng)消耗的時(shí)間(可以通過(guò)system.log獲?。?/p>
3)Native調(diào)用RPC請(qǐng)求方法的延遲時(shí)間(埋點(diǎn))
4)RPC請(qǐng)求發(fā)出去過(guò)程中的具體數(shù)據(jù)(req_sizereq_headerreq_time等,通過(guò)埋點(diǎn)獲取)
5)RPC請(qǐng)求返回的具體數(shù)據(jù)(res_sizeres_headerres_time等,通過(guò)埋點(diǎn)獲?。?/p>
6)本地解析返回?cái)?shù)據(jù)所消耗的時(shí)間(埋點(diǎn)或者TraceView工具可獲?。?/p>
7)界面
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 怎樣做腦急轉(zhuǎn)彎題目及答案
- 養(yǎng)老院消防安全檢查制度
- 1.1正數(shù)和負(fù)數(shù) 課后培優(yōu)檢測(cè)(含答案) 數(shù)學(xué)人教版(2024)七年級(jí)上冊(cè)
- 疑惑的考試題目及答案英文
- 農(nóng)產(chǎn)品質(zhì)量追溯制度
- 金庫(kù)庫(kù)房安全消防制度
- 酒店掛賬制度
- 數(shù)學(xué)九年級(jí)上冊(cè)題目及答案
- 物聯(lián)網(wǎng)技術(shù)標(biāo)準(zhǔn)與應(yīng)用案例研究
- 貸款轉(zhuǎn)讓制度
- 景區(qū)旅游基礎(chǔ)設(shè)施提升項(xiàng)目可行性研究報(bào)告
- 老年機(jī)構(gòu)養(yǎng)老心理健康評(píng)估方案
- 港澳聯(lián)考中文真題及答案
- 統(tǒng)編版語(yǔ)文四年級(jí)下冊(cè)全冊(cè)教案(2025年2月修訂)
- GB 11174-2025液化石油氣
- 肝素鈉工藝流程
- 熱工儀表工試題全集
- 2025-2030老年婚戀市場(chǎng)需求分析與服務(wù)平臺(tái)優(yōu)化方向
- 《JJG 875-2019數(shù)字壓力計(jì)》解讀
- 急性發(fā)熱課件
- 疼痛科醫(yī)師進(jìn)修總結(jié)匯報(bào)
評(píng)論
0/150
提交評(píng)論