PS:行吧,不用百度了,逮蝦戶是《頭文字D》的一首配樂《Deja vu》,中文諧音 「逮蝦戶」,飆車漂移專用BGM,有時音樂響起也暗示着:開車。bash
固然本節討論的不是開車,而是Android開發中老生常談的程序調試。網絡
一個開發仔的平常離不開:寫BUG和解BUG,特別是多人協做的時候, 幫別人擦屁股(解Bug)的狀況家常便飯。另外,接盤別人的項目,着手解 Bug也能幫你快速的上手項目。綜上,修煉好「調試」這門技能顯得尤其重要。 可是,可是感受不少玩家還停留下無腦打印的階段,因此有了這篇文章。數據結構
筆者儘可能以最精簡的方式來過一過Android調試中的常(qi)規(ji)操(yin)做(qiao)。工具
逮蝦戶~佈局
解釋下這個標題:post
- 無腦:以爲哪裏有問題,就打印哪裏。
- 靜態:每次想打印,都要去修改代碼,而後從新運行程序。
適用於:想查看變量的值在某一時刻是否異常!性能
接着來講下兩種經常使用的調試方法:學習
新手Android開發仔最愛調試法,使用簡便,僅需一行代碼,輕鬆打印:測試
Toast.makeText(MainActivity.this, "Toast調試", Toast.LENGTH_SHORT).show();
複製代碼
方即是挺方便的,不過有一點要注意:Android 5.0後,若是把「消息通知的權限」 關閉掉的話,部分機型是不會顯示Toast的!你還可使用Snackbar來顯示值進行調試:this
Snackbar.make(父view, "Snackbar調試", Snackbar.LENGTH_SHORT).show();
複製代碼
或者其餘變通的方法,好比在頁面上添加一個TextView,把值直接顯示在文本框上。
Toast調試是挺爽的,可是有兩個問題:
可能你一走神,沒來得及看調試的值,Toast就消失了。咱們着實須要一種無需擔憂調試 結果消失的方法——「Log日誌打印法」,就是利用Android系統提供的Log類,在調試 的地方,把日誌打印到「Logcat控制檯」上,使用方法也很是簡單:
Log.d("TAG", "Log調試")
複製代碼
當代碼執行到這一句的時候,就會在Logcat控制檯打印調試信息,另外Logcat默認 會打印出全部的日誌信息,咱們能夠作一些過濾來定位到咱們調試的日誌信息。 首先是:「日誌類型」,Android支持6種日誌類型,依次以下:
舒適提示:
不要上來就Error級別,我之前打Log所有用Log.e,緣由是日誌信息是紅色的,好看... 結果被組長屌了一頓,o(TωT)o ,以爲顏色很差看,你能夠按照下述的操做進行自定義。
打開「Settings」-> 「Editor」->「Colors Scheme」->「Android Logcat」 選擇日誌類型,而後去掉勾選,而後點擊選擇顏色色值
這是筆者配色方案,讀者能夠自行調整爲喜歡的顏色:
- Assert:8F0005
- Debug:0070BB
- Error:FF0006
- Info:48BB31
- Verbose:BBBBBB
- Warning:BBBB23
設置後的配色如圖所示:
行吧,知道能夠經過Log類打印調試和自定義Logcat配色,順帶也提提「日誌過濾」的姿式吧。
可選設置內容以下:
右側還能夠「過濾日誌信息」,支持正則,再右面是過濾特定日誌的選項。
若是以爲還不夠的話,能夠點擊最右側的「Edit Filter Configuration」來配置一個本身的過濾器。
另外,還能夠對進行「日誌搜索」,鼠標點擊Logcat中間區域得到焦點,Ctrl + F 調出 搜索工具欄,接着搜索相關的日誌內容。
順帶提下Log類的一個容易忽略的小坑:
Log類只會打印4000個字符,超過部分不打印!!!
其實就是用Android Studio提供的Debug模式來程序調試,相比起前面的 Toast打印法和Log日誌打印法,稍微複雜一點,要點學習成本,還有動腦子, 最重要是能夠動態調試,不少新手玩家貌似對這個都望而卻步,其實不難,待我 帶你九淺一深,em...由淺入深走一遭,來學學Android Studio Debug核心技巧。
通常的調試流程圖以下所示:(核心就是下斷點,單步調試,值跟蹤)
先說說斷點,不是張敬軒的《斷點》,調試時的斷點的做用是:
當程序執行到斷點所在的代碼時,會暫停應用程序的運行,線程被掛起,而後 能夠經過調試器進行跟蹤。
下斷點的方式也很簡單,點擊某行代碼的左側,會出現如圖所示的小紅點。
這個小紅點就是斷點,而在AS中,又有着多種類型的斷點,帶大家過一遍吧:
就是上面這種,對特定行進行調試時用到,點擊行所在的左側邊欄便可設置。 右鍵點擊這個斷點,會彈出以下所示的設置對話框:
若是你取消了Enabled勾選,斷點就處於如圖所示的禁用狀態:
若是你把斷點下到一個方法前,斷點就會變成這樣:
這個就是方法斷點,通常用來檢查方法的「輸入參數」與「返回值」。
有時咱們對程序運行過程並不關心,而只關注某個變量的變化,能夠在變量定義前加一個斷點。
在程序運行過程當中,若是該變量的值發生改變,程序會自動停下來,並定位到變量值改變的地方,供開發者調試。
另外,右鍵還能夠設置斷點,Watch面板有兩個特有的選項,可按需勾選:
- Field access:字段被訪問時觸發斷點。
- Field modification:字段被修改時觸發斷點。
有時會有這樣的場景:把斷點打到循環體的中,咱們只關心特定循環次數下的運行狀況。 好比一個循環10次的循環體,咱們想知道循環到第8次時的運行狀況,若是你不知道 條件斷點的話,你須要一直按「Run to Cursor」直到知足咱們的條件。好比下面的代碼:
咱們想知道當i = 8的時候,sum爲多少,你須要一直按「Run to Cursor」
按7次,直到i = 9位置,若是用條件斷點,當循環體執行到某個條件才停下來,右鍵斷點,輸入如圖所示的等式條件:
而後能夠發現,程序直接跳到i=8的時候才掛起,很是方便。
調試的時候咱們能夠經過打印日誌的方式來定位異常代碼大概位置,以縮小引起問題的範圍,而後 再使用斷點精肯定位問題。若是是普通的打印日誌,咱們須要等待從新構建程序,若是用「日誌斷點」 就避免這個無心義的等待。使用日誌斷點很是簡單,右鍵斷點,去掉「Suspend」的勾選,會出現 以下所示的彈窗,勾選「Evaluate and log」在此輸入想輸出的內容。
運行調試後,當執行到日誌斷點的時候能夠看到控制檯輸出了對應的日誌信息,並且程序正常運行,並不會掛起。
若是想查看更詳細的信息,好比斷點的位置和觸發時的堆棧信息,能夠勾選「"Breakpint hit" message」和「Stacktrace」,勾選後輸出內容會變得更詳細:
所謂的臨時斷點就是:觸發一次後就自動刪除的斷點。設置的方法有兩種:
鼠標點擊後能夠去掉臨時斷點,若是想把臨時斷點變成普通斷點,能夠取消勾選 「Remove once hit」的選項。
用於監聽程序異常,一旦程序奔潰,直接定位到異常所在的確切位置。依次點擊: 「Run」->「View Breakpoints」打開斷點視圖。點擊「+」,而後選擇 「Java Exception Breakpoints」,在彈出的窗口中輸入要調試的異常:
除了設置異常斷點外,你在這裏看到項目設置的全部斷點,並進行斷點管理與配置。 另外,你還能夠設置自定義異常斷點,點擊「4.Exception Breakpoints」自行配置便可。
大部分的同窗調試都是經過點擊下面這個只小蟲子進入調試模式。
這種方法有個缺點就是:每次都須要從新運行程序,可能有這樣的場景:把APP丟給測試 測試,而後出現了一個很稀有的BUG,此時你若是用普通的Debug模式,須要重啓APP,可是 Bug不必定可以復現,這就很尷尬了。對於須要動態調試的場景,能夠「直接調試正在運行的 Android進程」,點擊以下所示的另外一個有小蟲子的圖標:
而後選擇要調試的包名,就能夠無需重啓應用直接進行調試了:
這裏把調試工具劃分爲如圖所示的五個區域一個個講解:
圖標 | 名稱 | 功能描述 |
---|---|---|
顯示執行點 | 定位到當前正在調試的斷點。 | |
單步跳過 | 一步一步執行,遇到方法直接執行完方法,進入下一步,不會進入方法內部。 | |
單步進入 | 一步一步執行,遇到方法且是自定義的方法,則進入方法內部,不然不會進入。 | |
強制進入 | 遇到方法不管是自定義的仍是官方類庫的,都會進入方法內部。 | |
單步跳出 | 跳出當前進入的方法,返回方法調用處的下一行(也意味着方法被執行完畢)。 | |
丟棄幀 | 若是你在某個方法內,執行完丟棄幀,當前方法會被中斷,返回方法被調用的 地方,變量的值也會重置。 |
|
執行到光標處 | 能夠看作是臨時斷點,程序運行到當前光標所在行暫停。 | |
計算表達式 | 支持在調試過程當中,經過賦值或表達式方式修改任意變量的值。 |
!!!注意:上面的執行到光標處是有個前提的:中途沒有斷點,若是你想強制執行到 光標處的話,你須要「Force Run to Cursor」,你能夠經過下述兩種方式進行操做:
- 1.光標處右鍵,選中「Force Run to Cursor」,如圖:
- 2.使用快捷鍵:Ctrl + Alt + F9。
計算表達式(Evaluate Expression)
很是實用,能夠動態地查看和修改任意變量得值,除了上面在調試窗口點擊計算器圖標能夠打開外, 你能夠在D區點擊某個變量右鍵打開。演示下修改某個變量得值:
修改完後,點擊Evaluate,結果以下:
你也能夠在這裏直接查看變量的值,示例以下:
一樣點擊 Evaluate,結果以下:
圖標 | 名稱 | 功能描述 |
---|---|---|
繼續程序運行 | 程序運行到某個斷點暫停,若是有下一個斷點,點擊後跳到這個斷點, 沒有的話,程序則繼續運行。 |
|
暫停程序運行 | 暫停程序運行。 | |
終止程序運行 | 終止程序運行。 | |
查看斷點 | 能夠查看全部的斷點,管理與斷點配置 | |
禁用全部斷點 | 切換全部斷點的狀態(啓用/禁用),禁用後,程序就不會觸發斷點。 | |
得到線程堆棧 | 顯示線程的相關信息 | |
恢復佈局 | 恢復到原始佈局 | |
設置 | 調試的相關配置,好比是否顯示執行方法後的返回值 |
這裏的幀指的是:堆棧幀,一種用於「存儲數據」和「部分過程結果」的數據結構; 每次調用方法在堆棧中都會佔用一部份內存,單位是幀,隨着方法調用而建立。 每一個堆棧幀中包括了:「傳入參數」、「返回地址」、「局部變量」以及「對程序調試提供支持的信息」。一個線程包括多個堆棧幀。
查看工具那裏能夠以上下順序切換的方方式查看幀(鼠標直接點擊也能夠),最右側的漏斗圖標 點擊後能夠過濾掉:「非本應用的幀」。另外,你還能夠右鍵堆棧幀,添加「步進過濾器」、 「導出線程」或「自定義線程顯示」。
在這個區域能夠看到堆棧幀中當前全部的數據(方法參數、本地變量、實例變量)。 右鍵某個變量,能夠進行「設置\複製變量值」,「跳轉到變量在代碼中的位置」等操做。 一個經常使用的操做:選擇**「Add to Watches」**,單獨監視這個變量的變化。
除了前面這種右鍵添加監視的方法外,你還能夠直接在E區點擊「+」進行添加。
不止監控變量,還支持監控表達式,好比上面的i+1。 關於Android Debug調試的基本操做大概就這些,多去實戰中歷練鞏固吧!
其實仍是要先電腦這個也很是簡單,安裝一個「ADB WIFI」的插件,安裝後重啓:
而後把APP的調試模式爲「Usb Device」
手機鏈接電腦,依次點擊AS的菜單欄:「Tools」->「ADB USB TO WIFI 」,而後左下角會出現:
通常來講,要掃描很久,建議本身看下手機ip,而後經過adb命令進行連接,示例以下:
adb connect 10.1.7.200:5555
# 出現下述信息表明鏈接成功:
connected to 10.1.7.200:5555
複製代碼
鏈接成功後就能夠拔掉數據線,進行無線調試了。
Android Profiler是AS 3.0後引入的性能分析工具,而Network Profiler是其中一個用於網絡分析的工具, 利用它咱們直接抓包,而不需藉助第三方的抓包工具(好比Charles)進行分析調試。 比較簡單,界面以下:
利用它能夠進行很方便的抓包操做。
關於Android程序調試的東西確定不止這些,上述的算是基本功吧。 有更多調試技巧歡迎在評論區留言~謝謝
參考文獻:
歡迎你們加入開發交流羣一塊兒討論學習,能夠添加下述的機器人小號 RobotPig,發送『菜單』 輸入對應的提示,加入對應的開發羣(Android或Python),或者在公衆號『摳腚男孩』中發送加羣~
半自動拉人,會有延時,請諒解~
PS:上一篇有童鞋在評論區留言說道在小專欄看到同樣的文章,做者其實都是我, 專欄付費,通常來講是不能把付費的文章免費放出來的,不過感受文章對不少 Android開發仔頗有用,就抽出來放掘金上了。目前在寫,內容較少,就不張揚了, Android入門向教程:新手能夠系統學習Android,中手能夠查缺補漏鞏固基礎。
(/ω\)固然若是你以爲本文對你頗有幫助,也能夠購買本文資瓷下小豬,嘿嘿~