1. finalize time out crash fix
Fatal Exception: java.util.concurrent.TimeoutException
android.content.res.AssetManager$AssetInputStream.finalize() timed out after 10 seconds
android.content.res.AssetManager$AssetInputStream.close
该异常是由于finalize方法超时导致,可以自定义一个类来复现该场景:
public class FinalizeTimeoutView extends View {
private final String TAG = "FinalizeTimeoutView";
public FinalizeTimeoutView(Context context) {
super(context);
}
@Override
protected void finalize() throws Throwable {
Log.e(TAG, "finalize-begin");
Thread.sleep(1000 * 20);
super.finalize();
Log.e(TAG, "finalize-end");
}
}
在一个Activity中,重复多次创建FinalizeTimeoutView
,然后退出,在过20s过后,该问题就复现出来了。
解决方法是在出现 TimeoutException 时主动忽略这个异常,阻断 UncaughtExceptionHandler 链式调用,使系统默认的 UncaughtExceptionHandler 不会被调用,APP 就不会停止运行而继续存活下去。由于这个过程用户无感知,对用户无明显影响,可以最大限度的减少对用户的影响。
val oldHandler = Thread.getDefaultUncaughtExceptionHandler()
Thread.setDefaultUncaughtExceptionHandler { t, e ->
if (t.name == "FinalizerWatchdogDaemon" && e is TimeoutException) {
Log.e(TAG, "ignore it")
} else {
oldHandler.uncaughtException(t, e)
}
}