作者:wanbo
周末看 Android Dev Summit '19 的視頻的時候,看到一章關于 Android Studio Debug 的介紹,有很多日常非常有用的小技巧,學習了這些小技巧能很大程度的降低我們 Debug 的成本,快速定位問題的本質,今天就向大家介紹一下 Android Studio Debug 的 9 個小技巧。
沒關注的小伙伴記得關注,如果覺得這些文章有點意思,記得分享轉發評論點贊!
1. Log 過濾和折疊
有時候 Logcat 中 log 的信息很長,同時還有些我們不需要的信息也打印出來,例如下圖中的【時間+線程 ID】。
這個時候我們可以點擊 Logcat 窗口上的【設置】按鈕,設置一條 Log 需要顯示哪些關鍵信息,可設置的項有:時間、線程ID、包名、Tag name。我們可以根據自己的需要控制顯示,并且下面還會有一條 Sample Log 提供設置后的預覽效果,就像下圖中這樣。
日常開發的時候我們還會遇到另一種情況,比如根據當前 UI 的渲染情況,我們需要時刻打印 UI 的某個值,來幫助我們觀察 UI,同時當到達某種條件的時候,輸入一條我們得到的【結果 log】。也就是說在獲得我們的【結果 log】之前會有很多沒用但是又必須打印的 log,這樣當我們需要查找【結果 log】的時候就會非常麻煩。
就像上圖中這樣,我們的【結果 log】被上下【循環打印 log】包圍了,很難一下子找出來,這時候我們可以選關鍵字【右鍵】,選擇【Fold Lines Like This】,如下圖所示。
這樣我們相同關鍵字的 log 就會被折疊,當然也可以展開查看詳細 log。
2. 自定義斷點執行條件
我們來看上面這段代碼,通過字面意思我們可以得知:這是一個點擊事件執行的方法,點擊發生后通過 NavController 從當前 HomeFragment 跳轉到 EmailFragment。然后我們在第一行打了一個斷點,我們已經得知當 email 的 subject 包含 【Bonjour】關鍵字的時候,這段代碼會發生崩潰,反之不包含則不會發生崩潰,所以我們不需要每次斷點都生效。
這里我們可以右鍵斷點,在 Condition 里輸入我們的條件判斷語句,當條件允許的時候,斷點才生效。條件語句的代碼支持 Kotlin 和 JAVA 兩種語言的寫法,如下圖所示。
然后如果我們想在跳轉到 EmailFragment 之后進一步去追蹤問題,于是我在 EmailFragment 的 onCreate 方法打了一個斷點(如下圖所示),然后這里還會遇到我們之前說的問題:不符合條件的時候斷點也會生效,這時候我們該怎么辦呢?
我們可以在這個斷點上面,右鍵、點擊更多。
左邊選擇當前斷點之后,在右邊點擊【Disable until breakpoint hit】,選擇我們之前有條件判斷的斷點,那么這個新的斷點會在它所跟隨的斷點生效之后才會生效。
3. 掛起線程
當我們右鍵任意一個斷點的時候,會有一個 Suspend 選項【All、Thread】,All 也就意味著當我們在一個多線程的應用中 debug 問題的時候,一旦這個斷點生效,所有的線程都會被掛起,Thread 表示只掛起當前線程。所以當我們在某個后臺線程中 debug 問題的時候就可以選擇 Thread,這樣就不會在 debug 的時候阻塞主線程的正常功能。
還有一個打開關閉斷點的快捷鍵也分享一下:windows 用戶 Alt + Click ,mac Option + Click 。
4. 動態打印
詳細很多人包括我之前在 debug 的時候,都會在需要 debug 的地方增加 print 輸出一下信息供自己排查錯誤,這里提供一種快捷方便的方法,可以既不污染我們的代碼,又可以隨時輸出任意信息。
如上圖所示,在需要打印的地方增加斷點,然后取消所有線程的掛起,選擇【Evaluate and log】,屬于我們需要打印的語句,當代碼執行到斷點的時候,不會暫停,而會根據我們設置的打印信息輸出 log,是不是很方便?
5. 斷點分組
通常遇到一個問題的時候,我們需要增加很多斷點去追蹤問題的原因,當問題解決之后,往往會忘記取消這些斷點,導致在某次調試的時候,設備會被之前的斷點所暫停,會讓我們很無語。這里我們可以 debug 的時候在某個斷點上:右鍵、更多,然后選擇這個問題所有相關的斷點,將它們分到同一個 Group 里面,那么這一個組的斷點就可以統一開關、統一刪除。
6. 斷點上一步
說到這個真的很痛心,常常因為自己在 debug 的時候,由于下一步點擊的太快了而錯過了問題關鍵行,只能重新運行一次代碼,重新 debug 然后自己一次次點擊下一步。
在運行 Android 10 的設備上,debug 界面中提供了一個叫【Drop frame】的按鈕,可以供我們跳出當前方法棧,返回上一步,這樣就會避免我們因為錯過斷點而不得不重新運行代碼。
7. 觀察對象
當我們 debug 的時候,可以從 debug 窗口中觀察當前作用域中的對象以及對象的屬性,有時候我們會觀察在不同頁面是否是同一個對象,之前我的做法很粗暴...就是找張紙,把這個對象的 ID 記下來,然后在另一個頁面 debug 看 ID 是否一致
這里我們可以在對象上右鍵、選擇【Mark Object】之后會讓你自定義一個 Label,然后在整個 debug 期間,相同的對象會以你設置的 Label 為 name 出現,幫助我們方便的分析是否是統一對象。
順便提一下,在任意一段代碼上,點擊行號,可以從當前斷點快速執行到目標行并暫停,這個我真是第一次知道,感覺之前 Android Studio 都白用了
而且在 debug 的時候我們可以選擇 debug 窗口中的【Evaluate expression】按鈕來動態觀察對象,點擊之后會彈出一個計算框,我們可以輸入任意當前作用域中的對象以及屬性觀察。
不得不說這個真的很方便,以前遇到這種情況我只有一種方法就是:print ,當然這里不僅僅是觀察對象,我們可以寫任意代碼觀察我們想要的值,就像下圖這樣。
8. 增量更新
我試了一下,這兩個按鈕是真的很好用啊,比重新全量運行應用真是快了不少,非常方便。
9. 錯誤棧分析
通常我們 App 中會繼承一下線上 bug 反饋的 SDK 比如 bugly,在 bugly 我們會得到崩潰的異常棧信息,類似下圖這樣。
我們可以全選復制,打開我們的 Android Studio,選擇 Analyze → Analyze Stack Trace or Thread Dump,然后把異常棧信息粘貼進去,點擊確定。
Android Studio 會在控制臺顯示這段異常棧信息,并且與現有代碼 Link 在一起,我們可以點擊跳轉到問題所在行。
好了這就是今天要分享的全部內容,關于更多詳細的內容,大家可以關注我,進入我的主頁查看,改天考慮出一個【Android Studio 使用全攻略】,感覺很多人對 AS 真的只是會用,但還有很多東西需要去學習和探索。