summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/am/AppStartInfoTracker.java65
1 files changed, 47 insertions, 18 deletions
diff --git a/services/core/java/com/android/server/am/AppStartInfoTracker.java b/services/core/java/com/android/server/am/AppStartInfoTracker.java
index 1dc384d61c91..fe6e7be34750 100644
--- a/services/core/java/com/android/server/am/AppStartInfoTracker.java
+++ b/services/core/java/com/android/server/am/AppStartInfoTracker.java
@@ -210,11 +210,17 @@ public final class AppStartInfoTracker {
if (!mEnabled) {
return;
}
- if (!mInProgRecords.containsKey(id)) {
+ int index = mInProgRecords.indexOfKey(id);
+ if (index < 0) {
return;
}
- mInProgRecords.get(id).setStartupState(ApplicationStartInfo.STARTUP_STATE_ERROR);
- mInProgRecords.remove(id);
+ ApplicationStartInfo info = mInProgRecords.valueAt(index);
+ if (info == null) {
+ mInProgRecords.removeAt(index);
+ return;
+ }
+ info.setStartupState(ApplicationStartInfo.STARTUP_STATE_ERROR);
+ mInProgRecords.removeAt(index);
}
}
@@ -223,16 +229,24 @@ public final class AppStartInfoTracker {
if (!mEnabled) {
return;
}
- if (!mInProgRecords.containsKey(id)) {
+ int index = mInProgRecords.indexOfKey(id);
+ if (index < 0) {
return;
}
- if (app != null) {
- ApplicationStartInfo info = mInProgRecords.get(id);
- info.setStartType((int) temperature);
- addBaseFieldsFromProcessRecord(info, app);
- mInProgRecords.put(id, addStartInfoLocked(info));
+ ApplicationStartInfo info = mInProgRecords.valueAt(index);
+ if (info == null || app == null) {
+ mInProgRecords.removeAt(index);
+ return;
+ }
+ info.setStartType((int) temperature);
+ addBaseFieldsFromProcessRecord(info, app);
+ ApplicationStartInfo newInfo = addStartInfoLocked(info);
+ if (newInfo == null) {
+ // newInfo can be null if records are added before load from storage is
+ // complete. In this case the newly added record will be lost.
+ mInProgRecords.removeAt(index);
} else {
- mInProgRecords.remove(id);
+ mInProgRecords.setValueAt(index, newInfo);
}
}
}
@@ -242,12 +256,17 @@ public final class AppStartInfoTracker {
if (!mEnabled) {
return;
}
- if (!mInProgRecords.containsKey(id)) {
+ int index = mInProgRecords.indexOfKey(id);
+ if (index < 0) {
+ return;
+ }
+ ApplicationStartInfo info = mInProgRecords.valueAt(index);
+ if (info == null) {
+ mInProgRecords.removeAt(index);
return;
}
- ApplicationStartInfo info = mInProgRecords.get(id);
info.setStartupState(ApplicationStartInfo.STARTUP_STATE_ERROR);
- mInProgRecords.remove(id);
+ mInProgRecords.removeAt(index);
}
}
@@ -257,10 +276,15 @@ public final class AppStartInfoTracker {
if (!mEnabled) {
return;
}
- if (!mInProgRecords.containsKey(id)) {
+ int index = mInProgRecords.indexOfKey(id);
+ if (index < 0) {
+ return;
+ }
+ ApplicationStartInfo info = mInProgRecords.valueAt(index);
+ if (info == null) {
+ mInProgRecords.removeAt(index);
return;
}
- ApplicationStartInfo info = mInProgRecords.get(id);
info.setStartupState(ApplicationStartInfo.STARTUP_STATE_FIRST_FRAME_DRAWN);
info.setLaunchMode(launchMode);
checkCompletenessAndCallback(info);
@@ -272,13 +296,18 @@ public final class AppStartInfoTracker {
if (!mEnabled) {
return;
}
- if (!mInProgRecords.containsKey(id)) {
+ int index = mInProgRecords.indexOfKey(id);
+ if (index < 0) {
+ return;
+ }
+ ApplicationStartInfo info = mInProgRecords.valueAt(index);
+ if (info == null) {
+ mInProgRecords.removeAt(index);
return;
}
- ApplicationStartInfo info = mInProgRecords.get(id);
info.addStartupTimestamp(ApplicationStartInfo.START_TIMESTAMP_FULLY_DRAWN,
timestampNanos);
- mInProgRecords.remove(id);
+ mInProgRecords.removeAt(index);
}
}