Android生存指南之:解Bug策略與思路問(wèn)題的詳解
更新時(shí)間:2013年05月21日 11:08:16 作者:
本篇文章是對(duì)Android 解Bug策略與思路的問(wèn)題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
現(xiàn)在維護(hù)和定制Android的需求越來(lái)越多,做的人也越來(lái)越多,而Google直接Release出來(lái)的源碼中又有很多Bug和不合理的地方,特別是原生的應(yīng)用,如Mms,Browser, Email, Contacts等。定制或做Android解決方案第一步就是要修復(fù)原生的Bug以得到一個(gè)穩(wěn)定的系統(tǒng)。
1. 仔細(xì)觀察Bug的特性
了解Bug所涉及的流程和模塊有哪些,以及是什么樣的Bug,Exception?功能上的?還是UI/UE設(shè)計(jì)問(wèn)題。針對(duì)不同的問(wèn)題,可能要采取不同的手段,對(duì)于Exception就要先分析Log文件,以確定產(chǎn)生Exception的原因;對(duì)于功能上的問(wèn)題,可能要先嘗試復(fù)現(xiàn); 對(duì)于UI/UE的問(wèn)題可能有要先找UI設(shè)計(jì)師確認(rèn)是否需要修改。
2. 找出決定因素,排除次要和無(wú)關(guān)因素
分析,推敲和嘗試復(fù)現(xiàn)以排除次要的,無(wú)關(guān)的因素和操作步驟。如果跟某些特定的數(shù)據(jù)有關(guān),就要把數(shù)據(jù)進(jìn)行拆解,以把無(wú)影響的部分去掉,直到找到引起問(wèn)題的特殊數(shù)據(jù)。
3. 對(duì)比
跟正常的流程進(jìn)行對(duì)比,跟沒(méi)有問(wèn)題的版本進(jìn)行對(duì)比,跟同一系列的產(chǎn)品進(jìn)行對(duì)比,看有哪些異常和不一致的地方。
4. 單一變量原則
每次改動(dòng)一個(gè)變化的東西,這樣你才能清楚是因?yàn)槭裁串a(chǎn)生了問(wèn)題或是解決了問(wèn)題。如果同時(shí)的改動(dòng)有二個(gè)就很難分的清是哪一個(gè)產(chǎn)生了作用。
5. 分而治之
通過(guò)分治的方法逐步縮小范圍,先在一個(gè)模塊分析,確定有問(wèn)題或沒(méi)問(wèn)題,然后再轉(zhuǎn)到其模塊,先在其中一個(gè)邏輯或文件中分析,然后再到其他的,以避免盲目的亂找。
6. 模擬場(chǎng)景
用特殊的數(shù)據(jù),或者修改代碼來(lái)模擬Bug發(fā)生時(shí)的場(chǎng)景。這對(duì)復(fù)現(xiàn)非必現(xiàn)Bug時(shí)特別有用,對(duì)線程問(wèn)題也很有用。
7. 定位問(wèn)題的方法:經(jīng)驗(yàn)+Log+Debugging工具
經(jīng)驗(yàn)是要靠積累才能得來(lái)的,通常情況下對(duì)代碼和流程熟悉的人定位起來(lái)就快速的多; Log是指日志文件和打印這種簡(jiǎn)單粗暴的方式;調(diào)試工具是指像Eclipse和GDB等斷點(diǎn)單步工具。通常用經(jīng)驗(yàn)和Log來(lái)進(jìn)行大范圍的定位,當(dāng)對(duì)流程有了一定的了解后,且已經(jīng)定位到稍小的范圍,如一個(gè)函數(shù)內(nèi)或一個(gè)文件內(nèi)時(shí)就可以用工具進(jìn)行斷點(diǎn)和單步調(diào)試以精確定位。當(dāng)范圍很大時(shí),如用調(diào)試工具會(huì)很慢,很難找到有效的斷點(diǎn),單步的話又太煩瑣,很容易讓人混亂和丟失思路。
8. 逆向推理和洞察力
在調(diào)試解Bug過(guò)程中逆向推理力十分的重要,因?yàn)槟愕玫降氖且粋€(gè)結(jié)果(Bug),而要去找到它的原因,就需要推理和猜測(cè)問(wèn)題可能是出在哪里。另外一個(gè)非常重要的能力就是洞察力,觀察Log,操作等,注意一些細(xì)微的差異,發(fā)現(xiàn)一些隱藏的線索等。當(dāng)然,這與經(jīng)驗(yàn)不同,不是那么容易就能培養(yǎng)出來(lái)的!
9. 具體的方法和工具
a. 編譯
很顯然,要想用日志等方法,就要修改源碼,添加日志,就要編譯。整體編譯Android可以用make,整體編譯過(guò)一次后就可以局部編譯,進(jìn)入到某個(gè)帶有Android.mk文件的目錄運(yùn)行mm就可以把此目錄重新編譯成apk, jar或so
b. 運(yùn)行
編譯好后,就要把新編譯出來(lái)的Apk或jar或so運(yùn)行起來(lái)以看到不同??梢灾苯影補(bǔ)pk,jar和so通過(guò)adb push 到手機(jī)中(apk到/system/app, jar到/system/framework, so到/system/lib)。或者用mm snod命令重新生成system.img,然后再使用(模擬器可以這樣做)。
c. 調(diào)試工具
Apk用Eclipse就可以直接調(diào),前提要能編譯過(guò)
jar也要用Eclipse來(lái)調(diào)試
so因?yàn)槎际荖ative C/C++代碼,所以要用GDB來(lái)調(diào)試。手機(jī)中運(yùn)行g(shù)dbserver,PC上用gdb調(diào)試編譯出來(lái)的symbols/下面的庫(kù),gdb和gdbserver用過(guò)手機(jī)中指定的端口來(lái)通信。
1. 仔細(xì)觀察Bug的特性
了解Bug所涉及的流程和模塊有哪些,以及是什么樣的Bug,Exception?功能上的?還是UI/UE設(shè)計(jì)問(wèn)題。針對(duì)不同的問(wèn)題,可能要采取不同的手段,對(duì)于Exception就要先分析Log文件,以確定產(chǎn)生Exception的原因;對(duì)于功能上的問(wèn)題,可能要先嘗試復(fù)現(xiàn); 對(duì)于UI/UE的問(wèn)題可能有要先找UI設(shè)計(jì)師確認(rèn)是否需要修改。
2. 找出決定因素,排除次要和無(wú)關(guān)因素
分析,推敲和嘗試復(fù)現(xiàn)以排除次要的,無(wú)關(guān)的因素和操作步驟。如果跟某些特定的數(shù)據(jù)有關(guān),就要把數(shù)據(jù)進(jìn)行拆解,以把無(wú)影響的部分去掉,直到找到引起問(wèn)題的特殊數(shù)據(jù)。
3. 對(duì)比
跟正常的流程進(jìn)行對(duì)比,跟沒(méi)有問(wèn)題的版本進(jìn)行對(duì)比,跟同一系列的產(chǎn)品進(jìn)行對(duì)比,看有哪些異常和不一致的地方。
4. 單一變量原則
每次改動(dòng)一個(gè)變化的東西,這樣你才能清楚是因?yàn)槭裁串a(chǎn)生了問(wèn)題或是解決了問(wèn)題。如果同時(shí)的改動(dòng)有二個(gè)就很難分的清是哪一個(gè)產(chǎn)生了作用。
5. 分而治之
通過(guò)分治的方法逐步縮小范圍,先在一個(gè)模塊分析,確定有問(wèn)題或沒(méi)問(wèn)題,然后再轉(zhuǎn)到其模塊,先在其中一個(gè)邏輯或文件中分析,然后再到其他的,以避免盲目的亂找。
6. 模擬場(chǎng)景
用特殊的數(shù)據(jù),或者修改代碼來(lái)模擬Bug發(fā)生時(shí)的場(chǎng)景。這對(duì)復(fù)現(xiàn)非必現(xiàn)Bug時(shí)特別有用,對(duì)線程問(wèn)題也很有用。
7. 定位問(wèn)題的方法:經(jīng)驗(yàn)+Log+Debugging工具
經(jīng)驗(yàn)是要靠積累才能得來(lái)的,通常情況下對(duì)代碼和流程熟悉的人定位起來(lái)就快速的多; Log是指日志文件和打印這種簡(jiǎn)單粗暴的方式;調(diào)試工具是指像Eclipse和GDB等斷點(diǎn)單步工具。通常用經(jīng)驗(yàn)和Log來(lái)進(jìn)行大范圍的定位,當(dāng)對(duì)流程有了一定的了解后,且已經(jīng)定位到稍小的范圍,如一個(gè)函數(shù)內(nèi)或一個(gè)文件內(nèi)時(shí)就可以用工具進(jìn)行斷點(diǎn)和單步調(diào)試以精確定位。當(dāng)范圍很大時(shí),如用調(diào)試工具會(huì)很慢,很難找到有效的斷點(diǎn),單步的話又太煩瑣,很容易讓人混亂和丟失思路。
8. 逆向推理和洞察力
在調(diào)試解Bug過(guò)程中逆向推理力十分的重要,因?yàn)槟愕玫降氖且粋€(gè)結(jié)果(Bug),而要去找到它的原因,就需要推理和猜測(cè)問(wèn)題可能是出在哪里。另外一個(gè)非常重要的能力就是洞察力,觀察Log,操作等,注意一些細(xì)微的差異,發(fā)現(xiàn)一些隱藏的線索等。當(dāng)然,這與經(jīng)驗(yàn)不同,不是那么容易就能培養(yǎng)出來(lái)的!
9. 具體的方法和工具
a. 編譯
很顯然,要想用日志等方法,就要修改源碼,添加日志,就要編譯。整體編譯Android可以用make,整體編譯過(guò)一次后就可以局部編譯,進(jìn)入到某個(gè)帶有Android.mk文件的目錄運(yùn)行mm就可以把此目錄重新編譯成apk, jar或so
b. 運(yùn)行
編譯好后,就要把新編譯出來(lái)的Apk或jar或so運(yùn)行起來(lái)以看到不同??梢灾苯影補(bǔ)pk,jar和so通過(guò)adb push 到手機(jī)中(apk到/system/app, jar到/system/framework, so到/system/lib)。或者用mm snod命令重新生成system.img,然后再使用(模擬器可以這樣做)。
c. 調(diào)試工具
Apk用Eclipse就可以直接調(diào),前提要能編譯過(guò)
jar也要用Eclipse來(lái)調(diào)試
so因?yàn)槎际荖ative C/C++代碼,所以要用GDB來(lái)調(diào)試。手機(jī)中運(yùn)行g(shù)dbserver,PC上用gdb調(diào)試編譯出來(lái)的symbols/下面的庫(kù),gdb和gdbserver用過(guò)手機(jī)中指定的端口來(lái)通信。
相關(guān)文章
Android實(shí)現(xiàn)ListView分頁(yè)加載數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)ListView分頁(yè)加載數(shù)據(jù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11Android開(kāi)發(fā)手冊(cè)SeekBar拖動(dòng)條使用實(shí)例
這篇文章主要為大家介紹了Android開(kāi)發(fā)手冊(cè)SeekBar拖動(dòng)條使用實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06android 仿微信demo——登錄功能實(shí)現(xiàn)(移動(dòng)端)
本篇文章主要介紹了微信小程序-閱讀小程序?qū)嵗╠emo),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望能給你們提供幫助2021-06-06簡(jiǎn)單掌握Android Widget桌面小部件的創(chuàng)建步驟
這篇文章主要介紹了簡(jiǎn)單掌握Android Widget桌面小部件的創(chuàng)建步驟,Widget一般采用web前端技術(shù)進(jìn)行開(kāi)發(fā),需要的朋友可以參考下2016-03-03Android利用WindowManager生成懸浮按鈕及懸浮菜單
這篇文章主要為大家詳細(xì)介紹了Android利用WindowManager生成懸浮按鈕及懸浮菜單,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01