summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/pm/PackageInstallerSession.java13
-rw-r--r--services/core/java/com/android/server/pm/StagingManager.java56
2 files changed, 26 insertions, 43 deletions
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index 515b90913870..73a9e2cb52cd 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -155,6 +155,7 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Set;
@@ -1522,8 +1523,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
}
@GuardedBy("mLock")
- private @Nullable List<PackageInstallerSession> getChildSessionsLocked() {
- List<PackageInstallerSession> childSessions = null;
+ private @NonNull List<PackageInstallerSession> getChildSessionsLocked() {
+ List<PackageInstallerSession> childSessions = Collections.EMPTY_LIST;
if (isMultiPackage()) {
int size = mChildSessions.size();
childSessions = new ArrayList<>(size);
@@ -1534,6 +1535,12 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
return childSessions;
}
+ @NonNull List<PackageInstallerSession> getChildSessions() {
+ synchronized (mLock) {
+ return getChildSessionsLocked();
+ }
+ }
+
/**
* Seal the session to prevent further modification.
*
@@ -3484,7 +3491,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
}
private void cleanStageDir(List<PackageInstallerSession> childSessions) {
- if (childSessions != null) {
+ if (isMultiPackage()) {
for (PackageInstallerSession childSession : childSessions) {
childSession.cleanStageDir();
}
diff --git a/services/core/java/com/android/server/pm/StagingManager.java b/services/core/java/com/android/server/pm/StagingManager.java
index 462b21535371..7ab880de15d1 100644
--- a/services/core/java/com/android/server/pm/StagingManager.java
+++ b/services/core/java/com/android/server/pm/StagingManager.java
@@ -240,9 +240,9 @@ public class StagingManager {
@NonNull PackageInstallerSession session) throws PackageManagerException {
final IntArray childSessionIds = new IntArray();
if (session.isMultiPackage()) {
- for (int id : session.getChildSessionIds()) {
- if (isApexSession(getStagedSession(id))) {
- childSessionIds.add(id);
+ for (PackageInstallerSession s : session.getChildSessions()) {
+ if (isApexSession(s)) {
+ childSessionIds.add(s.sessionId);
}
}
}
@@ -356,18 +356,12 @@ public class StagingManager {
if (!session.isMultiPackage()) {
return filter.test(session);
}
- synchronized (mStagedSessions) {
- final int[] childSessionIds = session.getChildSessionIds();
- for (int id : childSessionIds) {
- // Retrieve cached sessions matching ids.
- final PackageInstallerSession s = mStagedSessions.get(id);
- // Filter only the ones containing APEX.
- if (filter.test(s)) {
- return true;
- }
+ for (PackageInstallerSession s : session.getChildSessions()) {
+ if (filter.test(s)) {
+ return true;
}
- return false;
}
+ return false;
}
private boolean sessionContainsApex(@NonNull PackageInstallerSession session) {
@@ -423,19 +417,9 @@ public class StagingManager {
private List<PackageInstallerSession> extractApexSessions(PackageInstallerSession session) {
List<PackageInstallerSession> apexSessions = new ArrayList<>();
if (session.isMultiPackage()) {
- List<PackageInstallerSession> childrenSessions = new ArrayList<>();
- synchronized (mStagedSessions) {
- for (int childSessionId : session.getChildSessionIds()) {
- PackageInstallerSession childSession = mStagedSessions.get(childSessionId);
- if (childSession != null) {
- childrenSessions.add(childSession);
- }
- }
- }
- for (int i = 0, size = childrenSessions.size(); i < size; i++) {
- final PackageInstallerSession childSession = childrenSessions.get(i);
- if (sessionContainsApex(childSession)) {
- apexSessions.add(childSession);
+ for (PackageInstallerSession s : session.getChildSessions()) {
+ if (sessionContainsApex(s)) {
+ apexSessions.add(s);
}
}
} else {
@@ -782,13 +766,9 @@ public class StagingManager {
// carrying over all the session parameters and unmarking them as staged. On commit the
// sessions will be installed atomically.
final List<PackageInstallerSession> childSessions = new ArrayList<>();
- synchronized (mStagedSessions) {
- final int[] childSessionIds = session.getChildSessionIds();
- for (int id : childSessionIds) {
- final PackageInstallerSession s = mStagedSessions.get(id);
- if (!isApexSession(s)) {
- childSessions.add(s);
- }
+ for (PackageInstallerSession s : session.getChildSessions()) {
+ if (!isApexSession(s)) {
+ childSessions.add(s);
}
}
if (childSessions.isEmpty()) {
@@ -834,14 +814,10 @@ public class StagingManager {
if (!session.isMultiPackage()) {
return;
}
- final int[] childSessionIds = session.getChildSessionIds();
final Set<String> apkNames = new ArraySet<>();
- synchronized (mStagedSessions) {
- for (int id : childSessionIds) {
- final PackageInstallerSession s = mStagedSessions.get(id);
- if (!isApexSession(s)) {
- apkNames.add(s.getPackageName());
- }
+ for (PackageInstallerSession s : session.getChildSessions()) {
+ if (!isApexSession(s)) {
+ apkNames.add(s.getPackageName());
}
}
final List<PackageInstallerSession> apexSessions = extractApexSessions(session);