關注一下專欄Android高級開發架構(記得看專欄簡介哦~)每天更新各種技術乾貨、進階架構知識、面試經驗分享。

問題重現

我初次發現這個問題是在升級了Android Studio 2.0之後,當時Android Studio的版本是從1.5直接升級到了2.0,一個如此大版本的跨躍說明改動肯定是比較大的。

然後從這個時候開始,每次我們將程序安裝到一臺新手機上並首次啟動時,都會經歷一個很長的白屏時間,如下圖所示:

上圖中的播放速度是實時速度,沒有經過加速或減速。可以看到,這就是一個空項目,裡面幾乎沒有任何功能,首次啟動白屏竟然持續了5秒鐘左右!雖說只是首次啟動才會白屏這麼長時間,但給用戶造成這樣的體驗,實在是顯得我們的程序太業餘了,因此必須要想辦法解決一下。

分析原因

一開始我將這個原因歸結於是Android Studio 2.0的bug,畢竟一次性做了這麼大的升級,有點bug也是很正常的。但是直到現在最新的Android Studio 2.2版本,這個問題依然還存在,好像Google完全就沒有修復它的意思,這就不太對勁了。

然後我開始動手做實驗,發現這個長時間白屏的問題其實和Android Studio的版本是沒有關係的,而是和我們使用的gradle插件版本有關係。打開build.gradle文件查看一下,代碼如下所示:

buildscript {
repositories {
jcenter()
}
dependencies {
classpath com.android.tools.build:gradle:2.1.2
}
}

可以看到,這裡我使用的gradle插件版本是2.1.2,這個版本下是會出現長時間白屏的問題的。

但如果我將gradle插件的版本號降低,比如降到2.0.0,再運行程序的話就給彈出這樣的提示:

提示我2.0.0版本的gradle插件是不支持Instant Run的,讓我升級到2.1.2。但同時你會發現,長時間白屏的問題不見了。

但這裡我還要再專門說明一下,其實並不是2.0.0版本的gradle插件不支持Instant Run,而是因為我當前使用的是2.1版的Android Studio,它和2.0.0版本的gradle插件在Instnat Run功能方面不兼容。如果你是使用的2.0版本的Android Studio,那麼你會發現2.0.0版本的gradle插件也是支持Instant Run的。

如果你有興趣的話可以把gradle插件的版本號再改低一些,比如1.5.0,或者1.3.0,這兩個插件版本就是完全不支持Instant Run功能了,你會發現它們都不會造成長時間白屏的問題。

這樣我們基本就把問題的原因定位出來了,支持Instant Run功能的時候就會出現長時間白屏的情況,不支持Instant Run功能的時候就一切正常,看來罪魁禍首果然還是Instant Run呀。

解決問題

但是Instant Run是Android Studio 2.0中重磅推出的功能,如果存在這麼嚴重的bug,那麼誰還敢使用呢?Google豈不是推出了一個廢功能?

當然不是,遇到這個問題就嚇得不敢用Instant Run的話,只能說明你對Instant Run功能沒有真正理解。Instant Run為了能夠讓我們快速部署代碼,背後其實是有一套非常複雜的邏輯的,比如要在APK中建立伺服器與Android Studio進行通信,以及代碼差異比對和替換等,這裡給大家貼一張Instant Run的工作原理圖來體驗一下:

這張圖比較複雜,看不懂也沒關係,因為我也看不懂,但是至少這讓我們能直觀地感受到Instant Run背後處理的工作是非常繁重的。

既然如此,相信大家也應該理解一下為什麼首次啟動會白屏這麼長時間,因為為了要讓Instant Run可以正常工作,我們的程序需要做非常多的初始化工作。而這一次的長時間白屏,換來的卻是後續開發效率的劇增,這個交易我認為是相當值得的。

那有的朋友可能就要產生質疑了,說我們理解有什麼用呀?用戶又不會理解什麼是Instant Run,這麼久的白屏是會嚴重損傷用戶體驗的。

但是大家有沒有想過Instant Run是用來做什麼的?是用來提升開發效率的,沒錯,就是開發效率!也就是說,只有在開發階段才會有Instant Run這個東西,在正式的產品中是完全不存在Instant Run的!

是不是一語點醒夢中人了?其實說白了,我們擔心這個長時間白屏會損傷用戶體驗純粹是在杞人憂天,Google早就幫我們都考慮過了,release版的程序是不會出現這種現象的。不信的話我現在就打一個簽名後的APK包,然後我們裝到手機上試一下,如下所示:

這和剛纔是一模一樣的程序,我沒有修改任何的代碼,只是打了一個release包,現在就沒有長時間白屏的情況了。

進一步優化

如果你的觀察力非常敏銳的話,應該能發現其實我們的程序還是會經歷一個白屏的階段,只不過非常短,瞬間就跳過了。

這個就和Instant Run無關了,這是由於在啟動的時候程序都要進行一些基本的初始化操作,所有程序都是要經歷這個過程的。

雖說這個白屏時間很短,並沒有什麼太大的影響,不過我們還是可以通過代碼來進一步優化的。修改styles.xml中主題相關的代碼,如下所示:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
......
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowNoTitle">true</item>
</style>

其中我們加入了兩個屬性,windowIsTranslucentwindowNoTitle,將這兩個屬性都設置成true,就可以讓程序在初始化的時候窗口是透明的,初始化結束後程序主界面才會顯示出來,從而也就完全看不到白屏界面了,如下圖所示:

使用這種方式,雖然白屏界面看不到了,但是由於初始化的過程中窗口是透明的,會讓用戶感覺程序啟動的響應速度稍微慢了點,不過其實這種差別都是毫秒級的,就沒必要再為這個擔心了

最後

如果你看到了這裡,覺得文章寫得不錯就點個贊唄?如果你覺得那裡值得改進的,請給我留言。一定會認真查詢,修正不足。謝謝。

有一句老話說的好:「比你優秀的對手在學習,你的仇人在磨刀,你的閨蜜在減肥,隔壁老王在練腰,我們必須不斷學習,否則我們將被學習者超越。」當然一個人學習是枯燥的,還需要一個良好的學習氛圍,因此我組建了一個學習交流探討的社羣,歡迎大家一起來交流探討共同進步。還有一些收集整理的資料,一起學習,共同進步!同時也希望讀到這的您能轉發分享關注一下我,以後還會更新技術乾貨,謝謝您的支持!

學習提升進階直通車:有任何問題,歡迎你來一起交流,互相學習

轉發+點贊,關注一下專欄Android高級開發架構(記得看專欄簡介哦~)每天更新各種技術乾貨、進階架構知識、面試經驗分享。

針對Android開發的同行,小編這邊給大家整理了一些資料,其中分享內容包括但不限於【高級UI、性能優化、移動架構師、NDK、混合式開發(ReactNative+Weex)微信小程序、Flutter等全方面的Android進階實踐技術】希望能幫助大家學習提升進階,也節省大家在網上搜索資料的時間來學習,也是可以分享給身邊好友一起學習的!

為什麼某些人會比你優秀,是因為他本身就很優秀還一直在持續努力變得更優秀,而你是不是還在滿足於現狀內心在竊喜!以後還會更新技術乾貨,謝謝您的支持!

學習提升進階直通車:有任何問題,歡迎你來一起交流,互相學習

轉發+點贊,關注一下我的專欄Android高級開發架構(記得看專欄簡介哦~)每天更新各種技術乾貨、進階架構知識、面試經驗分享。

Android高級開發架構?

zhuanlan.zhihu.com圖標
推薦閱讀:

相關文章