Add annotation to the performance sensitive methods
So we can evaluate more easily later if something can be optimized.
Also:
- Make ActiveUids a separated lock to reduce locking WM.
- Use more lock-without-boost for the methods that are already
in another priority booster.
Bug: 122505787
Test: Boot device
Change-Id: I2e942b1f0b888e155f622ddbc850a481c0c88578
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 258819f..e742df5 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -26,7 +26,6 @@
import static android.Manifest.permission.START_TASKS_FROM_RECENTS;
import static android.Manifest.permission.STOP_APP_SWITCHES;
import static android.app.ActivityManager.LOCK_TASK_MODE_NONE;
-import static android.app.ActivityManager.PROCESS_STATE_NONEXISTENT;
import static android.app.ActivityManagerInternal.ALLOW_FULL_ONLY;
import static android.app.ActivityTaskManager.INVALID_TASK_ID;
import static android.app.ActivityTaskManager.RESIZE_MODE_PRESERVE_WINDOW;
@@ -272,6 +271,10 @@
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
import java.lang.ref.WeakReference;
import java.text.DateFormat;
import java.util.ArrayList;
@@ -363,7 +366,7 @@
private UserManagerService mUserManager;
private AppOpsService mAppOpsService;
/** All active uids in the system. */
- private final SparseArray<Integer> mActiveUids = new SparseArray<>();
+ private final MirrorActiveUids mActiveUids = new MirrorActiveUids();
private final SparseArray<String> mPendingTempWhitelist = new SparseArray<>();
/** All processes currently running that might have a window organized by name. */
final ProcessMap<WindowProcessController> mProcessNames = new ProcessMap<>();
@@ -647,6 +650,17 @@
}
}
+ /** Indicates that the method may be invoked frequently or is sensitive to performance. */
+ @Target(ElementType.METHOD)
+ @Retention(RetentionPolicy.SOURCE)
+ @interface HotPath {
+ int NONE = 0;
+ int OOM_ADJUSTMENT = 1;
+ int LRU_UPDATE = 2;
+ int PROCESS_CHANGE = 3;
+ int caller() default NONE;
+ }
+
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
public ActivityTaskManagerService(Context context) {
mContext = context;
@@ -5709,12 +5723,12 @@
return null;
}
- int getUidStateLocked(int uid) {
- return mActiveUids.get(uid, PROCESS_STATE_NONEXISTENT);
+ int getUidState(int uid) {
+ return mActiveUids.getUidState(uid);
}
boolean isUidForeground(int uid) {
- return (getUidStateLocked(uid) == ActivityManager.PROCESS_STATE_TOP)
+ return (getUidState(uid) == ActivityManager.PROCESS_STATE_TOP)
|| mWindowManager.mRoot.isAnyNonToastWindowVisibleForUid(uid);
}
@@ -6109,23 +6123,26 @@
}
}
+ @HotPath(caller = HotPath.PROCESS_CHANGE)
@Override
public void onProcessAdded(WindowProcessController proc) {
- synchronized (mGlobalLock) {
+ synchronized (mGlobalLockWithoutBoost) {
mProcessNames.put(proc.mName, proc.mUid, proc);
}
}
+ @HotPath(caller = HotPath.PROCESS_CHANGE)
@Override
public void onProcessRemoved(String name, int uid) {
- synchronized (mGlobalLock) {
+ synchronized (mGlobalLockWithoutBoost) {
mProcessNames.remove(name, uid);
}
}
+ @HotPath(caller = HotPath.PROCESS_CHANGE)
@Override
public void onCleanUpApplicationRecord(WindowProcessController proc) {
- synchronized (mGlobalLock) {
+ synchronized (mGlobalLockWithoutBoost) {
if (proc == mHomeProcess) {
mHomeProcess = null;
}
@@ -6135,23 +6152,26 @@
}
}
+ @HotPath(caller = HotPath.OOM_ADJUSTMENT)
@Override
public int getTopProcessState() {
- synchronized (mGlobalLock) {
+ synchronized (mGlobalLockWithoutBoost) {
return mTopProcessState;
}
}
+ @HotPath(caller = HotPath.OOM_ADJUSTMENT)
@Override
public boolean isHeavyWeightProcess(WindowProcessController proc) {
- synchronized (mGlobalLock) {
+ synchronized (mGlobalLockWithoutBoost) {
return proc == mHeavyWeightProcess;
}
}
+ @HotPath(caller = HotPath.PROCESS_CHANGE)
@Override
public void clearHeavyWeightProcessIfEquals(WindowProcessController proc) {
- synchronized (mGlobalLock) {
+ synchronized (mGlobalLockWithoutBoost) {
ActivityTaskManagerService.this.clearHeavyWeightProcessIfEquals(proc);
}
}
@@ -6167,9 +6187,10 @@
}
}
+ @HotPath(caller = HotPath.OOM_ADJUSTMENT)
@Override
public boolean isSleeping() {
- synchronized (mGlobalLock) {
+ synchronized (mGlobalLockWithoutBoost) {
return isSleepingLocked();
}
}
@@ -6413,9 +6434,10 @@
}
}
+ @HotPath(caller = HotPath.PROCESS_CHANGE)
@Override
public boolean isFactoryTestProcess(WindowProcessController wpc) {
- synchronized (mGlobalLock) {
+ synchronized (mGlobalLockWithoutBoost) {
if (mFactoryTest == FACTORY_TEST_OFF) {
return false;
}
@@ -6468,10 +6490,11 @@
}
}
+ @HotPath(caller = HotPath.PROCESS_CHANGE)
@Override
public void handleAppDied(WindowProcessController wpc, boolean restarting,
Runnable finishInstrumentationCallback) {
- synchronized (mGlobalLock) {
+ synchronized (mGlobalLockWithoutBoost) {
// Remove this application's activities from active lists.
boolean hasVisibleActivities = mRootActivityContainer.handleAppDied(wpc);
@@ -6570,16 +6593,18 @@
}
}
+ @HotPath(caller = HotPath.PROCESS_CHANGE)
@Override
public void preBindApplication(WindowProcessController wpc) {
- synchronized (mGlobalLock) {
+ synchronized (mGlobalLockWithoutBoost) {
mStackSupervisor.getActivityMetricsLogger().notifyBindApplication(wpc.mInfo);
}
}
+ @HotPath(caller = HotPath.PROCESS_CHANGE)
@Override
public boolean attachApplication(WindowProcessController wpc) throws RemoteException {
- synchronized (mGlobalLock) {
+ synchronized (mGlobalLockWithoutBoost) {
return mRootActivityContainer.attachApplication(wpc);
}
}
@@ -6907,6 +6932,7 @@
}
}
+ @HotPath(caller = HotPath.OOM_ADJUSTMENT)
@Override
public WindowProcessController getTopApp() {
synchronized (mGlobalLockWithoutBoost) {
@@ -6915,6 +6941,7 @@
}
}
+ @HotPath(caller = HotPath.OOM_ADJUSTMENT)
@Override
public void rankTaskLayersIfNeeded() {
synchronized (mGlobalLockWithoutBoost) {
@@ -6959,34 +6986,28 @@
}
}
+ @HotPath(caller = HotPath.OOM_ADJUSTMENT)
@Override
public void onUidActive(int uid, int procState) {
- synchronized (mGlobalLockWithoutBoost) {
- mActiveUids.put(uid, procState);
- }
+ mActiveUids.onUidActive(uid, procState);
}
+ @HotPath(caller = HotPath.OOM_ADJUSTMENT)
@Override
public void onUidInactive(int uid) {
- synchronized (mGlobalLockWithoutBoost) {
- mActiveUids.remove(uid);
- }
+ mActiveUids.onUidInactive(uid);
}
+ @HotPath(caller = HotPath.OOM_ADJUSTMENT)
@Override
public void onActiveUidsCleared() {
- synchronized (mGlobalLockWithoutBoost) {
- mActiveUids.clear();
- }
+ mActiveUids.onActiveUidsCleared();
}
+ @HotPath(caller = HotPath.OOM_ADJUSTMENT)
@Override
public void onUidProcStateChanged(int uid, int procState) {
- synchronized (mGlobalLockWithoutBoost) {
- if (mActiveUids.get(uid) != null) {
- mActiveUids.put(uid, procState);
- }
- }
+ mActiveUids.onUidProcStateChanged(uid, procState);
}
@Override