部分OPPO機型 AssetManager.finalize() timed out的修復

weixin_34146805發表於2018-08-24

線上上的APP經常收到如下的崩潰報告
.finalize() timed out

2714905-3197a26931dd5e68.png
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這件小事

相關文章