Unity中出现的TimeoutException android.content.res.AssetManager$AssetInputStream in close缓解之策

本文介绍了Unity游戏引擎在Android平台遇到的TimeoutException崩溃问题,分析了崩溃原因,提出通过自定义异常处理器来缓解崩溃的方法,并详细阐述了测试过程及遇到的挑战,最终给出完善后的解决方案,强调了优化代码结构和良好编程习惯的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


为什么标题说是“缓解之策”,因为这没法根治,如果要根治的话,请优化代码!

一、背景

最近项目组反馈,谷歌后台收到好多崩溃,如图
在这里插入图片描述

在这里插入图片描述
从堆栈中看,根本看不出是哪里导致的崩溃,只知道是TImeoutException!
哎,头大,怎么解决呢?!这么多崩溃,肯定得解决啊!

二、解决方案

1、分析问题

初步分析,导致该崩溃的原因为,AssetManager在释放资源的时候,调用AssetInputStream#close方法时,出现了超时,但比较坑的是,从堆栈信息看,并不知道是哪段代码出问题,先确保SDK的代码没有问题,找到SDK中使用到AssetManager的地方,用完务必要进行close操作!但是,问题并没有解决。还是继续报错!

2、寻找业界的解决方案

找到一篇讲得比较详细的文章:滴滴出行安卓端 finalize time out 的解决方案
这篇文章讲的主要思路,就是如何去避开这个崩溃,自定义Thread.UncaughtExceptionHandler,当捕捉到这个崩溃的时候,直接忽略,不让APP崩溃!

该崩溃出现的过程:

  1. FinalizerDaemon 执行对象 finalize() 超时。
  2. FinalizerWatchdogDaemon 检测到超时后,构造异常交给 Thread的defaultUncaughtExceptionHandler 调用 uncaughtException() 方法处理。
  3. APP 停止运行。

Thread 类的 defaultUncaughtExceptionHandler 我们很熟悉了,Java Crash 捕获一般都是通过设置 Thread.setDefaultUncaughtExceptionHandler() 方法设置一个自定义的 UncaughtExceptionHandler ,处理异常后通过链式调用,最后交给系统默认的 UncaughtExceptionHandler 去处理,在 Android 中默认的 UncaughtExceptionHandler 逻辑如下:

public class RuntimeInit {
   
   ...
  private static class UncaughtHandler implements Thread.UncaughtExceptionHandler {
   
      public void uncaughtException(Thread t, Throwable e) {
   
          try {
   
               ...
              // Bring up crash dialog, wait for it to be dismissed 展示APP停止运行对话框
              ActivityManagerNative.getDefault().handleApplicationCrash(
                      mApplicationObject, new ApplicationErrorReport.CrashInfo(e));
          } catch (Throwable t2) {
   
               ...
          } finally {
   
              // Try everything to make sure this process goes away.
              Process.killProcess(Process.myPid()); //退出进程
              System.exit(10);
          }
      }
  }

   private static final void commonInit() {
   
       ...
       /* set default handler; this applies to all threads in the VM */
       Thread.setDefaultUncaughtExceptionHandler
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值