diff options
| -rw-r--r-- | services/core/java/com/android/server/pm/PackageInstallerSession.java | 13 | ||||
| -rw-r--r-- | services/core/java/com/android/server/pm/StagingManager.java | 56 |
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); |