說到 Android 系統(tǒng)手機(jī),,大部分人的印象是用了一段時間就變得有點(diǎn)卡頓,,有些程序在運(yùn)行期間莫名其妙的出現(xiàn)崩潰,打開系統(tǒng)文件夾一看,,發(fā)現(xiàn)多了很多文件,,然后用手機(jī)管家 APP 不斷地進(jìn)行清理優(yōu)化 ,才感覺運(yùn)行速度稍微提高了點(diǎn),,就算手機(jī)在各種性能跑分軟件面前分?jǐn)?shù)遙遙領(lǐng)先,,還是感覺無論有多大的內(nèi)存空間都遠(yuǎn)遠(yuǎn)不夠用。相信每個使用 Android 系統(tǒng)的用戶都有過以上類似經(jīng)歷,,確實(shí),,Android 系統(tǒng)在流暢性方面不如 IOS 系統(tǒng),為何呢,,明明在看手機(jī)硬件配置上時,,Android 設(shè)備都不會輸于 IOS 設(shè)備,甚至都強(qiáng)于它,,關(guān)鍵是在于軟件上,。造成這種現(xiàn)象的原因是多方面的,簡單羅列幾點(diǎn)如下:
性能優(yōu)化今天想說的重點(diǎn)是Android APP 性能優(yōu)化,,也就是在開發(fā)應(yīng)用程序時應(yīng)該注意的點(diǎn)有哪些,如何更好地提高用戶體驗(yàn),。一個好的應(yīng)用,,除了要有吸引人的功能和交互之外,在性能上也應(yīng)該有高的要求,,即時應(yīng)用非常具有特色,,在產(chǎn)品前期可能吸引了部分用戶,但是用戶體驗(yàn)不好的話,,也會給產(chǎn)品帶來不好的口碑,。那么一個好的應(yīng)用應(yīng)該如何定義呢?主要有以下三方面:
眾所周知,,Android 系統(tǒng)作為以移動設(shè)備為主的操作系統(tǒng),,硬件配置是有一定的限制的,,雖然配置現(xiàn)在越來越高級,但仍然無法與 PC 相比,,在 CPU 和內(nèi)存上使用不合理或者耗費(fèi)資源多時,,就會碰到內(nèi)存不足導(dǎo)致的穩(wěn)定性問題、CPU 消耗太多導(dǎo)致的卡頓問題等,。 面對問題時,,大家想到的都是聯(lián)系用戶,然后查看日志,,但殊不知有關(guān)性能類問題的反饋,,原因也非常難找,日志大多用處不大,,為何呢,?因?yàn)樾阅軉栴}大部分是非必現(xiàn)的問題,問題定位很難復(fù)現(xiàn),,而又沒有關(guān)鍵的日志,,當(dāng)然就無法找到原因了。這些問題非常影響用戶體驗(yàn)和功能使用,,所以了解一些性能優(yōu)化的一些解決方案就顯得很重要了,,并在實(shí)際的項(xiàng)目中優(yōu)化我們的應(yīng)用,進(jìn)而提高用戶體驗(yàn),。 四個方面 可以把用戶體驗(yàn)的性能問題主要總結(jié)為4個類別:
性能問題的主要原因是什么,原因有相同的,,也有不同的,,但歸根到底,不外乎內(nèi)存使用,、代碼效率,、合適的策略邏輯、代碼質(zhì)量,、安裝包體積這一類問題 打造一個高質(zhì)量的應(yīng)用應(yīng)該以4個方向?yàn)槟繕?biāo):快,、穩(wěn)、省,、小,。 快:使用時避免出現(xiàn)卡頓,響應(yīng)速度快,,減少用戶等待的時間,,滿足用戶期望。 穩(wěn):減低 crash 率和 ANR 率,,不要在用戶使用過程中崩潰和無響應(yīng),。 ?。汗?jié)省流量和耗電,減少用戶使用成本,,避免使用時導(dǎo)致手機(jī)發(fā)燙,。 小:安裝包小可以降低用戶的安裝成本,。 要想達(dá)到這4個目標(biāo),,具體實(shí)現(xiàn)是在右邊框里的問題:卡頓、內(nèi)存使用不合理,、代碼質(zhì)量差,、代碼邏輯亂、安裝包過大,,這些問題也是在開發(fā)過程中碰到最多的問題,,在實(shí)現(xiàn)業(yè)務(wù)需求同時,也需要考慮到這點(diǎn),,多花時間去思考,如何避免功能完成后再來做優(yōu)化,,不然的話等功能實(shí)現(xiàn)后帶來的維護(hù)成本會增加,。 卡頓優(yōu)化卡頓根本原因 根據(jù)Android 系統(tǒng)顯示原理可以看到,影響繪制的根本原因有以下兩個方面:
繪制耗時太長,,有一些工具可以幫助我們定位問題。主線程太忙則需要注意了,,主線程關(guān)鍵職責(zé)是處理用戶交互,,在屏幕上繪制像素,并進(jìn)行加載顯示相關(guān)的數(shù)據(jù),,所以特別需要避免任何主線程的事情,,這樣應(yīng)用程序才能保持對用戶操作的即時響應(yīng)??偨Y(jié)起來,,主線程主要做以下幾個方面工作:
除此之外,應(yīng)該盡量避免將其他處理放在主線程中,,特別復(fù)雜的數(shù)據(jù)計算和網(wǎng)絡(luò)請求等,。 1.布局優(yōu)化布局是否合理主要影響的是頁面測量時間的多少,我們知道一個頁面的顯示測量和繪制過程都是通過遞歸來完成的,,多叉樹遍歷的時間與樹的高度h有關(guān),,其時間復(fù)雜度 O(h),,如果層級太深,每增加一層則會增加更多的頁面顯示時間,,所以布局的合理性就顯得很重要,。 那布局優(yōu)化有哪些方法呢,主要通過減少層級,、減少測量和繪制時間,、提高復(fù)用性三個方面入手??偨Y(jié)如下:
2,避免過度繪制過度繪制是指在屏幕上的某個像素在同一幀的時間內(nèi)被繪制了多次,。在多層次重疊的 UI 結(jié)構(gòu)中,,如果不可見的 UI 也在做繪制的操作,就會導(dǎo)致某些像素區(qū)域被繪制了多次,,從而浪費(fèi)了多余的 CPU 以及 GPU 資源,。 如何避免過度繪制呢,如下:
3,,啟動優(yōu)化通過對啟動速度的監(jiān)控,,發(fā)現(xiàn)影響啟動速度的問題所在,,優(yōu)化啟動邏輯,提高應(yīng)用的啟動速度,。啟動主要完成三件事:UI 布局,、繪制和數(shù)據(jù)準(zhǔn)備。因此啟動速度優(yōu)化就是需要優(yōu)化這三個過程:
4,,合理的刷新機(jī)制在應(yīng)用開發(fā)過程中,,因?yàn)閿?shù)據(jù)的變化,需要刷新頁面來展示新的數(shù)據(jù),,但頻繁刷新會增加資源開銷,并且可能導(dǎo)致卡頓發(fā)生,,因此,,需要一個合理的刷新機(jī)制來提高整體的 UI 流暢度。合理的刷新需要注意以下幾點(diǎn):
5,,其他在實(shí)現(xiàn)動畫效果時,,需要根據(jù)不同場景選擇合適的動畫框架來實(shí)現(xiàn)。有些情況下,,可以用硬件加速方式來提供流暢度,。 內(nèi)存優(yōu)化一、 Android的內(nèi)存機(jī)制Android的程序由Java語言編寫,,所以Android的內(nèi)存管理與Java的內(nèi)存管理相似,。程序員通過new為對象分配內(nèi)存,所有對象在java堆內(nèi)分配空間,;然而對象的釋放是由垃圾回收器來完成的,。C/C++中的內(nèi)存機(jī)制是“誰污染,,誰治理”,java的就比較人性化了,,給我們請了一個專門的清潔工(GC),。 二、Android的內(nèi)存溢出Android的內(nèi)存溢出是如何發(fā)生的? Android的虛擬機(jī)是基于寄存器的Dalvik,,它的最大堆大小一般是16M,,有的機(jī)器為24M。因此我們所能利用的內(nèi)存空間是有限的,。如果我們的內(nèi)存占用超過了一定的水平就會出現(xiàn)OutOfMemory的錯誤,。 為什么會出現(xiàn)內(nèi)存不夠用的情況呢?我想原因主要有兩個:
常見內(nèi)存泄漏場景如果在內(nèi)存泄漏發(fā)生后再去找原因并修復(fù)會增加開發(fā)的成本,,最好在編寫代碼時就能夠很好地考慮內(nèi)存問題,,寫出更高質(zhì)量的代碼,這里列出一些常見的內(nèi)存泄漏場景,,在以后的開發(fā)過程中需要避免這類問題,。
優(yōu)化內(nèi)存空間沒有內(nèi)存泄漏,并不意味著內(nèi)存就不需要優(yōu)化,,在移動設(shè)備上,,由于物理設(shè)備的存儲空間有限,Android 系統(tǒng)對每個應(yīng)用進(jìn)程也都分配了有限的堆內(nèi)存,,因此使用最小內(nèi)存對象或者資源可以減小內(nèi)存開銷,,同時讓GC 能更高效地回收不再需要使用的對象,讓應(yīng)用堆內(nèi)存保持充足的可用內(nèi)存,,使應(yīng)用更穩(wěn)定高效地運(yùn)行,。常見做法如下:
穩(wěn)定性優(yōu)化Android 應(yīng)用的穩(wěn)定性定義很寬泛,,影響穩(wěn)定性的原因很多,,比如內(nèi)存使用不合理、代碼異常場景考慮不周全,、代碼邏輯不合理等,,都會對應(yīng)用的穩(wěn)定性造成影響,。其中最常見的兩個場景是:Crash 和 ANR,這兩個錯誤將會使得程序無法使用,,比較常用的解決方式如下:
耗電優(yōu)化在移動設(shè)備中,,電池的重要性不言而喻,,沒有電什么都干不成。對于操作系統(tǒng)和設(shè)備開發(fā)商來說,,耗電優(yōu)化一致沒有停止,,去追求更長的待機(jī)時間,而對于一款應(yīng)用來說,,并不是可以忽略電量使用問題,,特別是那些被歸為“電池殺手”的應(yīng)用,最終的結(jié)果是被卸載,。因此,,應(yīng)用開發(fā)者在實(shí)現(xiàn)需求的同時,需要盡量減少電量的消耗,。 在 Android5.0 以前,,在應(yīng)用中測試電量消耗比較麻煩,也不準(zhǔn)確,,5.0 之后專門引入了一個獲取設(shè)備上電量消耗信息的 API:Battery Historian,。Battery Historian 是一款由 Google 提供的 Android 系統(tǒng)電量分析工具,和Systrace 一樣,是一款圖形化數(shù)據(jù)分析工具,,直觀地展示出手機(jī)的電量消耗過程,,通過輸入電量分析文件,顯示消耗情況,,最后提供一些可供參考電量優(yōu)化的方法,。 除此之外,還有一些常用方案可提供:
小結(jié)性能優(yōu)化不是更新一兩個版本就可以解決的,,是持續(xù)性的需求,持續(xù)集成迭代反饋,。在實(shí)際的項(xiàng)目中,,在項(xiàng)目剛開始的時候,由于人力和項(xiàng)目完成時間限制,,性能優(yōu)化的優(yōu)先級比較低,,等進(jìn)入項(xiàng)目投入使用階段,就需要把優(yōu)先級提高,,但在項(xiàng)目初期,,在設(shè)計架構(gòu)方案時,性能優(yōu)化的點(diǎn)也需要提早考慮進(jìn)去,,這就體現(xiàn)出一個程序員的技術(shù)功底了,。 什么時候開始有性能優(yōu)化的需求,往往都是從發(fā)現(xiàn)問題開始,,然后分析問題原因及背景,,進(jìn)而尋找最優(yōu)解決方案,最終解決問題,,這也是日常工作中常會用到的處理方式,。 |
|