句柄泄漏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左右,到此问题得以解决;

心得:保持良好的代码规范,合理使用系统资源;否则现场会出现莫名奇妙的错误,不好排查,而且非常耗时

仅此记录!

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