当Android的StrictMode检测到泄漏的对象(例如 Activity )违规时,如果我能及时捕获堆转储将很有帮助。但是,没有明显的方法来配置它来执行此操作。有谁知道一些可以用来实现的技巧,例如一种说服系统在调用死刑之前运行特定代码的方法?我不认为StrictMode会引发异常,因此我无法使用此处描述的技巧:Is there a way to have an Android process produce a heap dump on an OutOfMemoryError?
最佳答案
也不异常(exception),但是StrictMode
确实在终止之前将消息打印到System.err
。因此,这是一个hack,但是它可以工作,并且因为仅在调试版本中启用,所以我认为这很好... :)
在onCreate()
中:
//monitor System.err for messages that indicate the process is about to be killed by
//StrictMode and cause a heap dump when one is caught
System.setErr (new HProfDumpingStderrPrintStream (System.err));
该类指的是:
private static class HProfDumpingStderrPrintStream extends PrintStream
{
public HProfDumpingStderrPrintStream (OutputStream destination)
{
super (destination);
}
@Override
public synchronized void println (String str)
{
super.println (str);
if (str.equals ("StrictMode VmPolicy violation with POLICY_DEATH; shutting down."))
{
// StrictMode is about to terminate us... don't let it!
super.println ("Trapped StrictMode shutdown notice: logging heap data");
try {
android.os.Debug.dumpHprofData(app.getDir ("hprof", MODE_WORLD_READABLE) + "/strictmode-death-penalty.hprof");
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
(其中
app
是外部类中的静态字段,包含对应用程序上下文的引用,以方便引用)它匹配的字符串从 Gingerbread 发布一直到果冻 bean 一直没有改变,但是理论上它在将来的版本中可能会发生变化,因此值得检查新版本以确保它们仍然使用相同的消息。