安卓:在三星设备上添加窗口失败/ android.os.TransactionTooLargeException

11

最近几个月,我的应用程序出现了大量异常,错误消息为:添加窗口失败(android.os.TransactionTooLargeException)。

我知道IPC缓冲区事务大小限制为1024KB,但我只是向我的服务发送ID(Long值)。 奇怪的是,这些异常仅在Android 4.4.2上的三星设备上发生(超过50K次崩溃中的每一个)。 您是否知道最新的三星ROM中的特定错误?

    java.lang.RuntimeException: Adding window failed
       at android.view.ViewRootImpl.setView(ViewRootImpl.java:738)
       at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:278)
       at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
       at android.widget.Toast$TN.handleShow(Toast.java:478)
       at android.widget.Toast$TN$1.run(Toast.java:374)
       at android.os.Handler.handleCallback(Handler.java:733)
       at android.os.Handler.dispatchMessage(Handler.java:95)
       at android.os.Looper.loop(Looper.java:136)
       at android.app.ActivityThread.main(ActivityThread.java:5476)
       at java.lang.reflect.Method.invokeNative(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:515)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
       at dalvik.system.NativeStart.main(NativeStart.java)
Caused by: android.os.TransactionTooLargeException
       at android.os.BinderProxy.transact(Binder.java)
       at android.view.IWindowSession$Stub$Proxy.addToDisplay(IWindowSession.java:710)
       at android.view.ViewRootImpl.setView(ViewRootImpl.java:727)
       at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:278)
       at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
       at android.widget.Toast$TN.handleShow(Toast.java:478)
       at android.widget.Toast$TN$1.run(Toast.java:374)
       at android.os.Handler.handleCallback(Handler.java:733)
       at android.os.Handler.dispatchMessage(Handler.java:95)
       at android.os.Looper.loop(Looper.java:136)
       at android.app.ActivityThread.main(ActivityThread.java:5476)
       at java.lang.reflect.Method.invokeNative(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:515)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
       at dalvik.system.NativeStart.main(NativeStart.java)
或者
    java.lang.RuntimeException: Adding window failed
       at android.view.ViewRootImpl.setView(ViewRootImpl.java:726)
       at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:278)
       at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
       at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3038)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2368)
       at android.app.ActivityThread.access$900(ActivityThread.java:161)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:157)
       at android.app.ActivityThread.main(ActivityThread.java:5356)
       at java.lang.reflect.Method.invokeNative(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:515)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
       at dalvik.system.NativeStart.main(NativeStart.java)
Caused by: android.os.TransactionTooLargeException
       at android.os.BinderProxy.transact(Binder.java)
       at android.view.IWindowSession$Stub$Proxy.addToDisplay(IWindowSession.java:710)
       at android.view.ViewRootImpl.setView(ViewRootImpl.java:715)
       at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:278)
       at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
       at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3038)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2368)
       at android.app.ActivityThread.access$900(ActivityThread.java:161)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:157)
       at android.app.ActivityThread.main(ActivityThread.java:5356)
       at java.lang.reflect.Method.invokeNative(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:515)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
       at dalvik.system.NativeStart.main(NativeStart.java)

是的,我在某些Toast消息中使用了一些SpannableString内容: SpannableString span = new SpannableString(builder.toString()); 如果没有空错误消息,则: span.setSpan(new ForegroundColorSpan(this.service.getResources().getColor(R.color.orange_logo)), pos, builder.toString().length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); span.setSpan(new StyleSpan(Typeface.BOLD), pos, builder.toString().length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 但结果不超过200个字符。 - user1026605
事实上,我添加了第二个堆栈跟踪,它比第一个发生得更频繁。仍然只在三星设备上出现... - user1026605
你知道最新的三星ROM中的特定错误吗?你已经统计证明了这一点。据我所知,1MB的事务缓冲区在事务未完成时必须保持所有数据缓冲,就像这种情况:https://dev59.com/lmgu5IYBdhLWcg3wRlBh#16895870。因此,也许在这些设备上某些东西没有正确清理,只留下比通常更小的缓冲区,而你的应用程序恰好使用了更多。也许有机会通过堆转储查看正在使用缓冲区的内容,尽管IPC缓冲区可能在本地代码中。 - zapl
我有同样的问题,但所有报告都只显示它发生在Android 4.4操作系统的一个版本中,我觉得这不是Binder的问题,而是某个ROM没有做对。问题是,你是否认为这个异常可能是因为三星没有正确添加或处理某个C库? - JPM
可能是TransactionTooLargeException应对方法的重复问题。 - petey
显示剩余3条评论
3个回答

1
请在stack overflow 这里 查看所提供的答案。
Durairaj Packirisamy回答了与TransactionTooLarge错误相关的同样问题,如下所示。
Durairaj Packirisamy说:-
我遇到了这个问题,发现当服务和应用程序之间交换大量数据时(这涉及传输大量缩略图),实际数据大小约为500kb,IPC事务缓冲区大小设置为1024KB。 我不确定为什么超过了事务缓冲区。
当您通过意图额外传递大量数据时,也可能会出现此问题。
当您在应用程序中遇到此异常时,请分析您的代码。
您是否在服务和应用程序之间交换了大量数据? 使用意图共享大量数据(例如,用户从画廊中选择大量文件并按下共享按钮,则所选文件的URI将使用意图传输) 从服务接收位图文件 等待Android响应大量数据(例如,getInstalledApplications()当用户安装了很多应用程序时) 使用applyBatch()有很多操作待处理 如何处理此异常

如果可能的话,将大操作拆分成小块,例如,不要使用1000个操作调用applyBatch(),而是每次使用100个调用它。

不要在服务和应用之间交换大量数据(>1MB)

我不知道如何做到这一点,但是不要查询Android,因为它可能会返回大量数据 :-)


: 最近也遇到了这个问题。我的问题是,我将视频从raw文件夹复制到sd卡上,然后创建缩略图,并在列表视图中显示。整个过程都在单个线程上执行,抛出异常。我通过将从raw文件夹复制视频到sd卡、创建缩略图和在列表上显示的整个过程分离成3个不同的线程来解决了这个问题。我的问题得到了解决。

请让我知道它是否有帮助。


0
我在三星设备上也遇到了TransactionTooLargeException。 我在意图附加项中传输了太大的HTML数据,但现在通过减少数据量来解决了这个问题。
当你的应用程序出现TransactionTooLargeException异常时,请检查你的代码。 避免在意图附加项中使用大量数据。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接