From 8e9d78ff91bef9a80ba210d1b3bce0f7101b391d Mon Sep 17 00:00:00 2001 From: Rubin Xu Date: Fri, 2 Jul 2021 14:32:03 +0100 Subject: [PATCH] Delay gargabe collection during onDestroy() Allow the activity object to become unreachable before iniating a gargabe collection to sanitize memory. Bug: 189315376 Test: add device lock, confirm device lock in Settings, then a memory dump and search for password shards. Change-Id: I807d74628e1355814807855ad309d86ca1fb38a1 --- .../ConfirmDeviceCredentialBaseActivity.java | 15 ++++++++++----- .../settings/password/ConfirmLockPassword.java | 15 ++++++++++----- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/com/android/settings/password/ConfirmDeviceCredentialBaseActivity.java b/src/com/android/settings/password/ConfirmDeviceCredentialBaseActivity.java index 40297551152..de3ee517779 100644 --- a/src/com/android/settings/password/ConfirmDeviceCredentialBaseActivity.java +++ b/src/com/android/settings/password/ConfirmDeviceCredentialBaseActivity.java @@ -18,6 +18,8 @@ package com.android.settings.password; import android.app.KeyguardManager; import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; import android.os.UserManager; import android.util.Log; import android.view.MenuItem; @@ -163,11 +165,14 @@ public abstract class ConfirmDeviceCredentialBaseActivity extends SettingsActivi @Override public void onDestroy() { super.onDestroy(); - // Force a garbage collection immediately to remove remnant of user password shards - // from memory. - System.gc(); - System.runFinalization(); - System.gc(); + // Force a garbage collection to remove remnant of user password shards from memory. + // Execute this with a slight delay to allow the activity lifecycle to complete and + // the instance to become gc-able. + new Handler(Looper.myLooper()).postDelayed(() -> { + System.gc(); + System.runFinalization(); + System.gc(); + }, 5000); } @Override diff --git a/src/com/android/settings/password/ConfirmLockPassword.java b/src/com/android/settings/password/ConfirmLockPassword.java index 0278941e797..de32f139594 100644 --- a/src/com/android/settings/password/ConfirmLockPassword.java +++ b/src/com/android/settings/password/ConfirmLockPassword.java @@ -25,6 +25,8 @@ import android.graphics.Typeface; import android.os.AsyncTask; import android.os.Bundle; import android.os.CountDownTimer; +import android.os.Handler; +import android.os.Looper; import android.os.SystemClock; import android.os.UserManager; import android.os.storage.StorageManager; @@ -216,11 +218,14 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity { public void onDestroy() { super.onDestroy(); mPasswordEntry.setText(null); - // Force a garbage collection immediately to remove remnant of user password shards - // from memory. - System.gc(); - System.runFinalization(); - System.gc(); + // Force a garbage collection to remove remnant of user password shards from memory. + // Execute this with a slight delay to allow the activity lifecycle to complete and + // the instance to become gc-able. + new Handler(Looper.myLooper()).postDelayed(() -> { + System.gc(); + System.runFinalization(); + System.gc(); + }, 5000); } private int getDefaultHeader() {