diff options
author | 2023-06-01 19:11:01 +0000 | |
---|---|---|
committer | 2023-06-01 19:11:01 +0000 | |
commit | 20d546c0885670d2f25419c6c7c3a0cac18cc230 (patch) | |
tree | 34d3ed478035918afba40eed6bdcf6fe0ebd2efa | |
parent | a55732d363d7a13ccd312ab9e0015fabe216a286 (diff) | |
parent | 7378b084ee43383a7c854adb2ff49ba17897acc2 (diff) |
Merge "Delay tryToRebind if application exit reason is LMK"
-rw-r--r-- | services/core/java/com/android/server/wallpaper/WallpaperManagerService.java | 71 |
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 |