情景再現
開發這么久,不知道你們是否也經歷過這樣的情況,測試或者用戶,反饋app閃退,結果你自己打開開發工具,去調試,一切正常,然后閃退還是存在,只是在開發環境中不能重現。這種情況一般是在特定的情況下才觸發的bug。比如app退出后臺,再打開的時候,重啟了,這樣你在開發環境很難模擬到。那這種bug怎么來排查的,兩種辦法:
集成bugly
bugly是個很好的工具,
騰訊Bugly,為移動開發者提供專業的異常上報和運營統計,幫助開發者快速發現并解決異常,同時掌握產品運營動態,及時跟進用戶反饋。
具體怎樣集成自行百度。集成以后,可以查看到很多開發環境看不到的bug,這樣就根據崩潰記錄,對app進行完善。
bug重現
雖然bugly能看到日志,但是怎么才能重現呢,畢竟不重現,沒辦法解決bug,能重現的bug,其實是最好解決的Bug。對于一些bug,可能加一些判斷非空就行了,但是有些bug,比較難重現,比如
No view found for id 0x7f0901c3 (包名:id/frameLayout) for fragment MergedModuleNoLoginFragment{acdaeec} (156480ac-26ef-4bdc-8ec6-ae57f092d97f id=0x7f0901c3)
包名.UI.onStart(UI.java:75)
這個bug困擾了我好久,開發環境始終重現不了,加了try-catch也不行,然后網上的方法都試了,也不行。這個bug的原因就是一句話:調用的時機不對,還沒初始化完成,就切換了。這個bug一般會在fragment嵌套fragment的代碼里出現。現在將解決辦法說一下
開發環境重現bug
其實一些bug,正常情況下是重現不了的,我們可以通過設置開發者選項里的不保留活動,調試的時候,正常進入頁面,然后點擊home鍵,回到桌面,再點擊圖標,就有可能重現一些Bug
我這邊的bug解決,是將切換fragment的方法,放到了onStart()方法里,之前是放在onCreate()方法里,有可能view還沒初始化,就調用了,會報錯
protected void switchFragmentContent(TFragment fragment){FragmentManager fm = getSupportFragmentManager();FragmentTransaction transaction = fm.beginTransaction();transaction.replace(fragment.getContainerId(), fragment);try{transaction.commitNowAllowingStateLoss();}catch (Exception e){e.printStackTrace();}}
關于這個Bug,網上有一些博客,我把篩選過,感覺有用的博客分享一下
Fragment找不到資源Id引起的線上Crash
從一個線上 Android Bug 回看 Fragment
java.lang.IllegalArgumentException No view found for id 0x7
java.lang.IllegalArgumentException No view found for id 0x… for fragment
Fragment嵌套fragment出現的兩種錯誤No view found for id for fragment 與Can not perform this action after onSave
java.lang.IllegalArgumentException: No view found for id 崩潰總結
關于No view found for id 0x7f080135 (com.xxx.xxx:id/viewpager) for fragment PopupWindow
遇到的錯誤之java.lang.IllegalArgumentException: No view found for id
Android之 運行時錯誤總結