`
lynen
  • 浏览: 130281 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

InputManagerService异常DeadObjectException的解决思路

 
阅读更多

最近维护到一个应用程序的代码,在某个activity页面中,页面只要打开持续一段时间(区分手机设备,htc的部分时间能持续半个小时以上不挂,samsung的手机有的40秒不到就挂,有的手机甚至是10秒中就会挂)。

 

查看后台抛出的异常信息如下:

 

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的东东,且有如下代码:

 

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或者消耗内存的代码,而非找现成的答案。

分享到:
评论

相关推荐

    Android 按键消息流程源码分析

    - **InputManagerService的创建**:随后创建`InputManagerService`实例,其中传入了用于处理按键消息的`Handler`。 这部分代码大致如下: ```java // SystemServer.java wmHandlerThread = new HandlerThread(...

    深入解析Android中的事件传递

    本文将深入探讨Android事件传递的机制,从InputManagerService开始,直至事件如何在View和Activity之间流转。 首先,事件的源头是硬件设备,如触摸屏或物理按键。在Android Framework层,InputManagerService扮演着...

    MagnificationGestureMechanism_Introduce

    放大手势涉及到的系统服务包括ContentService、InputManagerService以及AccessibilityManagerService。这三个服务作为Java层的系统服务,在设备启动时由SystemServer初始化并启动。ContentService是第一个启动的服务...

    Android之Input子系统事件分发流程 - CSDN博客1

    总的来说,Android Input子系统的事件分发流程涉及了从硬件驱动到应用程序的多个层级,包括InputDispatcher、InputManagerService、InputChannel、ViewRootImpl以及View层次结构。理解这一流程对于优化用户交互和...

    android input system简介(android6.0)

    在 Android 6.0 中,Input System 的核心组件是 `InputManagerService` (IMS)。本文将详细介绍 IMS 的工作原理及其与其他组件的交互方式。 #### InputManagerService 的启动与初始化 1. **启动过程**: - 在 `...

    我的总结--Android之ANR的原理(Input, Service, Broadcast)

    ANR(Application Not Responding)是指Android应用程序在执行过程中响应超时的一种异常状态。当应用程序长时间不响应用户的操作时,系统会提示用户该应用无响应,并提供是否强制关闭应用的选择。 #### Input处理...

    [Hasen图示系列]android中键盘消息处理机制

    是由InputManagerService 来监控的, 而InputManagerService 是由 SystemServer 来启动的 创建了一个类的对象 WindowInputEvent Receiver InputEventRe ceiver的构造 函数 WindowInputEventReceiver extends Input...

    Android input系统.pdf

     InputManagerService.java : 负责Input Reader 和 Input Dispatcher的创建, 并提供Policy 用于Events的预处理.  WindowManagerService.java : 作为应用与IMS的通信桥梁, 也作为InputDispatcher向AMS报告ANR的...

    touch driver android

    在Android设备的硬件抽象层(HAL,Hardware Abstraction Layer)中,触摸屏驱动通过`InputManagerService`与上层应用程序框架交互,传递用户输入事件。当用户触摸屏幕时,触控IC检测到这些事件,驱动程序则将它们...

    android envent 事件派发机制 源代码

    在Android框架层,`InputManagerService`负责接收这些事件并进行初步处理。 事件进入Android应用层后,会通过`WindowManager`服务的`ViewRootImpl`类进行分发。`ViewRootImpl`是连接应用程序和系统服务的关键组件,...

    MMI Platform Source Code Training

    4. **框架层解析**:分析Android系统的InputManagerService和WindowManagerService如何处理来自硬件的输入事件,以及如何将这些事件传递给应用程序。 5. **图形渲染**:探讨OpenGL ES、 Vulkan等图形库在MMI中的...

    Android热插拔监听源代码

    3. **InputManagerService**:输入管理服务不仅管理触摸屏和其他输入设备,也处理耳机按键的输入事件。当耳机插入时,InputManagerService可能需要更新按键映射,以便处理耳机上的媒体控制按钮。 4. **...

    在android下移植tslib

    这涉及到创建一个新的 HAL 层,使得 Android 系统能够通过 InputManagerService 与 tslib 交互。 5. **校准和配置**:在设备上运行 `ts_calibrate` 工具进行触摸屏校准,生成校准数据并保存。这些数据通常会被存储...

    NT11003触摸屏驱动,MTK方案

    MediaTek(MTK)是一家知名的半导体公司,其芯片解决方案广泛用于各种移动设备,尤其是中低端市场。MTK的Android平台集成了大量的硬件接口和功能,包括对触摸屏的支持。因此,针对MTK方案的触摸屏驱动需要与MTK的...

    Android底层开发技术实战详解_replied12k_android驱动_android驱动_android_

    4. **Android Framework**:驱动程序通常与Android框架中的服务进行交互,如InputManagerService处理输入事件,PowerManagerService控制电源状态。开发者需要熟悉这些服务的接口,以便正确地与之通信。 5. **驱动...

    BOOT_COMPLETED issue analysis report

    在Android系统中,输入事件的获取和分发是由InputManagerService的两个线程InputReader和InputDispatcher来负责。其中,InputReader通过EventHub获取各种类型的输入事件,并在事件入队前,通过InputDispatcher进行...

    Android GUI

    InputManagerService分发事件到WindowManagerService。 5. WindowManagerService根据窗口栈的顺序将事件分发给应用。 6. 应用接收到事件并根据事件类型进行相应的处理。 #### 七、总结 Android GUI系统是一个...

Global site tag (gtag.js) - Google Analytics