Loading services/core/java/com/android/server/wallpaper/WallpaperManagerService.java +58 −13 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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. Loading Loading @@ -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; Loading Loading @@ -1448,6 +1454,36 @@ public class WallpaperManagerService extends IWallpaperManager.Stub && mWallpaper.userId == mCurrentUserId && !Objects.equals(mDefaultWallpaperComponent, wpService) && !Objects.equals(mImageWallpaper, wpService)) { 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 { // 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. Loading @@ -1464,6 +1500,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub tryToRebind(); } } } } else { if (DEBUG_LIVE) { Slog.i(TAG, "Wallpaper changed during disconnect tracking; ignoring"); Loading @@ -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 Loading Loading
services/core/java/com/android/server/wallpaper/WallpaperManagerService.java +58 −13 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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. Loading Loading @@ -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; Loading Loading @@ -1448,6 +1454,36 @@ public class WallpaperManagerService extends IWallpaperManager.Stub && mWallpaper.userId == mCurrentUserId && !Objects.equals(mDefaultWallpaperComponent, wpService) && !Objects.equals(mImageWallpaper, wpService)) { 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 { // 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. Loading @@ -1464,6 +1500,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub tryToRebind(); } } } } else { if (DEBUG_LIVE) { Slog.i(TAG, "Wallpaper changed during disconnect tracking; ignoring"); Loading @@ -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 Loading