App 閃退(Crash)是指 App 在使用中突然關閉、回到手機桌面,通常沒有任何錯誤提示。閃退的原因大致可分為五類:程式未處理的錯誤、記憶體不足、主執行緒卡住被系統終止、第三方 SDK 問題,以及與作業系統或權限不相容。
對使用者來說,閃退是最直接的負面體驗,也是評分下降與解除安裝的主要原因之一。以下整理閃退的常見原因、一開就閃退與使用中閃退的差異、如何用崩潰監控工具找出問題,以及上線前後的預防做法。
最常見的原因。例如讀取到空值(null)、陣列索引超出範圍、型別轉換失敗,或 API 回傳的格式與預期不同。這類錯誤在開發環境的資料正常時不會出現,一遇到實際使用者的邊界資料就會觸發。
一次載入大量高解析圖片、長列表沒有回收項目、影片或地圖元件沒有正確釋放,都可能讓記憶體持續累積,最後被系統強制關閉。記憶體較小的低階機型與舊手機特別容易發生。
在主執行緒執行大量運算、同步等待網路請求或讀寫大型檔案,會讓畫面失去回應。Android 會顯示「應用程式沒有回應」(ANR);iOS 若啟動時間過長,可能被系統的 watchdog 機制直接終止,使用者看到的就是閃退。
廣告、分析、金流、推播等 SDK 若初始化失敗、版本與系統不相容,或彼此衝突,常在 App 一啟動就閃退。更新套件版本後才出現的閃退,應優先檢查這一類。
新版 iOS 或 Android 會調整 API 行為與權限規則,舊程式碼可能因此出錯。例如 iOS 在存取相機、相簿、定位等受保護資源時,若 Info.plist 缺少對應的用途說明文字,App 會被系統直接終止;Android 13 之後,推播通知也需要額外向使用者請求權限。
一打開就閃退,問題多半出在啟動流程:SDK 初始化失敗、讀取本機設定或資料庫異常、App 更新後舊資料格式無法相容(資料遷移失敗),或啟動時間過長被系統終止。這類閃退影響面最大,因為使用者完全無法使用 App。
使用中閃退,通常與特定操作或資料有關:進入某個頁面、上傳某種檔案、網路切換、從背景回到前景。這類問題需要搭配使用者閃退前的操作紀錄(breadcrumbs),才比較容易重現。
這是最常見的困擾。閃退往往只在特定條件下發生:特定機型或品牌系統、特定 OS 版本、記憶體較小的手機、網路不穩定、帳號內有特殊資料,或是從舊版本升級而非全新安裝。開發團隊手上的測試機很難涵蓋這些組合。
Android 的情況又更複雜。機型、OS 版本與各品牌的客製系統高度分散,常出現只在某個品牌或某個版本發生的閃退。因此判斷閃退不能只靠內部測試,必須依靠上線後的崩潰監控蒐集真實使用資料。
崩潰監控工具會在 App 閃退時自動記錄錯誤堆疊(stack trace)、機型、OS 版本與閃退前的操作紀錄,並彙整受影響的使用者數量,讓團隊依影響程度排定修正的優先順序。
常見工具包括 Firebase Crashlytics(免費)、Sentry 與 Bugsnag(有免費額度與付費方案)。平台本身也提供資料:iOS 可以在 Xcode Organizer 查看崩潰紀錄;Android 可以在 Google Play Console 的 Android vitals 查看當機率與 ANR 比率,數值過高會影響 App 在商店的曝光。
有一個容易被忽略的設定:正式版 App 的程式碼經過編譯與混淆,若沒有上傳對應的符號檔(iOS 的 dSYM、Android 的 R8/ProGuard mapping 檔),錯誤堆疊會是一串無法閱讀的位址,等於有紀錄卻查不出問題。建議將符號檔上傳納入自動化建置流程。
常用的指標是 Crash-Free Users,也就是沒有遇到閃退的使用者比例。業界常見的參考標準是 99.5% 以上,表現優異的 App 可以達到 99.9%。低於 99% 代表每一百位使用者就有超過一位遇到閃退,會明顯影響留存率與商店評分。
比起單看整體數字,更重要的是觀察趨勢:每次發版後閃退率是否上升、哪個版本或機型特別集中,才能判斷問題是哪一次更新造成的。
原生程式碼的修正需要重新送審,審核時間不一定;App Store 在緊急情況下可以申請加速審查。若 App 以 React Native 等框架開發,JavaScript 層的問題可以透過 OTA 熱更新,在不送審的情況下修正。過去常用的 Microsoft CodePush 已隨 App Center 於 2025 年 3 月停止服務,目前多改用 Expo EAS Update 或自建更新伺服器。熱更新的適用範圍與限制,可參考OTA 熱更新。
另一個關鍵是事先準備好應變機制,例如遠端功能開關(Feature Flag)。發生問題時可以直接關閉出錯的功能,爭取修正與送審的時間。
分階段發布:Google Play 可以設定新版本先推送給一定比例的使用者;App Store 提供「分階段發行」,在 7 天內逐步擴大自動更新的範圍。觀察崩潰率正常後再全面發布,發現問題時可以暫停。
擴大測試涵蓋範圍:送審前在不同 OS 版本、低階機型、舊版升級等情境下測試,而不只是全新安裝在高階手機上。
自動化建置與測試:把單元測試、符號檔上傳與版本號管理放進 CI/CD,減少人工遺漏,做法可參考跨平台 APP CI/CD 自動化部署實戰。
閃退處理不是上線前一次性的工作,而是持續的監控與維運。App 的開發與上線後長期維護規劃,可參考跨平台 APP 開發。
Q1. App 一打開就閃退,最可能是什麼原因?
常見於啟動流程出錯,例如第三方 SDK 初始化失敗、讀取本機設定或資料庫異常、更新後資料格式不相容,或與新版作業系統不相容。可透過 Crashlytics 等工具查看啟動當下的錯誤堆疊來定位。
Q2. 為什麼測試機不會閃退,使用者卻一直反映?
閃退常只在特定機型、OS 版本、記憶體狀況、網路或資料條件下發生。測試機正常不代表所有裝置都正常,需要依靠崩潰監控蒐集真實的使用資料。
Q3. Crash-Free Users 要多少才算健康?
業界常見的參考標準是 99.5% 以上,表現優異的 App 可達 99.9%。低於 99% 代表閃退影響面偏大,會傷害留存率與商店評分。
Q4. Crashlytics 是免費的嗎?
是。Firebase Crashlytics 提供免費的崩潰監控;Sentry、Bugsnag 等工具則有免費額度與付費方案。
Q5. 為什麼 Android 比 iOS 更容易遇到難以重現的閃退?
Android 的機型、OS 版本與各品牌客製系統高度分散,常有只在特定品牌或版本發生的閃退,需要更廣泛的機型測試與監控資料。
Q6. 上線後發現嚴重閃退,一定要等商店審核才能修嗎?
原生程式碼的修正需要送審。若使用 React Native 等框架,JavaScript 層的問題可以透過 OTA 熱更新(如 Expo EAS Update)緊急修正;Microsoft CodePush 已隨 App Center 於 2025 年 3 月停止服務。
Q7. 怎麼預防新版本上線就大量閃退?
採用分階段發布,先推送給部分使用者,確認崩潰率正常後再全面發布,並準備遠端功能開關與快速應變機制。
Q8. 為什麼崩潰報告的錯誤堆疊看不懂?
正式版程式碼經過編譯與混淆,需要上傳符號檔(iOS 的 dSYM、Android 的 mapping 檔),才能還原成可閱讀的程式位置。