最近申請了一個比較低端的測試機,而後驚訝的發現...咱們的app居然這麼的卡...雖說app卡很煩,可是我又不用,關我啥事~ 不過做爲一個德智體美勞全面發展的新時代程序員,仍是應該「象徵性」的查一下問題。卡頓的出現無非是在主線程裏邊作了耗時操做,影響了主線程對UI的繪製,形成了卡頓的現象。 所以咱們只須要找到主線程中耗時的函數,而後對其進行異步處理便可解決問題。 因此今天我們聊一聊AndroidStudio中檢查函數耗時的工具:CPU Profiler。html
固然你們也能夠直接參考官方文檔:developer.android.google.cn/studio/prof…android
首先來講,CPU Profiler並非專門用於處理頁面卡頓掉幀的,準確說:CPU Profiler是用來查看每一個線程,在某段一段時間內執行了哪些函數,以及在其執行期間每一個函數消耗的 CPU 資源。 專門針對卡頓掉幀問題可使用內置的小工具:systrace。程序員
不整官網那麼多「花裏胡哨」的介紹,我們直擊上應用方式。性能優化
點擊啓動後,咱們就能夠看到以下的內容:網絡
不得不吐槽,Profiler用起來是真的卡app
紅框圈住的內容,從上到下依次是:異步
咱們點擊一下CPU,就能夠進一步的查看CPU的使用狀況。函數
這個圖,表示了當前CPU的使用率,固然這個使用率對應了整個手機,並不能準確的反應咱們本身app的真實狀況。接下來我們針對代碼,來看一下具體的使用:工具
我在代碼裏作了什麼呢?很簡單,一個postdelay,而後裏邊作一個入參爲40的遞歸菲波那切數列。post
Handler().postDelayed({
fibonacci(40)
}, 20000)
複製代碼
接下讓我們看一下這個函數的耗時。
咱們須要在咱們認爲合適的時機,點一下Record。
由於我這裏是delay了20秒,因此我在1七、8秒的時候Record
而後在一個合適的時機,再點一下Stop。
而後咱們就會看到這樣的結果:
這樣咱們就能夠很清晰的看到這段時間內產生的函數調用關係。鼠標移到對應的函數,還能夠看到對應的耗時。
所以咱們能夠將這段耗時函數移到異步去作,好比這樣:
不要在乎這瘋狂的Thread使用方式,就是表達一下異步的這麼個意思。哈哈~
Handler().postDelayed({
Thread {
fibonacci(40)
}.start()
}, 20000)
複製代碼
那麼接下來,我們在Record一下:
此時咱們會發現,雖然咱們的CPU使用率在上升,可是對於咱們主線程來講並無任何耗時操做(也就是第二個紅框)。
若是咱們下滑一下選項框,咱們會發現,咱們的耗時操做在這:
當咱們點擊它時,咱們就能夠看到這個線程的函數調用:
細心的小夥伴可能注意到了:分析函數調用的時候有四個選項卡可供選擇。
那它們都分別什麼意思呢?這裏簡單的介紹一下:
Call Chart:
x軸表示函數調用(或調用方)的時間段和時間,並沿y軸顯示其被調用者。 對系統 API 的函數調用顯示爲橙色,對應用自有函數的調用顯示爲綠色,對第三方 API(包括 Java 語言 API)的函數調用顯示爲藍色。
示意圖相似於這樣:
Flame Chart:
俗稱的火焰圖。對於火焰圖來講,它就是彙總了Call Chart,並按照調用順序倒序排列,就像這樣:
Top Down、Bottom Up:
這倆種模式相對比較複雜,你們能夠參考官方文檔的解釋配合使用。
這篇文章就是我想聊的內容,就是很簡單很簡單的工具應用。可是它表明了你踏出性能優化的第一步,踏出第一步將意味着,後面將有一個又一個坑等着你。
來吧,既然選擇了遠方,便只顧風雨兼程!