diff options
author | 2022-12-26 14:26:50 +0530 | |
---|---|---|
committer | 2023-05-23 18:20:57 +0900 | |
commit | 7378b084ee43383a7c854adb2ff49ba17897acc2 (patch) | |
tree | ff6748147a0ac750cb966a4604da0d8a37991fed | |
parent | d52e734a2ec8935e4f246a7521e3b4f3f8e89701 (diff) |
Delay tryToRebind if application exit reason is LMK
Live Wallpaper should fallback to Default Wallpaper only when there is
an issue with Live Wallpaper. For any other reason if the application
exits for example Live Wallpaper is exited because of LMK and fallback
happened to Default WallPaper, which is not expected behavior.
This change will check if application exit reason is LMK and device is
on running on low memory then will try to rebind after 10 seconds. If
the device is running on sufficient memory then we will try to avoid
repeated rebinds, we are restricting with retries rebind count as 3 and
if lmk situation is not improved during the 3 trials and live wallpaper
is not set, then set the default image wallpaper.
Bug: 266364123
Test: Manual - Fill the RAM using a memory fill application.
Change-Id: I6dd2daccfdb1bd3f1c8f6ca245ab2d0aee373b56
-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 |