




已閱讀5頁(yè),還剩4頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
.無(wú)論你的應(yīng)用多么有創(chuàng)新性、有用,如果它卡得要命,或者非常消耗內(nèi)存,那么每人將會(huì)愿意使用它。因此,性能變得尤為重要。當(dāng)你忙碌于構(gòu)建精美的用戶界面或者完成新的特性時(shí),你可能容易忘卻掉一些性能相關(guān)的事情。這也是為什么有Google Play的應(yīng)用審核機(jī)制的原因之一。這篇文章中,你會(huì)看到每個(gè)Android工程師需要了解的一些性能問(wèn)題。你將會(huì)學(xué)會(huì)使用Android SDK提供的、已安裝在你的設(shè)備中的工具來(lái)測(cè)試這些問(wèn)題是否發(fā)生在你自己的應(yīng)用中。如果在你的應(yīng)用中發(fā)現(xiàn)了一個(gè)性能問(wèn)題,你肯定會(huì)想修復(fù)它。我們還會(huì)看一看如何使用Android SDK 工具來(lái)獲取更多關(guān)于那些沒(méi)有覆蓋到的性能問(wèn)題的相關(guān)信息。一旦你有了這些信息,你將會(huì)對(duì)如何提升應(yīng)用性能有一個(gè)更深刻的理解,并且能夠構(gòu)建出讓用戶喜愛(ài)的App。過(guò)度繪制步驟1 : 問(wèn)題描述你應(yīng)用的用戶界面是連接用戶的紐帶,但是創(chuàng)建漂亮的界面只是挑戰(zhàn)的其中一面,你還需要確保用戶界面流暢的運(yùn)行。一個(gè)常見(jiàn)的問(wèn)題就是用戶界面卡頓,出現(xiàn)這種情況的原因可能是overdraw。Overdraw是屏幕上的某個(gè)像素在同一幀的時(shí)間內(nèi)被繪制了多次。例如,想象一下一個(gè)有藍(lán)色的背景文本,Android不僅會(huì)繪制對(duì)用戶可見(jiàn)的藍(lán)色區(qū)域,而是會(huì)繪制整個(gè)藍(lán)色的背景以及上面的文本。這意味著一些像素會(huì)被兩次繪制,這就是過(guò)度繪制。一些如上述例子所說(shuō)的過(guò)度繪制示例是不可避免的。然而,過(guò)多的多度繪制會(huì)引發(fā)明顯的性能問(wèn)題,因此你必須將過(guò)度繪制的可能性降到最小。檢測(cè)應(yīng)用中的過(guò)度繪制相對(duì)來(lái)說(shuō)比較簡(jiǎn)單。大量的過(guò)度繪制會(huì)引出其他用戶界面相關(guān)問(wèn)題,例如視圖層級(jí)過(guò)于復(fù)雜等。基于這些原因,當(dāng)你測(cè)試你的App的性能問(wèn)題時(shí),從過(guò)度繪制開(kāi)始是一個(gè)明智的選擇。步驟2 : 檢測(cè)過(guò)度繪制好消息是你的Android設(shè)備上已經(jīng)內(nèi)置了檢測(cè)過(guò)度繪制的工具。因此你需要做的第一步就是安裝你要測(cè)試的App到你的設(shè)備中。然后打開(kāi)設(shè)置頁(yè)面,選擇開(kāi)發(fā)選項(xiàng)(Developer Options)-調(diào)試GPU 過(guò)度繪制(Debug GPU Overdraw),然后選擇“顯示過(guò)度繪制區(qū)域(Show overdraw area)”。如下圖所示。這個(gè)工具使用色塊來(lái)代表不同數(shù)量的過(guò)度繪制。剩下的事情就是啟動(dòng)你要測(cè)試的應(yīng)用,然后觀察它的過(guò)度繪制情況。沒(méi)顏色 : 沒(méi)有過(guò)度繪制,也就是說(shuō)一個(gè)像素只被繪制了一次。藍(lán)色 : 過(guò)度繪制了一次,也就是一個(gè)像素點(diǎn)被繪制了兩次。綠色 : 過(guò)度繪制了2次. 也就是一個(gè)像素點(diǎn)被繪制了三次,通常,你需要集中精力優(yōu)化過(guò)度繪制次數(shù)大于等于2次的情況。淺紅色 : 過(guò)度繪制3次。這取決于你的應(yīng)用,小范圍的3次過(guò)度繪制可能是不可避免的,但是如果你看到了中等或者大量的紅色區(qū)域那么你就需要查找出現(xiàn)這個(gè)問(wèn)題的原因了。深紅色 : 過(guò)度繪制4次,像素點(diǎn)被繪制了5次,甚至更多次。出現(xiàn)這種問(wèn)題你絕逼要找到原因,并且解決它。步驟3 : 最小化過(guò)度繪制一旦你發(fā)現(xiàn)了某個(gè)區(qū)域有嚴(yán)重的過(guò)度繪制,最簡(jiǎn)單的方法就是打開(kāi)你應(yīng)用的xml文件找到過(guò)度重疊的區(qū)域,特別是那些不可見(jiàn)的drawable對(duì)象和被繪制在其他控件上的背景,以此來(lái)降低這些地方的過(guò)度繪制。你也應(yīng)該查找那些背景屬性設(shè)置為白色,并且它的父視圖背景也設(shè)置為白色的區(qū)域。所有這些都會(huì)引起嚴(yán)重的過(guò)度繪制。Android系統(tǒng)能自動(dòng)的降低一些簡(jiǎn)單的過(guò)度繪制,但是這些對(duì)于復(fù)雜的自定義View并沒(méi)有什么價(jià)值,因?yàn)锳ndroid不會(huì)知道你如何繪制你的內(nèi)容。如果你在App中使用了復(fù)雜的自定義View,你可以為使用clipRect函數(shù)為你的視圖定義可繪制區(qū)域的邊界。更新相關(guān)信息可以參考o(jì)fficial Android documentation.# 2. Android 圖形渲染步驟1 : 問(wèn)題描述另一個(gè)常見(jiàn)的性能問(wèn)題就是應(yīng)用的視圖層級(jí)。為了渲染每個(gè)視圖,Android都會(huì)經(jīng)歷這三個(gè)階段 :測(cè)量布局繪制花在這三個(gè)階段的時(shí)間與View層級(jí)中的View的數(shù)量成正比,這就意味著降低App渲染時(shí)間的最簡(jiǎn)單的方法就是識(shí)別和移除那些并沒(méi)有什么卵用的UI元素。即使在你的視圖層級(jí)上的所有View都是必須的,不同的布局方式也可能對(duì)測(cè)量過(guò)程產(chǎn)生重要的影響。通常來(lái)說(shuō),你的視圖層級(jí)越深,花在測(cè)量視圖的時(shí)間就越長(zhǎng)。在視圖渲染期間,每個(gè)View都要向它的父View提供它自己的尺寸。如果父view發(fā)現(xiàn)了任意一個(gè)尺寸問(wèn)題,那么它會(huì)強(qiáng)制要求所有的子視圖重新測(cè)量。即使沒(méi)有錯(cuò)誤發(fā)生,重新測(cè)量也可能出現(xiàn)。例如,為了正確的進(jìn)行布局RelativeLayout通常會(huì)對(duì)它們的子視圖進(jìn)行兩次測(cè)量。子視圖使用了layout_weight屬性的LinearLayout也會(huì)對(duì)它的子視圖進(jìn)行兩次測(cè)量。這些都取決于你的布局方式,測(cè)量和重新測(cè)量的代價(jià)非常昂貴,它會(huì)嚴(yán)重影響你的渲染速度。確保你的用戶界面渲染流暢的關(guān)鍵就是移除任何非必須的View以及減少你的View層級(jí)。Hierarchy Viewer是一個(gè)能夠?qū)⒛阃暾腣iew層級(jí)可視化的工具,這個(gè)工具能夠幫助你發(fā)現(xiàn)冗余的View以及嵌套的布局。步驟2:使用 Hierarchy Viewer在我們進(jìn)一步了解Hierarchy Viewer之前,你需要知道它的一些規(guī)則。首先Hierarchy Viewer只能與正在運(yùn)行的App進(jìn)行交互,而不是你的源代碼。這就是說(shuō)你需要將App安裝到你的設(shè)備或者模擬器上。還有一個(gè)最重要的問(wèn)題,就是默認(rèn)情況下Hierarchy Viewer只能與運(yùn)行開(kāi)發(fā)版Android系統(tǒng)的設(shè)備進(jìn)行交互(譯者注: 一般來(lái)說(shuō),使用模擬器即可)。如果你沒(méi)有開(kāi)發(fā)設(shè)備,那你需要添加ViewServeclass到你的應(yīng)用中。了解這些之后就讓我們打開(kāi)Android Studio,并且選擇”tools” - “Android” - “Android Device Monitor”,如圖所示。然后點(diǎn)擊Hierarchy View按鈕,如下圖所示。屏幕左邊的Windows標(biāo)簽下列出了所有Android設(shè)備和模擬器。選擇你的設(shè)備后,你會(huì)看到你設(shè)備上運(yùn)行的所有進(jìn)程。選中你要檢測(cè)的進(jìn)程,然后你會(huì)看到三個(gè)自動(dòng)更新的視圖層級(jí)區(qū)域。這三個(gè)窗口提供了視圖層級(jí)的三個(gè)不同可視化展示。Tree View: * 視圖層級(jí)窗口,每個(gè)節(jié)點(diǎn)代表了一個(gè)View;Tree Overview: 整個(gè)視圖層級(jí)的縮略布局;Layout View: 當(dāng)前視圖層級(jí)的輪廓.Hierarchy View中有三個(gè)窗口。如果你在一個(gè)窗口中選擇了一個(gè)View,那么它會(huì)在另外兩個(gè)中高亮顯示。你能同時(shí)使用這三個(gè)窗口查找View層級(jí)中的冗余視圖。如果你不確定一個(gè)View是否是UI界面中的必須元素,最簡(jiǎn)單的方法就是到Tree View窗口點(diǎn)擊這個(gè)節(jié)點(diǎn)。你將會(huì)看到該View是如何顯示在屏幕的預(yù)覽,此時(shí)你就可以確切地知道該View是否是必須的。但是即使一個(gè)View對(duì)最終的渲染效果有貢獻(xiàn)也并不意味著它不會(huì)引起嚴(yán)重的性能問(wèn)題。你已經(jīng)看到了如何通過(guò)Hierarchy Viewer來(lái)找到明顯的嵌套布局,但是如果這引起的性能問(wèn)題并不那么明顯呢?或者還有其他的原因使得該視圖渲染得非常慢?好消息就是你還可以通過(guò)Hierarchy Viewer來(lái)剖析每個(gè)View在不同的渲染階段的耗時(shí)。當(dāng)性能問(wèn)題的原因不那么明顯時(shí),這是你發(fā)現(xiàn)問(wèn)題的另一途徑。下個(gè)章節(jié)我將為你展示如何通過(guò)Hierarchy Viewer來(lái)剖析每個(gè)View的渲染時(shí)間來(lái)找到潛伏在問(wèn)題表面的性能問(wèn)題。步驟3 : 節(jié)點(diǎn)的性能分析定位你的用戶界面瓶頸的最簡(jiǎn)單方法就是收集每個(gè)View分別完成測(cè)量、布局、繪制的時(shí)間。你不僅可以通過(guò)Hierarchy Viewer收集這些信息,Hierarchy Viewer還可以通俗易懂地向你展示這些數(shù)據(jù),因此你可以通過(guò)這種形式來(lái)找到性能問(wèn)題。Hierarchy Viewer默認(rèn)并不會(huì)顯示渲染時(shí)間。你需要到Tree View窗口添加這個(gè)信息,然后選擇你想要測(cè)試的根節(jié)點(diǎn)。下一步,在Hierarchy Viewer上點(diǎn)擊由綠、紅、紫的三個(gè)圓形色塊組成的按鈕,如圖所示。三個(gè)圓點(diǎn)色塊就會(huì)顯示在每個(gè)節(jié)點(diǎn)上,從左到右,這些圓點(diǎn)分別代表 :用于測(cè)量的時(shí)間用于布局的時(shí)間用于繪制的時(shí)間每個(gè)圓點(diǎn)都有顏色 :綠色 代表該View的渲染速度至少要快于一半以上的其他參與測(cè)試的節(jié)點(diǎn)。例如,一個(gè)在布局位置上的綠色的圓點(diǎn)代表它的布局速度要快于50%以上的其他節(jié)點(diǎn);黃色 代表該View慢于50%以上的其他節(jié)點(diǎn);紅色 代表該View的渲染速度比其他所有參與測(cè)試的節(jié)點(diǎn)都慢。 當(dāng)收集了這些數(shù)據(jù)之后,你不僅知道哪些View需要優(yōu)化,你還會(huì)確切地知道是在渲染的哪個(gè)階段導(dǎo)致的問(wèn)題。哪些黃色、紅色的地方就是你需要開(kāi)始優(yōu)化的地方,這些性能指標(biāo)與該視圖層級(jí)下的其他剖析節(jié)點(diǎn)也有關(guān)系。換句話說(shuō),你肯定會(huì)有一些視圖渲染得比其他的慢。在開(kāi)始改良你的View相關(guān)的代碼之前,摸著你的良心問(wèn)一句該View渲染得比其他視圖慢是否有一個(gè)合理的原因,如果答案是否定的,那么就開(kāi)始你的View優(yōu)化之旅吧。3. Memory Leaks 內(nèi)存泄漏步驟1:?jiǎn)栴}描述Android是一個(gè)自動(dòng)管理內(nèi)存的開(kāi)發(fā)環(huán)境,不要讓這個(gè)句話蒙蔽了,因?yàn)閮?nèi)存泄漏依舊是可能發(fā)生的。這是因?yàn)槔厥掌髦粫?huì)移除那些不可達(dá)的對(duì)象。如果它不是一個(gè)不可達(dá)的對(duì)象,那么該對(duì)象就不會(huì)被釋放掉。這些不可達(dá)的對(duì)象陰魂不散,聚集在你的堆內(nèi)存中,占用App的內(nèi)存控件。如果你繼續(xù)泄漏對(duì)象,那么可用的內(nèi)存空間將會(huì)越來(lái)越小,GC操作就會(huì)頻繁觸發(fā)。有兩個(gè)原因表明這是一個(gè)壞消息。首先,GC操作通常不會(huì)明顯地影響你的App性能,但是當(dāng)內(nèi)存控件較小時(shí)大量的GC操作會(huì)使你的App變慢,此時(shí)UI就不會(huì)那么流暢了。第二問(wèn)題是移動(dòng)設(shè)備的內(nèi)存空間相對(duì)來(lái)說(shuō)較小,因此內(nèi)存泄漏會(huì)快速地升級(jí)為內(nèi)存溢出,導(dǎo)致應(yīng)用Crash。內(nèi)存泄漏難以被檢測(cè)出??赡苤挥挟?dāng)用戶開(kāi)始抱怨你的應(yīng)用時(shí)你才能發(fā)覺(jué)內(nèi)存泄漏問(wèn)題。幸運(yùn)地是,Android SDK提供了一些有用的工具來(lái)讓你找到這些問(wèn)題。(譯者注 : Square的開(kāi)源庫(kù)LeakCanary是查找內(nèi)存泄漏的優(yōu)秀工具,強(qiáng)烈建議大家使用)。步驟2 : 內(nèi)存監(jiān)視器 (Memory Monitor)Memory Monitor是一個(gè)能夠?qū)崟r(shí)獲取應(yīng)用內(nèi)存使用情況的工具。需要注意的是這個(gè)工具只能作用于正在運(yùn)行的應(yīng)用,因此確保你的要測(cè)試的應(yīng)用已經(jīng)安裝到你的設(shè)備中,并且你的設(shè)備已經(jīng)連接到你的電腦上。Memory Monitor已經(jīng)內(nèi)置在Android Studio中,因此你可以點(diǎn)擊Android Studio的底部的”Memory”這個(gè)tab來(lái)切換到內(nèi)存監(jiān)視頁(yè)面。當(dāng)你切換到該頁(yè)面的時(shí)候,Memory Monitor就開(kāi)始記錄你的內(nèi)存使用情況了。如果Memory Monitor沒(méi)有開(kāi)始記錄,那么確保你的設(shè)備是已經(jīng)被選中的狀態(tài)。如果Memory Monitor提示No debuggable applications,那么你可以打開(kāi)Android Studio的”Tools”菜單,選擇”Android”,然后確保選中了Enable adb integration。這個(gè)功能還不是很穩(wěn)定,所以有時(shí)候你需要手動(dòng)切換它的狀態(tài)。你也可以斷開(kāi)設(shè)備與電腦的連接,然后再重連,這樣可能就OK了。一旦Memory Monitor檢測(cè)到正在運(yùn)行的應(yīng)用,它就會(huì)顯示這個(gè)應(yīng)用的內(nèi)存使用情況。已使用的內(nèi)存會(huì)被表示為深藍(lán)色,未分配的內(nèi)存則會(huì)變?yōu)闇\藍(lán)色。花一些時(shí)間與你的設(shè)備交互,并且關(guān)注你的內(nèi)存使用情況。最終已分配的內(nèi)存會(huì)增長(zhǎng),直到?jīng)]有內(nèi)存可用。此時(shí),系統(tǒng)就會(huì)釋放觸發(fā)GC釋放內(nèi)存,當(dāng)你看到已分配的內(nèi)存明顯的下降時(shí)就代表GC操作被觸發(fā)了。GC通常情況下會(huì)將無(wú)用的內(nèi)存釋放掉,但是當(dāng)你看到App在短時(shí)間內(nèi)快速增長(zhǎng)或者GC變得非常頻繁,此時(shí)你就需要倍加小心了,這就是發(fā)生內(nèi)存泄漏的信號(hào)!如果你通過(guò)Memory Monitor來(lái)追蹤一個(gè)可疑的內(nèi)存泄漏問(wèn)題,你可能會(huì)看到Android系統(tǒng)會(huì)為你的App增大可用內(nèi)存,TODO : 。最終,你可能會(huì)看到你的App消耗了非常多的內(nèi)存以至于系統(tǒng)無(wú)法再給你的應(yīng)用更多的可用內(nèi)存。如果你看到這種場(chǎng)景,那么說(shuō)明你在內(nèi)存使用上犯了很?chē)?yán)重的錯(cuò)誤。步驟3 : Android Device Monitor另一個(gè)能夠幫助你收集更新關(guān)于內(nèi)存泄漏信息和其他內(nèi)存相關(guān)問(wèn)題的工具是Android Device Monitor的DDMMS工具下的Heap。Heap工具能夠通過(guò)顯示系統(tǒng)為你分配了多少內(nèi)存來(lái)幫助你診斷內(nèi)存泄漏問(wèn)題。正如上面提到的,如果已分配的內(nèi)存不斷地增長(zhǎng),那么這是發(fā)生內(nèi)存泄漏的明顯信號(hào)。但是這個(gè)工具還提供了許多關(guān)于你的應(yīng)用堆內(nèi)存使用情況的數(shù)據(jù),包含你的App
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025工業(yè)園區(qū)廢棄物處理服務(wù)合同
- 電纜CCC認(rèn)證標(biāo)識(shí)核查
- 2025備案版企業(yè)貸款合同范本
- 電子商務(wù)法規(guī)與案例分析考試題
- 教育研究在線投稿
- 現(xiàn)代企業(yè)管理學(xué)理論與實(shí)踐試題
- 《客戶關(guān)系管理》大學(xué)筆記
- 《草坪學(xué)》大學(xué)筆記
- 2025年信息管理與信息系統(tǒng)專(zhuān)業(yè)認(rèn)證考試試題及答案
- 家長(zhǎng)會(huì)的家長(zhǎng)代表講話發(fā)言稿(6篇)
- 新能源合伙人合同8篇
- 江蘇省南京市、鹽城市2025屆高三年級(jí)5月第二次模擬考試數(shù)學(xué)及答案(南京鹽城二模)
- 礦權(quán)轉(zhuǎn)讓居間合同協(xié)議
- 《現(xiàn)代家居風(fēng)格解讀》課件
- 校園水果店經(jīng)營(yíng)投標(biāo)方案(技術(shù)方案)
- 2025年2月22日四川省公務(wù)員面試真題及答案解析(定向鄉(xiāng)鎮(zhèn)崗)
- 河南會(huì)考地理試題及答案2024
- 防汛度汛管理制度
- 融資租賃行業(yè)國(guó)際人才隊(duì)伍建設(shè)-全面剖析
- 2025年藍(lán)莓行業(yè)市場(chǎng)需求分析報(bào)告及未來(lái)五至十年行業(yè)預(yù)測(cè)報(bào)告
- 第3節(jié) 呼吸作用2024-2025學(xué)年新教材七年級(jí)下冊(cè)生物同步教學(xué)設(shè)計(jì)(人教版2024)
評(píng)論
0/150
提交評(píng)論