Loading core/java/android/app/ActivityManagerInternal.java +17 −0 Original line number Diff line number Diff line Loading @@ -340,4 +340,21 @@ public abstract class ActivityManagerInternal { * like persisting database etc. */ public abstract void prepareForPossibleShutdown(); /** * Returns {@code true} if {@code uid} is running a foreground service of a specific * {@code foregroundServiceType}. */ public abstract boolean hasRunningForegroundService(int uid, int foregroundServiceType); /** * Registers the specified {@code processObserver} to be notified of future changes to * process state. */ public abstract void registerProcessObserver(IProcessObserver processObserver); /** * Unregisters the specified {@code processObserver}. */ public abstract void unregisterProcessObserver(IProcessObserver processObserver); } core/java/android/app/IProcessObserver.aidl +1 −0 Original line number Diff line number Diff line Loading @@ -19,5 +19,6 @@ package android.app; /** {@hide} */ oneway interface IProcessObserver { void onForegroundActivitiesChanged(int pid, int uid, boolean foregroundActivities); void onForegroundServicesChanged(int pid, int uid, int serviceTypes); void onProcessDied(int pid, int uid); } services/core/java/com/android/server/am/ActivityManagerService.java +87 −1 Original line number Diff line number Diff line Loading @@ -1273,11 +1273,13 @@ public class ActivityManagerService extends IActivityManager.Stub static final class ProcessChangeItem { static final int CHANGE_ACTIVITIES = 1<<0; static final int CHANGE_FOREGROUND_SERVICES = 1<<1; int changes; int uid; int pid; int processState; boolean foregroundActivities; int foregroundServiceTypes; } static final class UidObserverRegistration { Loading Loading @@ -3079,6 +3081,13 @@ public class ActivityManagerService extends IActivityManager.Stub observer.onForegroundActivitiesChanged(item.pid, item.uid, item.foregroundActivities); } if ((item.changes & ProcessChangeItem.CHANGE_FOREGROUND_SERVICES) != 0) { if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG_PROCESS_OBSERVERS, "FOREGROUND SERVICES CHANGED pid=" + item.pid + " uid=" + item.uid + ": " + item.foregroundServiceTypes); observer.onForegroundServicesChanged(item.pid, item.uid, item.foregroundServiceTypes); } } } catch (RemoteException e) { } Loading @@ -3093,6 +3102,47 @@ public class ActivityManagerService extends IActivityManager.Stub } } @GuardedBy("this") ProcessChangeItem enqueueProcessChangeItemLocked(int uid, int pid) { int i = mPendingProcessChanges.size()-1; ActivityManagerService.ProcessChangeItem item = null; while (i >= 0) { item = mPendingProcessChanges.get(i); if (item.pid == pid) { if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG_PROCESS_OBSERVERS, "Re-using existing item: " + item); break; } i--; } if (i < 0) { // No existing item in pending changes; need a new one. final int NA = mAvailProcessChanges.size(); if (NA > 0) { item = mAvailProcessChanges.remove(NA-1); if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG_PROCESS_OBSERVERS, "Retrieving available item: " + item); } else { item = new ActivityManagerService.ProcessChangeItem(); if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG_PROCESS_OBSERVERS, "Allocating new item: " + item); } item.changes = 0; item.pid = pid; item.uid = uid; if (mPendingProcessChanges.size() == 0) { if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG_PROCESS_OBSERVERS, "*** Enqueueing dispatch processes changed!"); mUiHandler.obtainMessage(DISPATCH_PROCESSES_CHANGED_UI_MSG) .sendToTarget(); } mPendingProcessChanges.add(item); } return item; } private void dispatchProcessDied(int pid, int uid) { int i = mProcessObservers.beginBroadcast(); while (i > 0) { Loading Loading @@ -16275,11 +16325,12 @@ public class ActivityManagerService extends IActivityManager.Stub @GuardedBy("this") final void updateProcessForegroundLocked(ProcessRecord proc, boolean isForeground, int fgServiceTypes, boolean oomAdj) { proc.setHasForegroundServices(isForeground, fgServiceTypes); final boolean hasFgServiceLocationType = (fgServiceTypes & ServiceInfo.FOREGROUND_SERVICE_TYPE_LOCATION) != 0; if (isForeground != proc.hasForegroundServices() || proc.hasLocationForegroundServices() != hasFgServiceLocationType) { proc.setHasForegroundServices(isForeground, fgServiceTypes); ArrayList<ProcessRecord> curProcs = mForegroundPackages.get(proc.info.packageName, proc.info.uid); if (isForeground) { Loading Loading @@ -16308,6 +16359,13 @@ public class ActivityManagerService extends IActivityManager.Stub updateOomAdjLocked(); } } if (proc.getForegroundServiceTypes() != fgServiceTypes) { proc.setReportedForegroundServiceTypes(fgServiceTypes); ProcessChangeItem item = enqueueProcessChangeItemLocked(proc.info.uid, proc.pid); item.changes = ProcessChangeItem.CHANGE_FOREGROUND_SERVICES; item.foregroundServiceTypes = fgServiceTypes; } } // TODO(b/111541062): This method is only used for updating OOM adjustments. We need to update Loading Loading @@ -18101,6 +18159,34 @@ public class ActivityManagerService extends IActivityManager.Stub public void prepareForPossibleShutdown() { ActivityManagerService.this.prepareForPossibleShutdown(); } @Override public boolean hasRunningForegroundService(int uid, int foregroundServicetype) { synchronized (ActivityManagerService.this) { for (int i = 0; i < mProcessList.mLruProcesses.size(); i++) { final ProcessRecord pr = mProcessList.mLruProcesses.get(i); if (pr.uid != uid) { continue; } if ((pr.getForegroundServiceTypes() & foregroundServicetype) != 0) { return true; } } } return false; } @Override public void registerProcessObserver(IProcessObserver processObserver) { ActivityManagerService.this.registerProcessObserver(processObserver); } @Override public void unregisterProcessObserver(IProcessObserver processObserver) { ActivityManagerService.this.unregisterProcessObserver(processObserver); } } long inputDispatchingTimedOut(int pid, final boolean aboveSystem, String reason) { services/core/java/com/android/server/am/OomAdjuster.java +3 −36 Original line number Diff line number Diff line Loading @@ -38,7 +38,6 @@ import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_PSS; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_UID_OBSERVERS; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_USAGE_STATS; import static com.android.server.am.ActivityManagerService.DISPATCH_OOM_ADJ_OBSERVER_MSG; import static com.android.server.am.ActivityManagerService.DISPATCH_PROCESSES_CHANGED_UI_MSG; import static com.android.server.am.ActivityManagerService.IDLE_UIDS_MSG; import static com.android.server.am.ActivityManagerService.TAG_BACKUP; import static com.android.server.am.ActivityManagerService.TAG_LRU; Loading Loading @@ -1921,41 +1920,9 @@ public final class OomAdjuster { if (changes != 0) { if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG_PROCESS_OBSERVERS, "Changes in " + app + ": " + changes); int i = mService.mPendingProcessChanges.size()-1; ActivityManagerService.ProcessChangeItem item = null; while (i >= 0) { item = mService.mPendingProcessChanges.get(i); if (item.pid == app.pid) { if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG_PROCESS_OBSERVERS, "Re-using existing item: " + item); break; } i--; } if (i < 0) { // No existing item in pending changes; need a new one. final int NA = mService.mAvailProcessChanges.size(); if (NA > 0) { item = mService.mAvailProcessChanges.remove(NA-1); if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG_PROCESS_OBSERVERS, "Retrieving available item: " + item); } else { item = new ActivityManagerService.ProcessChangeItem(); if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG_PROCESS_OBSERVERS, "Allocating new item: " + item); } item.changes = 0; item.pid = app.pid; item.uid = app.info.uid; if (mService.mPendingProcessChanges.size() == 0) { if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG_PROCESS_OBSERVERS, "*** Enqueueing dispatch processes changed!"); mService.mUiHandler.obtainMessage(DISPATCH_PROCESSES_CHANGED_UI_MSG) .sendToTarget(); } mService.mPendingProcessChanges.add(item); } item.changes |= changes; ActivityManagerService.ProcessChangeItem item = mService.enqueueProcessChangeItemLocked(app.pid, app.info.uid); item.changes = changes; item.foregroundActivities = app.repForegroundActivities; if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG_PROCESS_OBSERVERS, "Item " + Integer.toHexString(System.identityHashCode(item)) Loading services/core/java/com/android/server/am/ProcessRecord.java +13 −0 Original line number Diff line number Diff line Loading @@ -174,6 +174,7 @@ class ProcessRecord implements WindowProcessListener { boolean hasStartedServices; // Are there any started services running in this process? private boolean mHasForegroundServices; // Running any services that are foreground? private int mFgServiceTypes; // Type of foreground service, if there is a foreground service. private int mRepFgServiceTypes; // Last reported foreground service types. private boolean mHasForegroundActivities; // Running any activities that are foreground? boolean repForegroundActivities; // Last reported foreground activities. boolean systemNoUi; // This is a system process, but not currently showing UI. Loading Loading @@ -1079,6 +1080,18 @@ class ProcessRecord implements WindowProcessListener { && (mFgServiceTypes & ServiceInfo.FOREGROUND_SERVICE_TYPE_LOCATION) != 0; } int getForegroundServiceTypes() { return mHasForegroundServices ? mFgServiceTypes : 0; } int getReportedForegroundServiceTypes() { return mRepFgServiceTypes; } void setReportedForegroundServiceTypes(int foregroundServiceTypes) { mRepFgServiceTypes = foregroundServiceTypes; } void setHasForegroundActivities(boolean hasForegroundActivities) { mHasForegroundActivities = hasForegroundActivities; mWindowProcessController.setHasForegroundActivities(hasForegroundActivities); Loading Loading
core/java/android/app/ActivityManagerInternal.java +17 −0 Original line number Diff line number Diff line Loading @@ -340,4 +340,21 @@ public abstract class ActivityManagerInternal { * like persisting database etc. */ public abstract void prepareForPossibleShutdown(); /** * Returns {@code true} if {@code uid} is running a foreground service of a specific * {@code foregroundServiceType}. */ public abstract boolean hasRunningForegroundService(int uid, int foregroundServiceType); /** * Registers the specified {@code processObserver} to be notified of future changes to * process state. */ public abstract void registerProcessObserver(IProcessObserver processObserver); /** * Unregisters the specified {@code processObserver}. */ public abstract void unregisterProcessObserver(IProcessObserver processObserver); }
core/java/android/app/IProcessObserver.aidl +1 −0 Original line number Diff line number Diff line Loading @@ -19,5 +19,6 @@ package android.app; /** {@hide} */ oneway interface IProcessObserver { void onForegroundActivitiesChanged(int pid, int uid, boolean foregroundActivities); void onForegroundServicesChanged(int pid, int uid, int serviceTypes); void onProcessDied(int pid, int uid); }
services/core/java/com/android/server/am/ActivityManagerService.java +87 −1 Original line number Diff line number Diff line Loading @@ -1273,11 +1273,13 @@ public class ActivityManagerService extends IActivityManager.Stub static final class ProcessChangeItem { static final int CHANGE_ACTIVITIES = 1<<0; static final int CHANGE_FOREGROUND_SERVICES = 1<<1; int changes; int uid; int pid; int processState; boolean foregroundActivities; int foregroundServiceTypes; } static final class UidObserverRegistration { Loading Loading @@ -3079,6 +3081,13 @@ public class ActivityManagerService extends IActivityManager.Stub observer.onForegroundActivitiesChanged(item.pid, item.uid, item.foregroundActivities); } if ((item.changes & ProcessChangeItem.CHANGE_FOREGROUND_SERVICES) != 0) { if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG_PROCESS_OBSERVERS, "FOREGROUND SERVICES CHANGED pid=" + item.pid + " uid=" + item.uid + ": " + item.foregroundServiceTypes); observer.onForegroundServicesChanged(item.pid, item.uid, item.foregroundServiceTypes); } } } catch (RemoteException e) { } Loading @@ -3093,6 +3102,47 @@ public class ActivityManagerService extends IActivityManager.Stub } } @GuardedBy("this") ProcessChangeItem enqueueProcessChangeItemLocked(int uid, int pid) { int i = mPendingProcessChanges.size()-1; ActivityManagerService.ProcessChangeItem item = null; while (i >= 0) { item = mPendingProcessChanges.get(i); if (item.pid == pid) { if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG_PROCESS_OBSERVERS, "Re-using existing item: " + item); break; } i--; } if (i < 0) { // No existing item in pending changes; need a new one. final int NA = mAvailProcessChanges.size(); if (NA > 0) { item = mAvailProcessChanges.remove(NA-1); if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG_PROCESS_OBSERVERS, "Retrieving available item: " + item); } else { item = new ActivityManagerService.ProcessChangeItem(); if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG_PROCESS_OBSERVERS, "Allocating new item: " + item); } item.changes = 0; item.pid = pid; item.uid = uid; if (mPendingProcessChanges.size() == 0) { if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG_PROCESS_OBSERVERS, "*** Enqueueing dispatch processes changed!"); mUiHandler.obtainMessage(DISPATCH_PROCESSES_CHANGED_UI_MSG) .sendToTarget(); } mPendingProcessChanges.add(item); } return item; } private void dispatchProcessDied(int pid, int uid) { int i = mProcessObservers.beginBroadcast(); while (i > 0) { Loading Loading @@ -16275,11 +16325,12 @@ public class ActivityManagerService extends IActivityManager.Stub @GuardedBy("this") final void updateProcessForegroundLocked(ProcessRecord proc, boolean isForeground, int fgServiceTypes, boolean oomAdj) { proc.setHasForegroundServices(isForeground, fgServiceTypes); final boolean hasFgServiceLocationType = (fgServiceTypes & ServiceInfo.FOREGROUND_SERVICE_TYPE_LOCATION) != 0; if (isForeground != proc.hasForegroundServices() || proc.hasLocationForegroundServices() != hasFgServiceLocationType) { proc.setHasForegroundServices(isForeground, fgServiceTypes); ArrayList<ProcessRecord> curProcs = mForegroundPackages.get(proc.info.packageName, proc.info.uid); if (isForeground) { Loading Loading @@ -16308,6 +16359,13 @@ public class ActivityManagerService extends IActivityManager.Stub updateOomAdjLocked(); } } if (proc.getForegroundServiceTypes() != fgServiceTypes) { proc.setReportedForegroundServiceTypes(fgServiceTypes); ProcessChangeItem item = enqueueProcessChangeItemLocked(proc.info.uid, proc.pid); item.changes = ProcessChangeItem.CHANGE_FOREGROUND_SERVICES; item.foregroundServiceTypes = fgServiceTypes; } } // TODO(b/111541062): This method is only used for updating OOM adjustments. We need to update Loading Loading @@ -18101,6 +18159,34 @@ public class ActivityManagerService extends IActivityManager.Stub public void prepareForPossibleShutdown() { ActivityManagerService.this.prepareForPossibleShutdown(); } @Override public boolean hasRunningForegroundService(int uid, int foregroundServicetype) { synchronized (ActivityManagerService.this) { for (int i = 0; i < mProcessList.mLruProcesses.size(); i++) { final ProcessRecord pr = mProcessList.mLruProcesses.get(i); if (pr.uid != uid) { continue; } if ((pr.getForegroundServiceTypes() & foregroundServicetype) != 0) { return true; } } } return false; } @Override public void registerProcessObserver(IProcessObserver processObserver) { ActivityManagerService.this.registerProcessObserver(processObserver); } @Override public void unregisterProcessObserver(IProcessObserver processObserver) { ActivityManagerService.this.unregisterProcessObserver(processObserver); } } long inputDispatchingTimedOut(int pid, final boolean aboveSystem, String reason) {
services/core/java/com/android/server/am/OomAdjuster.java +3 −36 Original line number Diff line number Diff line Loading @@ -38,7 +38,6 @@ import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_PSS; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_UID_OBSERVERS; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_USAGE_STATS; import static com.android.server.am.ActivityManagerService.DISPATCH_OOM_ADJ_OBSERVER_MSG; import static com.android.server.am.ActivityManagerService.DISPATCH_PROCESSES_CHANGED_UI_MSG; import static com.android.server.am.ActivityManagerService.IDLE_UIDS_MSG; import static com.android.server.am.ActivityManagerService.TAG_BACKUP; import static com.android.server.am.ActivityManagerService.TAG_LRU; Loading Loading @@ -1921,41 +1920,9 @@ public final class OomAdjuster { if (changes != 0) { if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG_PROCESS_OBSERVERS, "Changes in " + app + ": " + changes); int i = mService.mPendingProcessChanges.size()-1; ActivityManagerService.ProcessChangeItem item = null; while (i >= 0) { item = mService.mPendingProcessChanges.get(i); if (item.pid == app.pid) { if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG_PROCESS_OBSERVERS, "Re-using existing item: " + item); break; } i--; } if (i < 0) { // No existing item in pending changes; need a new one. final int NA = mService.mAvailProcessChanges.size(); if (NA > 0) { item = mService.mAvailProcessChanges.remove(NA-1); if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG_PROCESS_OBSERVERS, "Retrieving available item: " + item); } else { item = new ActivityManagerService.ProcessChangeItem(); if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG_PROCESS_OBSERVERS, "Allocating new item: " + item); } item.changes = 0; item.pid = app.pid; item.uid = app.info.uid; if (mService.mPendingProcessChanges.size() == 0) { if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG_PROCESS_OBSERVERS, "*** Enqueueing dispatch processes changed!"); mService.mUiHandler.obtainMessage(DISPATCH_PROCESSES_CHANGED_UI_MSG) .sendToTarget(); } mService.mPendingProcessChanges.add(item); } item.changes |= changes; ActivityManagerService.ProcessChangeItem item = mService.enqueueProcessChangeItemLocked(app.pid, app.info.uid); item.changes = changes; item.foregroundActivities = app.repForegroundActivities; if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG_PROCESS_OBSERVERS, "Item " + Integer.toHexString(System.identityHashCode(item)) Loading
services/core/java/com/android/server/am/ProcessRecord.java +13 −0 Original line number Diff line number Diff line Loading @@ -174,6 +174,7 @@ class ProcessRecord implements WindowProcessListener { boolean hasStartedServices; // Are there any started services running in this process? private boolean mHasForegroundServices; // Running any services that are foreground? private int mFgServiceTypes; // Type of foreground service, if there is a foreground service. private int mRepFgServiceTypes; // Last reported foreground service types. private boolean mHasForegroundActivities; // Running any activities that are foreground? boolean repForegroundActivities; // Last reported foreground activities. boolean systemNoUi; // This is a system process, but not currently showing UI. Loading Loading @@ -1079,6 +1080,18 @@ class ProcessRecord implements WindowProcessListener { && (mFgServiceTypes & ServiceInfo.FOREGROUND_SERVICE_TYPE_LOCATION) != 0; } int getForegroundServiceTypes() { return mHasForegroundServices ? mFgServiceTypes : 0; } int getReportedForegroundServiceTypes() { return mRepFgServiceTypes; } void setReportedForegroundServiceTypes(int foregroundServiceTypes) { mRepFgServiceTypes = foregroundServiceTypes; } void setHasForegroundActivities(boolean hasForegroundActivities) { mHasForegroundActivities = hasForegroundActivities; mWindowProcessController.setHasForegroundActivities(hasForegroundActivities); Loading