騰訊開源的GT,https://github.com/TencentOpen/GT
(1)什么是GT?
????GT是一款同時支持安卓手機端和IOS手機端性能測試工具凤瘦。
????GT(隨身調)宿礁,即僅憑一部手機,無需連接電腦蔬芥,就可以對APP進行快速的性能測試(CPU梆靖、內存、流量笔诵、電量返吻、幀率/流暢度等)、 開發(fā)日志的查看乎婿、Crash日志查看测僵、網絡數據包的抓取、APP內部參數的調試次酌、真機代碼耗時統(tǒng)計等等恨课;更重要的是舆乔,您可以在任意真實場所、 任何時候做如上的系列事情剂公,這就是“隨身調”希俩。
????如果您覺得GT提供的功能還不夠滿足您的需要, 您還可以利用GT提供的基礎API自行開發(fā)有特殊功能的GT插件(僅iOS版支持)纲辽, 幫助您解決更加復雜的APP調試颜武、測試問題。
(2)如何使用拖吼?
????GT支持iOS和Android兩個手機平臺鳞上,其中: Android版由一個可直接安裝的GT控制臺APP 和GT SDK插件擴展檢測。GT控制臺可以獨立安裝使用吊档,SDK需嵌入被調測的應用篙议、并利用GT控制臺進行信息展示和參數修改。 iOS版是一個Framework包怠硼,必須嵌入APP工程鬼贱,編譯出帶GT的APP才能使用;iPhone和iPad應用都能支持香璃。
以下為Android版GT控制臺APP 檢測基礎功能案例这难,使用步驟:
1、應用寶下載GT.APP葡秒,安裝運行GT姻乓。
2、選擇應用 ? ? ? ? ? ? ? ? ? ? ? ? ??????????????????????????????? ? ? ? ??? ? ? ??? ? ? ??
3眯牧、選擇關注的監(jiān)控數據 ?? ?? ? ? ? ? ? ? ? ? ? ?? ??? ??
(2)科大訊飛的iTest蹋岩,http://www.liqucn.com/rj/410791.shtml
iTest官方說該工具由科大訊飛測試技術部開發(fā),在多個項目中成功應用炸站,具有較高的準確性和穩(wěn)定性星澳。它填補了手機端自動化測試的空白,以實用高效為宗旨旱易,記錄特定應用的性能消耗情況,包括cpu腿堤、內存阀坏、流量、電量等信息笆檀。我們知道科大訊飛在業(yè)界是很有名氣的是訊飛語音忌堂。但是關于這款檢測工具,遺憾本人尋遍全網酗洒,只能查找下載安裝Apk的地址士修,查閱其他的相關介紹和資料太少枷遂。
(3)Google的開源Battery Historian,https://github.com/google/battery-historian
????Battery Historian是一款用于檢測與電池有關的信息和事件的工具棋嘲。運行在Android5.0Lollipop(APIlevel21)及其之后酒唉。它會生成一張具有時間坐標的圖紙,用戶可以查看各種事件耗電時間。官方文檔是英文版沸移,網上可以搜到大量中文資料痪伦。使用需要先配置環(huán)境,包括go/java/python/git雹锣。最后git命令下載 Battery Historian网沾,并使用命令操作?adb bugreport 得到 bugreport.txt(~16m)。使用?Battery Historian打開會生成圖表
(4)Android 自帶 Lint 工具
? ? Android Lint Tool?是 Android Sutido 集成的一個代碼規(guī)范提示工具蕊爵,使用?Lint 檢測代碼辉哥、布局文件、去除多余資源攒射。
硬編碼會提示以級別警告醋旦,例如:在布局文件中寫了三層冗余的LinearLayout布局、直接在TextView中寫要顯示的文字匆篓、字體大小使用dp而不是sp為單位浑度,就會在編輯器右邊看到提示。
使用Android Studio的lint可以清除無用的資源文件(點擊菜單欄的Analyze -> Run Inspection by Name, 輸入unused resource)鸦概。
????當然兩個都是一個簡單的舉例箩张,Lint的功能非常強大,大家應該養(yǎng)成寫完代碼查看Lint的習慣窗市,這不僅讓你及時發(fā)現代碼種隱藏的一些問題先慷,更能讓你養(yǎng)成良好的代碼風格,要知道咨察,這些Lint提示可都是Google大牛們汗水合智慧的結晶论熙。
常用的檢測操作如下:
二、性能優(yōu)化
(1)Memory Monitor 工具:
????它是Android Studio自帶的一個內存監(jiān)視工具摄狱,它可以很好地幫助我們進行內存實時分析脓诡。通過點擊Android Studio右下角的Memory Monitor標簽,打開工具可以看見較淺藍色代表free的內存媒役,而深色的部分代表使用的內存從內存變換的走勢圖變換祝谚,可以判斷關于內存的使用狀態(tài),例如當內存持續(xù)增高時酣衷,可能發(fā)生內存泄漏交惯;當內存突然減少時,可能發(fā)生GC等
(2)LeakCanary工具:
簡單,傻瓜式操作席爽,最重要的是LeakCanary 只在debug版本下檢測意荤,正版先上線后自動跳過檢測這就方便開發(fā)者無需操作每次上線時注釋檢測代碼。這個工具是Square公司在Github開源的.
第一步使用LeakCanary 我們需要先導入兩個依賴
//檢測內存泄漏
debugCompile'com.squareup.leakcanary:leakcanary-android:1.5'
releaseCompile'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
testCompile'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
compile'com.android.support:multidex:1.0.1'
2.在Application中寫方法
//檢測內存泄漏
if (LeakCanary.isInAnalyzerProcess(this)) {
return;
}
LeakCanary.install(this);
???影響穩(wěn)定性的原因很多只锻,比如內存使用不合理玖像、代碼異常場景考慮不周全、代碼邏輯不合理等炬藤,都會對應用的穩(wěn)定性造成影響御铃。其中最常見的兩個場景是:Crash 和 ANR,這兩個錯誤將會使得程序無法使用沈矿。所以做好Crash全局監(jiān)控上真,處理閃退同時把崩潰信息、異常信息收集記錄起來羹膳,以便后續(xù)分析;合理使用主線程處理業(yè)務睡互,不要在主線程中做耗時操作,防止ANR程序無響應發(fā)生
影響卡頓的兩大因素陵像,分別是界面繪制和數據處理就珠。
界面繪制:主要原因是繪制的層級深、頁面復雜醒颖、刷新不合理妻怎,由于這些原因導致卡頓的場景更多出現在 UI 和啟動后的初始界面以及跳轉到頁面的繪制上。
數據處理:導致這種卡頓場景的原因是數據處理量太大泞歉,一般分為三種情況逼侦,一是數據在處理 UI 線程,二是數據處理占用 CPU 高腰耙,導致主線程拿不到時間片榛丢,三是內存增加導致 GC 頻繁,從而引起卡頓挺庞。
(1)布局優(yōu)化
????在Android種系統(tǒng)對View進行測量晰赞、布局和繪制時,都是通過對View數的遍歷來進行操作的选侨。如果一個View數的高度太高就會嚴重影響測量掖鱼、布局和繪制的速度。Google也在其API文檔中建議View高度不宜哦過10層≡疲現在版本種Google使用RelativeLayout替代LineraLayout作為默認根布局锨用,目的就是降低LineraLayout嵌套產生布局樹的高度,從而提高UI渲染的效率隘谣。
布局復用,使用<include>標簽重用layout;
提高顯示速度寻歧,使用<ViewStub>延遲View加載掌栅;
減少層級,使用<merge>標簽替換父級布局码泛;
注意使用wrap_content猾封,會增加measure計算成本;
刪除控件中無用屬性噪珊;
(2)繪制優(yōu)化
????過度繪制是指在屏幕上的某個像素在同一幀的時間內被繪制了多次晌缘。在多層次重疊的 UI 結構中,如果不可見的 UI 也在做繪制的操作痢站,就會導致某些像素區(qū)域被繪制了多次磷箕,從而浪費了多余的 CPU 以及 GPU 資源。如何避免過度繪制阵难?
布局上的優(yōu)化岳枷。移除 XML 中非必須的背景,移除 Window 默認的背景呜叫、按需顯示占位背景圖片
自定義View優(yōu)化空繁。使用 canvas.clipRect()?幫助系統(tǒng)識別那些可見的區(qū)域,只有在這個區(qū)域內才會被繪制朱庆。
(3)啟動優(yōu)化
? ?啟動優(yōu)化工具盛泡。 應用一般都有閃屏頁SplashActivity,優(yōu)化閃屏頁的 UI 布局娱颊,可以通過 Profile GPU Rendering 檢測丟幀情況傲诵。
? ? (另外,還可以IDE自帶的一款UI繪制檢測圖形化數據分析工具?Systrace 维蒙,4.0版本以上版本可以使用掰吕。這里暫不介紹)
????啟動白屏或黑屏問題優(yōu)化處理。當我們在啟動一個應用時颅痊,系統(tǒng)會去檢查是否已經存在這樣一個進程殖熟,如果不存在,系統(tǒng)的服務會先檢查startActivity中的intent的信息斑响,然后在去創(chuàng)建進程菱属,最后啟動Acitivy,即冷啟動舰罚。而啟動出現白黑屏的問題纽门,就是在這段時間內產生的。系統(tǒng)在繪制頁面加載布局之前营罢,首先會初始化窗口(Window)赏陵,而在進行這一步操作時饼齿,系統(tǒng)會根據我們設置的Theme來指定它的Theme 主題顏色,我們在Style中的設置就決定了顯示的是白屏還是黑屏蝙搔。詳情查看請點擊
<style name="Theme.Splash" parent="AppTheme">
? ? ? ? <item name="windowNoTitle">true</item>
? ? ? ? <item name="android:windowContentOverlay">@null</item>
? ? ? ? <item name="android:windowBackground">@drawable/splash_pic</item>
? ? ? ? <item name="android:windowFullscreen">true</item>
? ? </style>
????啟動加載邏輯優(yōu)化處理缕溉。閃屏頁的存在可以說就是啟動優(yōu)化,通常在閃屏頁延遲2秒跳轉到主界面吃型,但是在進入首頁的時候证鸥,首頁復雜的View渲染以及必須在UI線程執(zhí)行的業(yè)務邏輯,必然拖慢了啟動速度勤晚。啟動閃屏頁雖然簡單執(zhí)行快枉层,首頁卻復雜執(zhí)行慢,應用啟動前輕后重赐写∧窭可以采用分布加載、異步加載血淌、延期加載策略來提高應用啟動速矩欠。例如,把SplashActivity改成SplashFragment,應用程序的入口變成MainActivity悠夯,在MainActivity中先展示SplashFragment癌淮,顯示完畢后再移除SplashFragment。這樣沦补,在SplashFragment的2S的友好時間內進行數據準備的同時乳蓄,首頁的View就能夠被加載,首頁的業(yè)務邏輯就能夠被執(zhí)行夕膀。在閃屏頁窗口加載完畢后虚倒,我們加載activity_main的布局,考慮到這個布局有可能比較復雜产舞,耽誤View的解析時間魂奥,可以采用ViewStub的形式進行懶加載。
(4)刷新優(yōu)化
減少刷新次數易猫,靈活利用緩存及限時刷新耻煤;
縮小刷新區(qū)域,局部刷新准颓,避免多余請求哈蝇;
(5)動畫優(yōu)化
? ????需要實現動畫效果時,需要根據不同場景選擇合適的動畫框架來實現攘已。
??????有些情況下炮赦,可以用硬件加速方式來提供流暢度降低動畫卡頓。
(三)耗電優(yōu)化
1)避免 Wake Lock 使用不當样勃。
? ??Wake Lock是一種鎖的機制吠勘,主要是相對系統(tǒng)的休眠而言的性芬,,只要有人拿著這個鎖,系統(tǒng)就無法進入休眠意思就是我的程序給CPU加了這個鎖那系統(tǒng)就不會休眠了看幼,這樣做的目的是為了全力配合我們程序的運行批旺。有的情況如果不這么做就會出現一些問題,比如微信等及時通訊的心跳包會在熄屏不久后停止網絡訪問等問題诵姜。所以微信里面是有大量使用到了Wake_Lock鎖。系統(tǒng)為了節(jié)省電量搏熄,CPU在沒有任務忙的時候就會自動進入休眠棚唆。有任務需要喚醒CPU高效執(zhí)行的時候,就會給CPU加Wake_Lock鎖心例。大家經常犯的錯誤宵凌,我們很容易去喚醒CPU來工作,但是很容易忘記釋放Wake_Lock止后。
(2)使用 Job Scheduler?管理后臺任務瞎惫。
???在Android 5.0 API 21 中,google提供了一個叫做JobScheduler API的組件译株,來處理當某個時間點或者當滿足某個特定的條件時執(zhí)行一個任務的場景瓜喇,例如當用戶在夜間休息時或設備接通電源適配器連接WiFi啟動下載更新的任務。這樣可以在減少資源消耗的同時提升應用的效率歉糜。
(四)減少安裝包(APK)大小
? ? 其實APK大小對應用使用并沒有影響乘寒,但應用的安裝包越大,用戶下載的門檻越高匪补。例如伞辛,應用版本的迭代更新,特別是當用戶在移動網絡情況下夯缺,又不得不去下載安裝包蚤氏,才能使用產品滿足自身需求。因此踊兜,開發(fā)應該減小安裝包大小竿滨,使得讓更多用戶愿意下載產品和體驗產品
2.資源優(yōu)化。比如使用?Android Lint?刪除冗余資源润文,資源文件最少化等姐呐。(這個前面已經講過了)
3.圖片優(yōu)化。比如利用?PNG優(yōu)化工具?對圖片做壓縮處理典蝌。如果應用在4.0版本以上曙砂,推薦使用WebP圖片格式
4.插件化熱修復開發(fā)。比如功能模塊放在服務器上骏掀,按需下載鸠澈,可以減少安裝包大小柱告。
5.避免重復或無用功能的第三方庫。例如笑陈,百度地圖接入基礎地圖即可际度、訊飛語音無需接入離線、圖片庫Glide\Picasso等
需要避免內存抖動
內存抖動是由于短時間內有大量對象進出Young Generiation區(qū)導致的涵妥,它伴隨著頻繁的GC
下面是避免發(fā)生內存抖動的幾點建議:
盡量避免在循環(huán)體內創(chuàng)建對象乖菱,應該把對象創(chuàng)建移到循環(huán)體外。
注意自定義View的onDraw()方法會被頻繁調用蓬网,所以在這里面不應該頻繁的創(chuàng)建對象窒所。
當需要大量使用Bitmap的時候,試著把它們緩存在數組中實現復用帆锋。
對于能夠復用的對象吵取,同理可以使用對象池將它們緩存起來