報錯日誌:
06-18 19:41:06.879 1635-32035/com.hj.test E/MemoryHeapBase: error creating ashmem region: Too many open files
--------- beginning of crash
06-18 19:24:20.955 1407-1407/com.hj.test E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.hj.test, PID: 1407
java.lang.RuntimeException: Could not read input channel file descriptors from parcel.
at android.view.InputChannel.nativeReadFromParcel(Native Method)
at android.view.InputChannel.readFromParcel(InputChannel.java:148)
at android.view.IWindowSession$Stub$Proxy.addToDisplay(IWindowSession.java:787)
at android.view.ViewRootImpl.setView(ViewRootImpl.java:531)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:310)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3169)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2481)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:746)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636)
或者
--------- beginning of crash
06-18 19:41:07.340 1635-1635/com.hj.test E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.hj.test, PID: 1635
java.lang.RuntimeException: Could not read input channel file descriptors from parcel.
at android.view.InputChannel.nativeReadFromParcel(Native Method)
at android.view.InputChannel.readFromParcel(InputChannel.java:148)
at android.view.InputChannel$1.createFromParcel(InputChannel.java:39)
at android.view.InputChannel$1.createFromParcel(InputChannel.java:37)
at com.android.internal.view.InputBindResult.<init>(InputBindResult.java:68)
at com.android.internal.view.InputBindResult$1.createFromParcel(InputBindResult.java:112)
at com.android.internal.view.InputBindResult$1.createFromParcel(InputBindResult.java:111)
at com.android.internal.view.IInputMethodManager$Stub$Proxy.windowGainedFocus(IInputMethodManager.java:762)
at android.view.inputmethod.InputMethodManager.startInputInner(InputMethodManager.java:1226)
at android.view.inputmethod.InputMethodManager.onPostWindowFocus(InputMethodManager.java:1445)
at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:3386)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:746)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636)
句柄泄漏:
每一個Android程序默認可以使用1024個 File Descriptor;io流、socket、soundpool等等都會佔用fd;超出就會出現 “app停止運行”或者黑屏
句柄limit
當前進程佔用句柄個數 及 ls -l
adb shell “lsof | grep 進程pid | wc -l”
adb shell "lsof | grep 22611 | wc -l"
或者
adb root
adb shell
cd proc/pid/fd
ls | wc -l
解決問題,排查代碼
網上給出的說法:
1、RemoteView中添加的圖片太大了,超過40K會報這個異常
2、Intent傳遞的數據太大了超過1M也會報這個錯誤
3、FileDescripter太多而且沒有關閉,looper太多沒有quit。
4、試試在AndroidManefest.xml中對當前Activity配置configchange=“orientation|keyboardHidden”強制在Activity橫豎屏切換的時候不重新onCreate。
5、google 系統bug
6、soundpool重複load
設備是按鍵通過操作app動態查看fd佔用數目,發現進入任何界面都會漲10個fd左右;那麼查看每個界面Activity及BaseActivity,找到BaseActivity中oncreate中調用音頻的load方法加載所有的音頻文件;將音頻的load放置到Application的oncreate中,每次啓動只初始化一次;再次操作app並動態查看fd佔用數據,發現進入任何界面都不會像之前那樣漲10個fd,有戲啊,然後將app所有功能都打開一遍的情況下,fd最大到150左右,到此問題得以解決;
心得:保持良好的代碼規範,合理使用系統資源;否則現場會出現莫名奇妙的錯誤,不好排查,而且非常耗時
僅此記錄!