《Android編程權(quán)威指南》之Android應(yīng)用調(diào)試篇

處理應(yīng)用的bug,這是每個(gè)程序員的基本功,實(shí)際項(xiàng)目中天天都有各式各樣的bug,因此學(xué)會(huì)如何使用Logcat杆兵、Android Lint以及Android Studio內(nèi)置的調(diào)試器就非常有必要啦。

異常與棧跟蹤

寫(xiě)代碼嘛崎脉,一個(gè)不注意就把程序?qū)懕祭才】龋挥脫?dān)心,展開(kāi)Android DDMS工具窗口囚灼。上下滑動(dòng)LogCat窗口滾動(dòng)條骆膝,就能看到整片紅色的異常或錯(cuò)誤信息灶体。若看不到阅签,可嘗試選擇LogCat的No Filters過(guò)濾器項(xiàng)。還有可以調(diào)整Log Level位Error蝎抽,讓系統(tǒng)只輸出嚴(yán)重問(wèn)題日志政钟。

如圖,隨意寫(xiě)個(gè)空指針錯(cuò)誤樟结,LogCat就打印出了異常報(bào)告养交,告訴我們異常及其棧追蹤,我們可以從異常語(yǔ)句直接跳轉(zhuǎn)到源代碼出錯(cuò)的對(duì)應(yīng)行上瓢宦,找出奔潰原因碎连,加以修正。


Demo截圖

如果發(fā)生應(yīng)用崩潰的設(shè)備沒(méi)有與計(jì)算機(jī)連接驮履,日志信息也不會(huì)全部丟失鱼辙。設(shè)備會(huì)將最近的日志保存到日志文件中(保存時(shí)間取決具體設(shè)備廉嚼,一般十分鐘之內(nèi)有保證)。

記錄棧跟蹤日志

這個(gè)方式就是打印日志了倒戏,因?yàn)橛械臅r(shí)候代碼出現(xiàn)問(wèn)題怠噪,不一定就會(huì)造成奔潰了,就可以在需要的地方杜跷,利用Log.d(...)方式來(lái)打印相應(yīng)的信息傍念,來(lái)檢查方法是否正常調(diào)用,并且數(shù)據(jù)值是否跟預(yù)計(jì)一致了葱椭。大量的日志輸出也容易導(dǎo)致LogCat窗口信息混亂難讀捂寿,因此可以在查看的時(shí)候也可以過(guò)濾掉一些暫時(shí)不需要查看的日志口四,或者直接選擇TAG孵运,就只打印某一些log日志了。

Demo截圖
一般項(xiàng)目中都會(huì)自行封裝一個(gè)專(zhuān)門(mén)打印Log日志的類(lèi)蔓彩,用于控制整個(gè)項(xiàng)目的日志輸出治笨,github上面有個(gè)非常好用的日志輸出工具,叫 logger 它打印出來(lái)的log是這個(gè)樣子赤嚼,很方便實(shí)用旷赖。

github上截圖

地址:https://github.com/orhanobut/logger

設(shè)置斷點(diǎn)

打斷點(diǎn)也是程序員調(diào)試程序的常用方法,斷點(diǎn)會(huì)在斷點(diǎn)設(shè)置行的前一行代碼出停止運(yùn)行更卒,然后我們可以逐行檢查代碼等孵,看看接下來(lái)到底發(fā)生了什么。

Demo截圖
像這樣在需要打斷點(diǎn)的代碼那行旁邊蹂空,點(diǎn)個(gè)小紅點(diǎn)出來(lái)俯萌,此時(shí)需要調(diào)試運(yùn)行整個(gè)項(xiàng)目而不是直接運(yùn)行,單擊run旁邊的debug
Demo截圖
設(shè)備會(huì)報(bào)告說(shuō)正在等待調(diào)試器加載上枕,然后繼續(xù)運(yùn)行咐熙。然后從

Demo截圖
能看到各種信息,然后就是學(xué)習(xí)這是視圖顯示的一些信息是代表什么意思了辨萍,還有跳轉(zhuǎn)下一步啊棋恼,對(duì)斷點(diǎn)的各種操作啦什么的。
截圖取自此書(shū)

有篇文章專(zhuān)門(mén)講了Android Studio一些各種小技巧锈玉,當(dāng)然包含了調(diào)試技巧爪飘,很棒的文章。

地址:http://jaeger.itscoder.com/android/2016/02/14/android-studio-tips.html

小結(jié)一句:打印Log日志的優(yōu)點(diǎn)是拉背,在同一日志記錄中可以看到多處的棧跟蹤信息师崎;缺點(diǎn)是,必須學(xué)習(xí)如何添加日志記錄方法去团,重新編譯抡诞、運(yùn)行應(yīng)用并跟蹤排查應(yīng)用問(wèn)題穷蛹。相對(duì)而言,斷點(diǎn)調(diào)試的方法更為方便昼汗,當(dāng)然不同場(chǎng)景下肴熏,打印日志會(huì)更加清晰、方便尋找解決問(wèn)題線(xiàn)索顷窒,比如說(shuō)一個(gè)循環(huán)中蛙吏。

Android特有的調(diào)試工具——Android Lint

Android Lint是Android應(yīng)用代碼的靜態(tài)分析器,它是無(wú)需代碼運(yùn)行就能檢查代碼錯(cuò)誤的的特殊程序鞋吉,憑著對(duì)Android框架知識(shí)的掌握鸦做,Android Lint深入檢查代碼,找出編譯器無(wú)法發(fā)現(xiàn)的問(wèn)題谓着。
選擇Analyze -> Inspect Code...菜單項(xiàng)手動(dòng)運(yùn)行Lint


Demo截圖

選擇Whole project泼诱。然后Android Studio會(huì)立即運(yùn)行Lint和其他一些靜態(tài)分析器開(kāi)始分析代碼。
檢查完畢赊锚,所有的潛在問(wèn)題會(huì)按類(lèi)別列出治筒。


Demo截圖
展開(kāi)Android Lint類(lèi)別可看到項(xiàng)目中的具體Lint信息,繼續(xù)展開(kāi)看到更加詳細(xì)的信息舷蒲,包括問(wèn)題發(fā)生的地方耸袜。


R類(lèi)問(wèn)題——有時(shí)候資源編譯錯(cuò)誤莫名其妙的出現(xiàn),若遇到此類(lèi)問(wèn)題牲平,可嘗試如下操作

  1. 重新檢查資源文件中的XML文件的有效性(某個(gè)布局的拼寫(xiě)有可能錯(cuò)誤堤框,拼寫(xiě)規(guī)范要遵守)
  2. 清晰項(xiàng)目(選擇Build -> Clean Project,Android Studio會(huì)重新編譯整個(gè)項(xiàng)目纵柿,消除錯(cuò)誤蜈抓,建議經(jīng)常進(jìn)行深度項(xiàng)目清理)
  3. 使用Gradle同步項(xiàng)目(若修改了build.gradle配置文件,就需要同步更新項(xiàng)目的編譯設(shè)置藐窄。選擇Tool -> Android -> Sync Project with Gradle Files菜單項(xiàng)资昧,Android Studio會(huì)使用正確的項(xiàng)目設(shè)置重新編譯項(xiàng)目)
  4. 運(yùn)行Android Lint(仔細(xì)查看Lint警告信息,在項(xiàng)目中也許就能在這個(gè)工具的幫助下獲得意想不到的發(fā)現(xiàn)噢)

如果仍然無(wú)法解決問(wèn)題荆忍,那就訪(fǎng)問(wèn) http://stackoverflow.com 尋求幫助吧 ~ O(∩_∩)O哈哈 ~

挑戰(zhàn)練習(xí):探索布局檢查器

使用布局檢查器以交互的方式檢查布局文件格带,調(diào)試布局文件,研究它是如何在屏幕上渲染顯示的刹枉。啟動(dòng)應(yīng)用叽唱,在Android Monitor工具窗口點(diǎn)擊最左邊的布局檢查器按鈕,布局檢查器激活后微宝,點(diǎn)擊布局檢查器視圖里的元素查看布局屬性棺亭。

截圖取自此書(shū)
實(shí)際上我在Android Studio3.0 Logcat旁邊沒(méi)找到這個(gè)布局檢查器,大概在舊一點(diǎn)的AS版本里面有蟋软∠庹看到Lotcat旁邊看到一個(gè)截圖功能嗽桩,還挺好的。

截圖取自demo
我查看布局屬性應(yīng)該直接在XML文件這里不知道算不算凄敢,如圖碌冶,由此可以看到布局屬性,布局結(jié)構(gòu)組成涝缝。

截圖取自demo
好不容易找到了AS3.0 布局檢測(cè)器扑庞,Tools> Android>Layout Inspector

截圖取自demo
選擇應(yīng)用
截圖取自demo
選擇window
截圖取自demo
查看自己想查看的布局控件信息,點(diǎn)擊中間的控件拒逮,左邊定位到控件罐氨,右邊是當(dāng)前控件的屬性表格。

截圖取自demo

挑戰(zhàn)練習(xí):探索內(nèi)存分配跟蹤

在Android Monitor工具窗口滩援,點(diǎn)擊內(nèi)存分配跟蹤器按鈕啟動(dòng)它栅隐。

截圖取自此書(shū)
然后在前臺(tái)操作應(yīng)用,后臺(tái)就開(kāi)始記錄內(nèi)存分配狀況狠怨。一旦找到想優(yōu)化的點(diǎn)约啊,就可以再次點(diǎn)擊內(nèi)存分配跟蹤器按鈕停止邑遏。就可以看到內(nèi)存分配報(bào)告佣赖。

截圖取自此書(shū)
內(nèi)存分配報(bào)告會(huì)列出內(nèi)存分配發(fā)生的次數(shù)以及字節(jié)大小。在工具頂端選擇你需要的報(bào)表類(lèi)型记盒,報(bào)表展現(xiàn)形式可以是表憎蛤,也可以是圖。

然而纪吮,AS3.0我也沒(méi)找到書(shū)上的這個(gè)內(nèi)容俩檬,不過(guò)提供了個(gè)強(qiáng)大的 Android Profiler 分析器。

截圖取自demo
選擇要配置的設(shè)備和應(yīng)用程序進(jìn)程碾盟,單擊NETWORK棚辽,CPU或MEMORY時(shí)間線(xiàn)可以打開(kāi)每個(gè)分析器的更詳細(xì)視圖。

截圖取自demo
點(diǎn)擊Run Configuration

截圖取自demo
截圖取自demo
這里顯示gradle plugin 的版本至少是2.4冰肴,我這項(xiàng)目的plugin是2.2.3屈藐,此時(shí)并不能很好的體會(huì)這個(gè)功能的強(qiáng)大。我這最終把項(xiàng)目的build gradle plugin改成了3.0.0

截圖取自demo
當(dāng)然熙尉,移植過(guò)程中會(huì)遇到不少坑联逻,百度還是找的到原因的,我參考的博客:http://blog.csdn.net/qq_34795285/article/details/78194282
還有butterknife最新的在3.0.0也報(bào)錯(cuò)有問(wèn)題检痰,所以我用的butterknife版本為8.4.0包归。

終于可以勾選那個(gè)Enable advanced profiling了,那里描述是铅歼,需要API級(jí)別小于26公壤,在允許Profiler跟蹤網(wǎng)絡(luò)負(fù)載换可,應(yīng)用程序事件和對(duì)象計(jì)數(shù)等數(shù)據(jù)的時(shí)候,它可能對(duì)構(gòu)建速度有輕微的性能影響厦幅。

單擊Network——網(wǎng)絡(luò)使用情況

截圖取自demo

橫坐標(biāo)代表是時(shí)間軸锦担,那些折現(xiàn)是一些網(wǎng)絡(luò)請(qǐng)求,按住鼠標(biāo)左鍵從中選擇一個(gè)范圍慨削,那用兩條白色的豎桿包起來(lái)那塊就是選擇的范圍洞渔,然后左下的列表就列出來(lái)了此范圍的網(wǎng)絡(luò)請(qǐng)求信息,什么狀態(tài)啊缚态,時(shí)間磁椒,請(qǐng)求類(lèi)型啊,點(diǎn)擊其中一條玫芦,右邊顯示的response更為具體了浆熔,圖片的直接顯示了圖片,還有URL桥帆,不是圖片的医增,把json數(shù)據(jù)全部都顯示出來(lái)了,這個(gè)功能真的好方便呀老虫,旁邊還有一些選項(xiàng)叶骨,都可以看看用于分析。

單擊MEMORY——內(nèi)存使用情況

截圖取自demo

單擊CPU——CPU占用情況

截圖取自demo

具體怎么分析使用祈匙,網(wǎng)上也有不少忽刽,可以參考博客:http://blog.csdn.net/niubitianping/article/details/72617864

更新于 2018/2/2

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市夺欲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌些阅,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件市埋,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡腰素,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)弓千,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事谴餐。” “怎么了岂嗓?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵鹊碍,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我侈咕,道長(zhǎng)公罕,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任耀销,我火速辦了婚禮楼眷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘熊尉。我一直安慰自己罐柳,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布狰住。 她就那樣靜靜地躺著张吉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪转晰。 梳的紋絲不亂的頭發(fā)上芦拿,一...
    開(kāi)封第一講書(shū)人閱讀 49,821評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音查邢,去河邊找鬼。 笑死酵幕,一個(gè)胖子當(dāng)著我的面吹牛扰藕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播芳撒,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼邓深,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了笔刹?” 一聲冷哼從身側(cè)響起芥备,我...
    開(kāi)封第一講書(shū)人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎舌菜,沒(méi)想到半個(gè)月后萌壳,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年袱瓮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缤骨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡尺借,死狀恐怖绊起,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情燎斩,我是刑警寧澤虱歪,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站谨读,受9級(jí)特大地震影響劳殖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜宣增,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一爹脾、第九天 我趴在偏房一處隱蔽的房頂上張望灵妨。 院中可真熱鬧落竹,春花似錦述召、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至茎杂,卻和暖如春煌往,著一層夾襖步出監(jiān)牢的瞬間轧邪,已是汗流浹背忌愚。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留院水,地道東北人简十。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓恢恼,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親场斑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子漏隐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容