句柄泄漏Could not read input channel file descriptors from parcel

報錯日誌:

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左右,到此問題得以解決;

心得:保持良好的代碼規範,合理使用系統資源;否則現場會出現莫名奇妙的錯誤,不好排查,而且非常耗時

僅此記錄!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章