报错日志:
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左右,到此问题得以解决;
心得:保持良好的代码规范,合理使用系统资源;否则现场会出现莫名奇妙的错误,不好排查,而且非常耗时
仅此记录!