Could not read input channel file descriptors from parcel

困扰了三天的bug,由于堆栈信息不完整没有业务层的信息,搜网上也只是大致的原因,没有具体的解救方法,而且在我们这边一直没有复现,找不到出现问题的位置,就很痛苦。看堆栈信息只能找到是跳转目标Activity的位置crash了,堆栈信息:

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:759)
at android.view.ViewRootImpl.setView(ViewRootImpl.java:543)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:313)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:86)
at android.widget.Toast$TN.handleShow(Toast.java:434)
at android.widget.Toast$TN$1.run(Toast.java:338)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5438)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run
(ZygoteInit.java:739)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)

以下网上找到可能导致的原因:
*1.RemoteView中添加的图片太大了,超过40K会报这个异常;
*2.Intent传递的数据太大了超过1M也会报这个错误;
*3.FileDescripter太多而且没有关闭,looper太多没有quit;
*4.试试在AndroidManefest.xml中对当前Activity配置;configchange=“orientation|keyboardHidden”强制在Activity横竖屏切换的时候不重新onCreate。
*5.谷歌原生BUG很多人都遇到这个问题而且没有得到解决;

由于是新版本上了之后bug数才突增,虽然之前也有报类似的bug,但是原因不同,所以在新版本代码里排查了类似可能导致的问题之后,只能按新增的功能点按照可能发生的错误逐步review排查。
按新增代码来看可以排除1、4、5,只剩下2,3不能排除。
对于2 intent 传输数据太大,找了下新增功能的传输数据的位置,发现只有一个地方可能有问题,传输的是一个用户信息对象,由于目标页要求传输的数据很多,所以封装了一个对象(其实应该在目标页面重新请求下数据,队友可能比较珍惜用户的流量。。=、=)。我把用户信息改的很大,尝试了几次,没有复现,很蛋疼。对于目标问题3,由于新功能点没有开新的Handle,也没有用到相关的FileDescripter,找了半天也没有找到有可能的内存泄漏。所以没办法,只能把穿对象的位置修改了下,加了些页面追踪的log,祈祷就是这个位置出错,不是它,也希望log能起点作用,找到问题发生的位置,就打了个小版本,发布了5%的用户做小白鼠。

第二天。。。我日,还有,而且log并没有反馈出实质的问题位置,爆炸。。这样就只能是目标3可能会出问题了,找了下可能有内存泄漏的位置,或者有可能超过bug机型指定1024个FileDescripter的原因。找了个有帮助的链接:http://www.lichen.in/2017/08/15/could-not-read-input-channel-file-descriptors-from-parcel/ ,最可能原因在于FileDescripter的数量超过了1024,导致了内存泄漏,接着crash。

项目本身还不大,不复杂,正常不会超过1024个,那就可能是那个位置有可能循环,有可能资源重复调用导致这个问题。找了半天,偶然复现了问题,看了好多个帖子,偶然crash了。原因是app功能帖子页面跳转的时候,并没有刷新当前webview的link展示页面,而是新起了一个页面承载webview,在跳转之后也没有释放前一个页面的资源。。。这就导致很多的资源没有释放,导致了FileDescripter的数量超过了1024,导致了crash。当然这也是推测,毕竟crash了,心里有底了很多。改过之后,又发了个5%的小版本。。(可怜的小白鼠。。)。第二天,没有复现,有20%的用户量,又等了一天还是没有复现。所以今天推了100%,总算解决了这个蛋疼的问题,开心。

趁还热乎,发出来分享一下。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值