應(yīng)用的啟動速度緩慢這是很多開發(fā)者都遇到的一個問題,比如啟動緩慢導(dǎo)致的黑屏,白屏問題,大部分的答案都是做一個透明的主題,或者是做一個Splash界面,但是這并沒有從根本上解決這個問題。那么如何從根本上解決這個問題或者做到一定程度的緩解?
創(chuàng)新互聯(lián)專注于網(wǎng)站制作、成都網(wǎng)站設(shè)計、網(wǎng)頁設(shè)計、網(wǎng)站制作、網(wǎng)站開發(fā)。公司秉持“客戶至上,用心服務(wù)”的宗旨,從客戶的利益和觀點出發(fā),讓客戶在網(wǎng)絡(luò)營銷中找到自己的駐足之地。尊重和關(guān)懷每一位客戶,用嚴謹?shù)膽B(tài)度對待客戶,用專業(yè)的服務(wù)創(chuàng)造價值,成為客戶值得信賴的朋友,為客戶解除后顧之憂。
1、冷啟動:當(dāng)啟動應(yīng)用時,后臺沒有該應(yīng)用的進程,這時系統(tǒng)會首先會創(chuàng)建一個新的進程分配給該應(yīng)用,這種啟動方式就是冷啟動。
2、熱啟動:當(dāng)啟動應(yīng)用時,后臺已有該應(yīng)用的進程,比如按下home鍵,這種在已有進程的情況下,這種啟動會從已有的進程中來啟動應(yīng)用,這種啟動方式叫熱啟動。
3、溫啟動 :當(dāng)啟動應(yīng)用時,后臺已有該應(yīng)用的進程,但是啟動的入口Activity被干掉了,比如按了back鍵,應(yīng)用雖然退出了,但是該應(yīng)用的進程是依然會保留在后臺,這種啟動方式叫溫啟動。
adb shell am start -W [PackageName]/[PackageName.MainActivity]
執(zhí)行成功后將返回三個測量到的時間:
這里面涉及到三個時間,ThisTime、TotalTime 和 WaitTime。WaitTime 是 startActivityAndWait 這個方法的調(diào)用耗時,ThisTime 是指調(diào)用過程中最后一個 Activity 啟動時間到這個 Activity 的 startActivityAndWait 調(diào)用結(jié)束。TotalTime 是指調(diào)用過程中第一個 Activity 的啟動時間到最后一個 Activity 的 startActivityAndWait 結(jié)束。如果過程中只有一個 Activity ,則 TotalTime 等于 ThisTime。
總結(jié):如果只關(guān)心某個應(yīng)用自身啟動耗時,參考TotalTime;如果關(guān)心系統(tǒng)啟動應(yīng)用耗時,參考WaitTime;如果關(guān)心應(yīng)用有界面Activity啟動耗時,參考ThisTime。
從我們Application開始到首頁顯示出來,這個過程,我們應(yīng)該注意一些什么,將這個過程細分一下,會有下面的時間點需要注意。
Application的構(gòu)造器方法——attachBaseContext()——onCreate()——Activity的構(gòu)造方法——onCreate()——配置主題中背景等屬性——onStart()——onResume()——測量、布局、繪制顯示在界面上。
因為上面這些階段全部都是在主線程中執(zhí)行的,任何不經(jīng)意的操作都可能拖慢應(yīng)用的啟動速度。所以我們不應(yīng)在Application以及Activity的生命周期回調(diào)中做任何費時操作,具體指標大概是你在onCreate,onResume,onStart等回調(diào)中所花費的總時間最好不要超過400ms,否則用戶在桌面點擊你的應(yīng)用圖標后,將感覺到明顯的卡頓。但是有些 不得以的任務(wù) 又必須在UI顯示之前執(zhí)行。所以我們要將 任務(wù) 劃分優(yōu)先級。
對于首頁渲染完成后,開始加載,或者延遲加載,延遲加載的目的就是界面先顯示出來,然后加載,但是你覺得要延遲多久呢?在 Android 的高端機型上,應(yīng)用的啟動是非??斓?, 這時候只需要 Delay 很短的時間就可以了, 但是在低端機型上,應(yīng)用的啟動就沒有那么快了,而且現(xiàn)在應(yīng)用為了兼容舊的機型,往往需要 Delay 較長的時間,這樣帶來體驗上的差異是很明顯的。延遲加載有一種方式。
極力推薦用第二種,在窗口完成以后進行加載,這里面的run方法是在onResume之后運行的。關(guān)于這種懶加載機制,參考 Android應(yīng)用啟動優(yōu)化:一種DelayLoad的實現(xiàn)和原理(上篇) ,給出了詳細的解釋。
通過上面我們知道一種懶加載機制,所以我們可以將Application中和首頁的onCreate中的有些耗時任務(wù),放到首頁渲染完畢后加載。如何找出這些耗時任務(wù),TraceView就派上用場了,TraceView的用法,移步我的前面的博客 Android性能優(yōu)化第(六)篇---TraceView 分析圖怎么看?
比如在首頁的onCreate中我們進行了用戶啟動上報,這個進行懶加載是不是分分鐘減少139毫秒呢?
在比如在Application里面用到了GSON,將String轉(zhuǎn)化成json,我將這個移動到懶加載里面,是不是又減少了100毫秒呢?
在比如,有些Application中做了支付SDK的初始化,用戶又不會一打開App就要支付,放在Application中加載干嘛?
此處我們這里舉得例子是優(yōu)化了139毫秒和100毫秒的,其實真正耗時的任務(wù)有的有1秒多,都被我優(yōu)化完了,所以trace圖中看不到了,就舉個了這兩個例子,還有SharedPreferences也是耗時大戶,經(jīng)過檢測保存一個boolean變量耗時120+毫秒以上。
利用TraceView可以清楚我們每一個方法的耗時時間,極大的幫助了我們做優(yōu)化工作。
五、優(yōu)化思路總結(jié)
1、UI渲染優(yōu)化,去除重復(fù)繪制,減少UI重復(fù)繪制時間,打開設(shè)置中的GPU過度繪制開關(guān),各界面過度繪制不應(yīng)超過2.5x;也就是打開此調(diào)試開關(guān)后,界面整體呈現(xiàn)淺色,特別復(fù)雜的界面,紅色區(qū)域也不應(yīng)該超過全屏幕的四分之一;
2、根據(jù)優(yōu)先級的劃分,KoMobileApplication的一些初始化工作能否將任務(wù)優(yōu)先級劃分成3,在首頁渲染完成后進行加載,比如:PaySDKManager。
3、主線程中的所有SharedPreference能否在非UI線程中進行,SharedPreferences的apply函數(shù)需要注意,因為Commit函數(shù)會阻塞IO,這個函數(shù)雖然執(zhí)行很快,但是系統(tǒng)會有另外一個線程來負責(zé)寫操作,當(dāng)apply頻率高的時候,該線程就會比較占用CPU資源。類似的還有統(tǒng)計埋點等,在主線程埋點但異步線程提交,頻率高的情況也會出現(xiàn)這樣的問題。
4、檢查BaseActivity,不恰當(dāng)?shù)牟僮鲿绊懰凶覣ctivity的啟動。
5、對于首次啟動的黑屏問題,對于“黑屏”是否可以設(shè)計一個.9圖片替換掉,間接減少用戶等待時間。
6、對于網(wǎng)絡(luò)錯誤界面,友好提示界面,使用ViewStub的方式,減少UI一次性繪制的壓力。
7、任務(wù)優(yōu)先級為2,3的,通過下面這種方式進行懶加載的方式
8、Multidex的使用,也是拖慢啟動速度的元兇,必須要做優(yōu)化。后面有空專門寫一篇Multidex。
相關(guān)鏈接:
Android應(yīng)用啟動優(yōu)化:一種DelayLoad的實現(xiàn)和原理(上篇)
Android性能優(yōu)化之加快應(yīng)用啟動速度
手機淘寶性能優(yōu)化全記錄
Android客戶端性能優(yōu)化(魅族資深工程師毫無保留奉獻)
Please accept mybest wishes for your happiness and success !
通過上圖先把用戶-電量這一流程抽象出來,設(shè)備的耗電根本原因在于對硬件的使用,耗電越嚴重說明對硬件使用的越頻繁。用戶對app頻繁使用說明了你用戶黏性做的好,我們不能左右,所以我們要在app對硬件調(diào)用上做優(yōu)化來達到節(jié)省電量的目的。
先看下移動設(shè)備元件耗電大戶有哪些:
屏幕是耗電最大元件之一,但是用戶要和app交互就要點亮屏幕,有人可能會覺得屏幕的明暗是用戶自己根據(jù)喜好設(shè)定的,我們無可奈何。其實不然,在有些時候是可以通過UI的設(shè)計來減少屏幕電能消耗的。
在這之前我們先來看下目前常用手機屏幕材質(zhì):LCD和LED(OLED)。
無線網(wǎng)絡(luò)主要是WIFI和移動運營商網(wǎng)絡(luò),通常情況下使用移動網(wǎng)絡(luò)要比WIFI耗電要多一些。
這三種狀態(tài)有一個轉(zhuǎn)換流程:
通過上面了解網(wǎng)絡(luò)連接過程,應(yīng)該心里有了大概的優(yōu)化建議。
精簡后
①請求一個圖片時,客戶端提供一個分辨率大小,服務(wù)器根據(jù)分辨率把裁剪縮放后的圖片給客戶端返回。也可以使用Android端使用Bitmap.Option自行獲取縮放的圖片
②使用webp圖片。
后面的章節(jié)會寫一些關(guān)于電量檢測分析工具的使用。
為了耗電優(yōu)化干的這些活用戶感知不到,但是如果不去優(yōu)化,肆意使用,那用戶就很容易感知到了。
當(dāng)點擊app的啟動圖標時,安卓系統(tǒng)會從Zygote進程中fork創(chuàng)建出一個新的進程分配給該應(yīng)用,之后會依次創(chuàng)建和初始化Application類、創(chuàng)建MainActivity類、加載主題樣式Theme中的
windowBackground等屬性設(shè)置給MainActivity以及配置Activity層級上的一些屬性、再inflate布局、當(dāng)onCreate/onStart/onResume方法都走完了后最后才進行contentView的measure/layout/draw顯示在界面上,所以直到這里,
應(yīng)用的第一次啟動才算完成,這時候我們看到的界面也就是所說的第一幀。所以,總結(jié)一下,應(yīng)用的啟動流程如下:
Application的構(gòu)造器方法——attachBaseContext()——onCreate()——Activity的構(gòu)造方法——onCreate()——配置主題中背景等屬性——onStart()——onResume()——測量布局繪制顯示在界面上。
1、冷啟動:當(dāng)啟動應(yīng)用時,后臺沒有該應(yīng)用的進程,這時系統(tǒng)會重新創(chuàng)建一個新的進程分配給該應(yīng)用,這個啟動方式就是冷啟動。
2、熱啟動:當(dāng)啟動應(yīng)用時,后臺已有該應(yīng)用的進程(例:按back鍵、在已有進程的情況下,這種啟動會從已有的進程中來啟動應(yīng)用,這個方式叫熱啟動
1、冷啟動:冷啟動因為系統(tǒng)會重新創(chuàng)建一個新的進程分配給它,所以會先創(chuàng)建和初始化Application類,再創(chuàng)建和初始化MainActivity類(包括一系列的測量、布局、繪制),最后顯示在界面上。
2、熱啟動:熱啟動因為會從已有的進程中來啟動,所以熱啟動就不會走Application這步了,而是直接走MainActivity(包括一系列的測量、布局、繪制),所以熱啟動的過程只需要創(chuàng)建和初始化一個MainActivity就行了,而不必創(chuàng)建和初始化Application
黑白屏產(chǎn)生原因:當(dāng)我們在啟動一個應(yīng)用時,系統(tǒng)會去檢查是否已經(jīng)存在這樣一個進程,如果不存在,系統(tǒng)的服務(wù)會先檢查startActivity 中的intent 的信息,然后在去創(chuàng)建進程,最后啟動Acitivy,即冷啟動。
而啟動出現(xiàn)白黑屏的問題,就是在這段時間內(nèi)產(chǎn)生的。系統(tǒng)在繪制頁面加載布局之前,首先會初始化窗口(Window),而在進行這一步操作時,系統(tǒng)會根據(jù)我們設(shè)
置的Theme 來指定它的Theme 主題顏色,我們在Style 中的設(shè)置就決定了顯示的是白屏還是黑屏。
1.Application 優(yōu)化(懶加載,延時加載)
2.UI效果,背景圖
3.fragment的懶加載
4.延時加載
當(dāng)前標題:android性能優(yōu)化,Android性能優(yōu)化工程師
當(dāng)前地址:http://jinyejixie.com/article2/hojhic.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、全網(wǎng)營銷推廣、響應(yīng)式網(wǎng)站、自適應(yīng)網(wǎng)站、網(wǎng)站內(nèi)鏈、網(wǎng)頁設(shè)計公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)