Android ANR和Crash的簡介和解決辦法

一、 Crash

表現(xiàn):程序奔潰或閃退

1、 對應(yīng)用的影響

??????????? 1、 程序無法繼續(xù)運行,數(shù)據(jù)丟失。

??????????? 2、 糟糕的用戶體驗。

2、產(chǎn)生原因

從Android框架可區(qū)分為Application ?Crash和Native Crash。

Application ?Crash由于java層線程因未捕獲異常而終止,由系統(tǒng)的void uncaughtException(Thread t,Throwable e)? 方法進行捕獲和處理,通常會給出界面彈窗提示“***已停止運行?!薄?/p>

Application ?Crash常見原因如下:(都是常見的java異常)

1、 NullPointerException:空指針異常。

2、 SQLException:操作數(shù)據(jù)庫異常類。

3、 ClassCastException:數(shù)據(jù)類型轉(zhuǎn)換異常。

4、NumberFormatException:字符串轉(zhuǎn)換為數(shù)字類型時拋出的異常。

5、ClassNotFoundException  異常的解釋是"指定的類不存在"。

6、ArithmeticException  這個異常的解釋是"數(shù)學(xué)運算異常",比如程序中出現(xiàn)了除以零這樣的運算就會出這樣的異常。

7、ArrayIndexOutOfBoundsException 數(shù)組越界異常

8、IllegalArgumentException  這個異常的解釋是"方法的參數(shù)錯誤"

9、IllegalAccessException  這個異常的解釋是"沒有類訪問權(quán)限"

10、ArrayStoreException 錯誤對象存儲到數(shù)組


Native Crash在C++層中出現(xiàn),上層的java程序無法獲取信息,僅從界面上看到閃退現(xiàn)象,可以從Monkey測試中進行關(guān)注。

具體原因如下:

? ? ?? 設(shè)備碎片化:由于設(shè)備極具多樣性,App在不同的設(shè)備上可能有表現(xiàn)不同。

  帶寬限制:帶寬不佳的網(wǎng)絡(luò)對App所需的快速響應(yīng)時間可能不夠。

  網(wǎng)絡(luò)的變化:不同網(wǎng)絡(luò)間的切換可能會影響App的穩(wěn)定性。

  內(nèi)存管理:可用內(nèi)存過低,內(nèi)存泄漏、或使用非授權(quán)的內(nèi)存位置。

  用戶過多:連接數(shù)量過多可能會導(dǎo)致App崩潰。

  代碼錯誤:無效內(nèi)存地址、空指針、執(zhí)行非法的指令、訪問的資源不存在、對異常沒有處理等。

  第三方服務(wù):廣告或彈出屏幕可能會導(dǎo)致App崩潰。

3、測試中如何關(guān)注

針對如上的Application ?Crash的原因分析,可得出對應(yīng)的測試關(guān)注方法:

a)??? 關(guān)注界面中的所有按鈕、控件的操作有效性,點擊是否能產(chǎn)生對應(yīng)的目標事件。

b)??? 通過自動化對應(yīng)用的部分運算操作進行長時間負載測試,可有效暴露此問題。

c)??? 通過重復(fù)的多次操作可有效暴露此問題。

d)??? 通過對輸入框進行異常輸入,例如日期輸入框,文本輸入框等。

4、如何解決

1、log文件夾下全局搜am_crash,此時會把log文件下下所有的包含am_crash的行顯示出來

2、crash問題很好看,基本上就代碼寫的有問題,針對出現(xiàn)的問題修改一下就好


二、 ANR

ANR:ApplicationNot Responding,程序未響應(yīng)。

1、對應(yīng)用影響是什么

??????? a) 等待時間過長,無提示,無法給出等待的反饋,用戶流失。

??????? b) 無法繼續(xù)完成操作,數(shù)據(jù)丟失。

2、產(chǎn)生原因

??????? a) 主線程 (“事件處理線程” / “UI線程”) 在5秒內(nèi)沒有響應(yīng)輸入事件

??????? b)? BroadcastReceiver 沒有在10秒內(nèi)完成返回

根本原因:

1. 主線程執(zhí)行了耗時操作 (大量的數(shù)據(jù)庫讀寫、耗時的網(wǎng)絡(luò)訪問、調(diào)用手機的某些功能超時)

2. 其他程序占用CPU導(dǎo)致本進程得不到CPU時間片 (其他進程的頻繁讀寫操作、其他線程持有鎖,導(dǎo)致主線程等待超時、其它線程終止或崩潰導(dǎo)致主線程一直等待)

3、測試中如何關(guān)注

a) 對部分上傳文件較大的頁面、保存文件信息較多的動作,比如電話本信息、帶有圖片的記事本保存等操作。

b)? 對某一時間的網(wǎng)絡(luò)進行極限使用,在被測應(yīng)用的一個場景無法使用網(wǎng)絡(luò)的情況下關(guān)注。

c) 重復(fù)多次的操作可能導(dǎo)致ANR事件,可使用Monkey工具進行測試。

d) 多任務(wù)、多線程應(yīng)用內(nèi)存占用極限時。

從測試層面對這兩類報錯事件進行了簡單介紹和分析,未講解具體應(yīng)用的報錯信息,但提出了一些測試中容易遇到報錯的路徑和方法,以便在測試中更多的發(fā)現(xiàn)問題。

4、如何解決

1、log文件夾下全局搜am_anr,此時會把log文件下下所有的包含am_anr的行顯示出來(也可以搜activitymanager: ANR)

2、一般同一個時間點的anr log會在不同的文件中出現(xiàn)兩次,一次是logxxx.txt中,一次是在crash_xxxxxx文件夾中的aplog_ANR_時間文件中

3、進入到crash_xxxxxx文件夾下,找到一個data_app_anr@xxx.txt文件

4、在data_app_anr@xxx.txt文件中找到"main" prio=5 tid=1 Nativ這一行,往下看會有一些異常log,這些log描述的就是問題原因

ANR如果是由于主線程阻塞,在data_app_anr@xxx.txt中的"main" prio=5 tid=1 中會顯示 block


------本文內(nèi)容來自以下博客-------

https://blog.csdn.net/pyn815093235/article/details/45895787

https://blog.csdn.net/dzy_mails/article/details/51917454

http://blog.sina.com.cn/s/blog_b9e81be90102z07r.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容