Saving heap dump immediately as reported by StrictMode

Can do this via API with the exact heap state that triggered the
callback because using API allows to avoid deadlock that we'd have in
main thread if we used shell command.

checkDetectedLeaks() is still needed, as I'll add throwing an
exception there soon.

Bug: 139137636
Change-Id: I3c8670071b058c5c146ac58bb16152c980553065
This commit is contained in:
vadimt
2020-03-02 18:05:58 -08:00
committed by Vadim Tryshev
parent d7ac763b98
commit 3d9dad3b9b

View File

@@ -35,9 +35,11 @@ import android.content.pm.ActivityInfo;
import android.content.pm.LauncherActivityInfo;
import android.content.pm.LauncherApps;
import android.content.pm.PackageManager;
import android.os.Debug;
import android.os.Process;
import android.os.RemoteException;
import android.os.StrictMode;
import android.util.Log;
import androidx.test.InstrumentationRegistry;
import androidx.test.uiautomator.By;
@@ -117,6 +119,14 @@ public abstract class AbstractLauncherUiTest {
// so let's just mark the fact that the leak has happened.
if (sDetectedActivityLeak == null) {
sDetectedActivityLeak = violation.toString();
try {
Debug.dumpHprofData(
getInstrumentation().getTargetContext()
.getFilesDir().getPath()
+ "/ActivityLeakHeapDump.hprof");
} catch (IOException e) {
Log.e(TAG, "dumpHprofData failed", e);
}
}
});
StrictMode.setVmPolicy(builder.build());
@@ -126,18 +136,6 @@ public abstract class AbstractLauncherUiTest {
public static void checkDetectedLeaks() {
if (sDetectedActivityLeak != null && !sActivityLeakReported) {
sActivityLeakReported = true;
final UiDevice device = UiDevice.getInstance(getInstrumentation());
try {
device.executeShellCommand(
"am dumpheap "
+ device.getLauncherPackageName()
+ " "
+ getInstrumentation().getTargetContext().getFilesDir().getPath()
+ "/ActivityLeakHeapDump.hprof");
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}