今天出现了android.os.DeadObjectException异常。
那么DeadObjectException什么意思呢,字面意思当前对象“死”了,也就是没有了呗!
出现这个问题其实大多源于当前程序异常崩溃,进程直接被杀死,但是as或者其他的软件未能捕获到bug 所以就爆出了这个DeadObjectException异常,所以出这个问题大多数是因为程序崩溃引起的
调用的对象不存在,因为它所在app进程不存在或进程崩溃,此时在底层回调时报错。
解决方案:
在调用对象之前,建议检查是否存在此进程。DeadObjectException 异常出现是因为app进程不存在或进程崩溃因此在底层回调时报错。进程不存在或者进程崩溃需要查看其他日志来定位。对于进程崩溃的情况,也有可能部分原因是由于操作系统考虑到内存、cpu、优先级等指标,选择杀死一个进程得到资源。这种情况下,可以使用MQC平台的深度性能测试产品来帮助分析内存泄漏等问题。
最近维护到一个应用程序的代码,在某个activity页面中,页面只要打开持续一段时间(区分手机设备,htc的部分时间能持续半个小时以上不挂,samsung的手机有的40秒不到就挂,有的手机甚至是10秒中就会挂)。
查看后台抛出的异常信息如下:
Java代码
W/InputManagerService(163): Session failed to close due to remote exception
W/InputManagerService(163): android.os.DeadObjectException
W/InputManagerService(163): at android.os.BinderProxy.transact(Native Method)
W/InputManagerService(163): at com.android.internal.view.IInputMethodSession$Stub$Proxy.finishSession(IInputMethodSession.java:346)
W/InputManagerService(163): at com.android.server.InputMethodManagerService.finishSession(InputMethodManagerService.java:944)
W/InputManagerService(163): at com.android.server.InputMethodManagerService.clearCurMethodLocked(InputMethodManagerService.java:955)
W/InputManagerService(163): at com.android.server.InputMethodManagerService.onServiceDisconnected(InputMethodManagerService.java:972)
W/InputManagerService(163): at android.app.LoadedApk$ServiceDispatcher.doDeath(LoadedApk.java:1069)
W/InputManagerService(163): at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1083)
W/InputManagerService(163): at android.os.Handler.handleCallback(Handler.java:587)
W/InputManagerService(163): at android.os.Handler.dispatchMessage(Handler.java:92)
W/InputManagerService(163): at android.os.Looper.loop(Looper.java:130)
W/InputManagerService(163): at com.android.server.ServerThread.run(SystemServer.java:559)
异常并不是应用本身抛出来的,而且出错的activity在AndroidManifest.xml中有设置android:windowSoftInputMode="stateAlwaysHidden",也就是软键盘恒定是隐藏的,并不涉及input相关的内容。
问题原因无法定位,上网各种google,搜索出来的结果无外乎类似于下面两种的说明:
(1)When the remote process gets killed by the OS,then you get a DeadObjectException.
Any process might get killed by the OS depending on system requirements.
(2)It seems like I've got a low memory issue in my App...
Can it be the reason why my IME process run away ?
也就是说,网上并没有直接解决问题的方法,搜索的话根本不可能得到直接的答案。
无奈,只能将出错的activity的代码一行行的读,希望找到问题的原因所在:
最终发现activity中有用到opengl的东东,且有如下代码:
Java代码
mGLSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);
这一行代码怎么看也不会有问题,但是仔细查看以下相关文档的说明发现有:(http://gjhappyyy.iteye.com/blog/1298729)
OpenGl ES关于渲染方式有以下两种:
RENDERMODE_CONTINUOUSLY和RENDERMODE_WHEN_DIRTY。
默认渲染方式为RENDERMODE_CONTINUOUSLY,这两种渲染的含义是:
RENDERMODE_CONTINUOUSLY:渲染器会不停地渲染场景,
RENDERMODE_WHEN_DIRTY:只有在创建和调用requestRender()时才会刷新。
一般设置为RENDERMODE_WHEN_DIRTY方式,这样不会让CPU一直处于高速运转状态,提高手机电池使用时间和软件整体性能。
也就是说activity页面在开着的时候,即使不做任何操作,手机的CPU等资源也是处于高速运转的状态,意味着有可能会耗掉其他app所需要的资源,从而触发其他应用导致InputManagerService的异常信息。
尝试将属性修改为GLSurfaceView.RENDERMODE_WHEN_DIRTY,测试:发现问题解决。
总结:
对于InputManagerService抛出的android.os.DeadObjectException相关异常,应该仔细检查出现异常的场景是否有大量使用cpu或者消耗内存的代码,而非找现成的答案。