部分OPPO机型 AssetManager.finalize() timed out的修复

在线上的APP经常收到如下的崩溃报告
.finalize() timed out

image.png

在排除了内存泄漏的情况后,仔细核查后发现多发在OPPO系列的机型中,包括R9 A33 A59等等。猜测是OPPO的定制ROM在底层做了什么修改。为了减少这样的报错,只有对OPPO进行特殊处理。
查找了一些资料后发现这类错误是由于回收对象时间过长,由FinalizerWatchdogDaemon负责计时,超时后抛出异常关闭VM的。
那么有两种解决办法:1关掉这个负责计时的,2延长计时时间

try {
    Class clazz = Class.forName("java.lang.Daemons$FinalizerWatchdogDaemon");
    Method method = clazz.getSuperclass().getDeclaredMethod("stop");
    method.setAccessible(true);
    Field field = clazz.getDeclaredField("INSTANCE");
    field.setAccessible(true);
    method.invoke(field.get(null));
} catch (Throwable e) {
    e.printStackTrace();
}

或者

try {
    Class c = Class.forName("java.lang.Daemons");
    Field maxField = c.getDeclaredField("MAX_FINALIZE_NANOS");
    maxField.setAccessible(true);
    maxField.set(null, Long.MAX_VALUE);
} catch (ClassNotFoundException e) {
    e.printStackTrace();
} catch (NoSuchFieldException e) {
    e.printStackTrace();
} catch (IllegalAccessException e) {
    e.printStackTrace();
}

参考文档
[1]stackoverflow How to handle :java.util.concurrent.TimeoutException: android.os.BinderProxy.finalize() timed out after 10 seconds errors?
[2]courtier博客 关于TimeoutException这件小事

你可能感兴趣的:(部分OPPO机型 AssetManager.finalize() timed out的修复)