summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Aurélien Pomini <pomini@google.com> 2023-06-01 19:11:01 +0000
committer Gerrit Code Review <noreply-gerritcodereview@google.com> 2023-06-01 19:11:01 +0000
commit20d546c0885670d2f25419c6c7c3a0cac18cc230 (patch)
tree34d3ed478035918afba40eed6bdcf6fe0ebd2efa
parenta55732d363d7a13ccd312ab9e0015fabe216a286 (diff)
parent7378b084ee43383a7c854adb2ff49ba17897acc2 (diff)
Merge "Delay tryToRebind if application exit reason is LMK"
-rw-r--r--services/core/java/com/android/server/wallpaper/WallpaperManagerService.java71
1 files changed, 58 insertions, 13 deletions
diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
index f9e2eae20c76..36b976562877 100644
--- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
+++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
@@ -36,6 +36,7 @@ import android.annotation.NonNull;
import android.app.ActivityManager;
import android.app.AppGlobals;
import android.app.AppOpsManager;
+import android.app.ApplicationExitInfo;
import android.app.ILocalWallpaperColorConsumer;
import android.app.IWallpaperManager;
import android.app.IWallpaperManagerCallback;
@@ -189,6 +190,10 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
private final Object mLock = new Object();
+ private static final double LMK_LOW_THRESHOLD_MEMORY_PERCENTAGE = 10;
+ private static final int LMK_RECONNECT_REBIND_RETRIES = 3;
+ private static final long LMK_RECONNECT_DELAY_MS = 5000;
+
/**
* Minimum time between crashes of a wallpaper service for us to consider
* restarting it vs. just reverting to the static wallpaper.
@@ -1208,6 +1213,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
/** Time in milliseconds until we expect the wallpaper to reconnect (unless we're in the
* middle of an update). If exceeded, the wallpaper gets reset to the system default. */
private static final long WALLPAPER_RECONNECT_TIMEOUT_MS = 10000;
+ private int mLmkLimitRebindRetries = LMK_RECONNECT_REBIND_RETRIES;
final WallpaperInfo mInfo;
IWallpaperService mService;
@@ -1448,20 +1454,51 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
&& mWallpaper.userId == mCurrentUserId
&& !Objects.equals(mDefaultWallpaperComponent, wpService)
&& !Objects.equals(mImageWallpaper, wpService)) {
- // There is a race condition which causes
- // {@link #mWallpaper.wallpaperUpdating} to be false even if it is
- // currently updating since the broadcast notifying us is async.
- // This race is overcome by the general rule that we only reset the
- // wallpaper if its service was shut down twice
- // during {@link #MIN_WALLPAPER_CRASH_TIME} millis.
- if (mWallpaper.lastDiedTime != 0
- && mWallpaper.lastDiedTime + MIN_WALLPAPER_CRASH_TIME
- > SystemClock.uptimeMillis()) {
- Slog.w(TAG, "Reverting to built-in wallpaper!");
- clearWallpaperLocked(true, FLAG_SYSTEM, mWallpaper.userId, null);
+ List<ApplicationExitInfo> reasonList =
+ mActivityManager.getHistoricalProcessExitReasons(
+ wpService.getPackageName(), 0, 1);
+ int exitReason = ApplicationExitInfo.REASON_UNKNOWN;
+ if (reasonList != null && !reasonList.isEmpty()) {
+ ApplicationExitInfo info = reasonList.get(0);
+ exitReason = info.getReason();
+ }
+ Slog.d(TAG, "exitReason: " + exitReason);
+ // If exit reason is LOW_MEMORY_KILLER
+ // delay the mTryToRebindRunnable for 10s
+ if (exitReason == ApplicationExitInfo.REASON_LOW_MEMORY) {
+ if (isRunningOnLowMemory()) {
+ Slog.i(TAG, "Rebind is delayed due to lmk");
+ mContext.getMainThreadHandler().postDelayed(mTryToRebindRunnable,
+ LMK_RECONNECT_DELAY_MS);
+ mLmkLimitRebindRetries = LMK_RECONNECT_REBIND_RETRIES;
+ } else {
+ if (mLmkLimitRebindRetries <= 0) {
+ Slog.w(TAG, "Reverting to built-in wallpaper due to lmk!");
+ clearWallpaperLocked(true, FLAG_SYSTEM, mWallpaper.userId,
+ null);
+ mLmkLimitRebindRetries = LMK_RECONNECT_REBIND_RETRIES;
+ return;
+ }
+ mLmkLimitRebindRetries--;
+ mContext.getMainThreadHandler().postDelayed(mTryToRebindRunnable,
+ LMK_RECONNECT_DELAY_MS);
+ }
} else {
- mWallpaper.lastDiedTime = SystemClock.uptimeMillis();
- tryToRebind();
+ // There is a race condition which causes
+ // {@link #mWallpaper.wallpaperUpdating} to be false even if it is
+ // currently updating since the broadcast notifying us is async.
+ // This race is overcome by the general rule that we only reset the
+ // wallpaper if its service was shut down twice
+ // during {@link #MIN_WALLPAPER_CRASH_TIME} millis.
+ if (mWallpaper.lastDiedTime != 0
+ && mWallpaper.lastDiedTime + MIN_WALLPAPER_CRASH_TIME
+ > SystemClock.uptimeMillis()) {
+ Slog.w(TAG, "Reverting to built-in wallpaper!");
+ clearWallpaperLocked(true, FLAG_SYSTEM, mWallpaper.userId, null);
+ } else {
+ mWallpaper.lastDiedTime = SystemClock.uptimeMillis();
+ tryToRebind();
+ }
}
}
} else {
@@ -1472,6 +1509,14 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
}
};
+ private boolean isRunningOnLowMemory() {
+ ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
+ mActivityManager.getMemoryInfo(memoryInfo);
+ double availableMBsInPercentage = memoryInfo.availMem / (double)memoryInfo.totalMem *
+ 100.0;
+ return availableMBsInPercentage < LMK_LOW_THRESHOLD_MEMORY_PERCENTAGE;
+ }
+
/**
* Called by a live wallpaper if its colors have changed.
* @param primaryColors representation of wallpaper primary colors