回覆列表
  • 1 # 使用者4553031770872

    其實就是程式由於某些原因出錯了,可能是程式碼 BUG 也可能是系統和環境因素導致的。

    例如你的某個 App 需要透過伺服器獲取資料,但是你的手機網路有問題導致一直獲取不到,造成網路連線超時。如果程式碼中未對「超時」這個可能發生的情況進行處理的話,那麼「出現網路請求超時」這個現象就屬於未捕獲的異常。異常就是指的超時這個行為,未捕獲指的未對這個行為進行處理。

    而 Android 中程式一旦出錯,就會統一的彈出一個「應用已停止執行」,然後結束或者重啟應用程式。

    單看這個彈窗是無意義的,如果你想看到實際細節,你需要深入輸出的日誌找到具體原因。這時候就需要用 logcat。

    logcat 檢視日誌,需要先讓裝置成功進行 adb 連線以後。然後:

    當然,由於已經確定要看的是已經崩潰的應用,那麼我們過濾日誌 Tag 型別為 Error 即可:

    再由於我們通常是知道崩潰是那個應用,所以我們可以繼續指定應用過濾。例如我自己開發的一個 App 包名是 io.bluerain.tweaks,假設我不是開發者,我只能透過包名過濾。

    網上有一種方法是利用 Android 內建的 ps 命令獲取程序,然後用 grep 過濾和 cut 擷取到 pid,再由 pid 過濾日誌。這樣間接的實現包名過濾的手段:

    先執行應用,然後輸入上面的命令。再重現一次應用崩潰,就可以看到很少量的日誌輸出,其中包含崩潰詳情,例如我這邊是出現的異常是:

    從 *Exception 的冒號後面看異常訊息,發現是無權訪問 SD 卡。所以它就是導致該應用已停止執行的原因。

    另外,這個跟 ANR 無關。ANR 是 Application not Responding 的簡寫,也就是「應用未響應」,它通常跟異常、BUG 等都無關,二者完全不是一回事兒。

  • 中秋節和大豐收的關聯?
  • 《雷雨》與《哈姆雷特》對比閱讀?