Ensure to update top process state when launching activity
- Combine addPackage, clearWaitingToKill and updateProcessInfo
into onStartActivity that reduces the amount of messages and
acquiring lock.
- Invoke onStartActivity after setting activity state to ensure
oom adjustment uses the latest state (currently the order is
ensured by lock contention but it is too implicit).
- Make the message of onStartActivity always enqueue at front so
the process can gain the top state earlier.
Test: AppLaunchTest
Bug: 123043091
Change-Id: Id8d00273a5dc88526c3c158c49423c15fb99a0d5
diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java
index ce13cd8..99c236d 100644
--- a/services/core/java/com/android/server/am/ProcessRecord.java
+++ b/services/core/java/com/android/server/am/ProcessRecord.java
@@ -878,13 +878,6 @@
return null;
}
- @Override
- public void addPackage(String pkg, long versionCode) {
- synchronized (mService) {
- addPackage(pkg, versionCode, mService.mProcessStats);
- }
- }
-
/*
* Return true if package has been added false if not
*/
@@ -1302,15 +1295,13 @@
}
@Override
- public void updateProcessInfo(boolean updateServiceConnectionActivities, boolean updateLru,
- boolean activityChange, boolean updateOomAdj) {
+ public void updateProcessInfo(boolean updateServiceConnectionActivities, boolean activityChange,
+ boolean updateOomAdj) {
synchronized (mService) {
if (updateServiceConnectionActivities) {
mService.mServices.updateServiceConnectionActivitiesLocked(this);
}
- if (updateLru) {
- mService.mProcessList.updateLruProcessLocked(this, activityChange, null);
- }
+ mService.mProcessList.updateLruProcessLocked(this, activityChange, null /* client */);
if (updateOomAdj) {
mService.updateOomAdjLocked();
}
@@ -1332,19 +1323,20 @@
}
@Override
- public void clearWaitingToKill() {
+ public void onStartActivity(int topProcessState, boolean setProfileProc, String packageName,
+ long versionCode) {
synchronized (mService) {
waitingToKill = null;
- }
- }
-
- @Override
- public void onStartActivity(int topProcessState, boolean setProfileProc) {
- synchronized (mService) {
if (setProfileProc) {
mService.mProfileData.setProfileProc(this);
}
+ if (packageName != null) {
+ addPackage(packageName, versionCode, mService.mProcessStats);
+ }
+ // Update oom adj first, we don't want the additional states are involved in this round.
+ updateProcessInfo(false /* updateServiceConnectionActivities */,
+ true /* activityChange */, true /* updateOomAdj */);
hasShownUi = true;
setPendingUiClean(true);
forceProcessStateUpTo(topProcessState);