diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java index 1e0b2e358e175..85a3986a65f97 100644 --- a/core/java/android/content/pm/PackageInstaller.java +++ b/core/java/android/content/pm/PackageInstaller.java @@ -72,7 +72,6 @@ import java.util.List; import java.util.Objects; import java.util.Set; import java.util.concurrent.Executor; -import java.util.stream.Collectors; /** * Offers the ability to install, upgrade, and remove applications on the @@ -589,9 +588,15 @@ public class PackageInstaller { * * {@link SessionInfo#isStagedSessionActive()}. */ public @NonNull List getActiveStagedSessions() { - return getStagedSessions().stream() - .filter(s -> s.isStagedSessionActive()) - .collect(Collectors.toList()); + final List activeStagedSessions = new ArrayList<>(); + final List stagedSessions = getStagedSessions(); + for (int i = 0; i < stagedSessions.size(); i++) { + final SessionInfo sessionInfo = stagedSessions.get(i); + if (sessionInfo.isStagedSessionActive()) { + activeStagedSessions.add(sessionInfo); + } + } + return activeStagedSessions; } /** diff --git a/services/core/java/com/android/server/pm/ApexManager.java b/services/core/java/com/android/server/pm/ApexManager.java index c97f33b5103f1..142e813f66b96 100644 --- a/services/core/java/com/android/server/pm/ApexManager.java +++ b/services/core/java/com/android/server/pm/ApexManager.java @@ -61,11 +61,9 @@ import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.List; -import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.concurrent.ExecutorService; -import java.util.stream.Collectors; /** * ApexManager class handles communications with the apex service to perform operation and queries, @@ -538,30 +536,42 @@ public abstract class ApexManager { List getActivePackages() { Preconditions.checkState(mAllPackagesCache != null, "APEX packages have not been scanned"); - return mAllPackagesCache - .stream() - .filter(item -> isActive(item)) - .collect(Collectors.toList()); + final List activePackages = new ArrayList<>(); + for (int i = 0; i < mAllPackagesCache.size(); i++) { + final PackageInfo packageInfo = mAllPackagesCache.get(i); + if (isActive(packageInfo)) { + activePackages.add(packageInfo); + } + } + return activePackages; } @Override List getFactoryPackages() { Preconditions.checkState(mAllPackagesCache != null, "APEX packages have not been scanned"); - return mAllPackagesCache - .stream() - .filter(item -> isFactory(item)) - .collect(Collectors.toList()); + final List factoryPackages = new ArrayList<>(); + for (int i = 0; i < mAllPackagesCache.size(); i++) { + final PackageInfo packageInfo = mAllPackagesCache.get(i); + if (isFactory(packageInfo)) { + factoryPackages.add(packageInfo); + } + } + return factoryPackages; } @Override List getInactivePackages() { Preconditions.checkState(mAllPackagesCache != null, "APEX packages have not been scanned"); - return mAllPackagesCache - .stream() - .filter(item -> !isActive(item)) - .collect(Collectors.toList()); + final List inactivePackages = new ArrayList<>(); + for (int i = 0; i < mAllPackagesCache.size(); i++) { + final PackageInfo packageInfo = mAllPackagesCache.get(i); + if (!isActive(packageInfo)) { + inactivePackages.add(packageInfo); + } + } + return inactivePackages; } @Override diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 34363c8df8f6c..77a60242a6a62 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -415,7 +415,6 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.function.Predicate; -import java.util.stream.Collectors; /** * Keep track of all those APKs everywhere. @@ -2655,6 +2654,11 @@ public class PackageManagerService extends IPackageManager.Stub + partition.folder); } } + + @Override + public String toString() { + return folder.getAbsolutePath() + ":" + scanFlag; + } } public PackageManagerService(Injector injector, boolean onlyCore, boolean factoryTest) { @@ -2757,15 +2761,19 @@ public class PackageManagerService extends IPackageManager.Stub mApexManager = ApexManager.getInstance(); mAppsFilter = mInjector.getAppsFilter(); + final List scanPartitions = new ArrayList<>(); + final List activeApexInfos = mApexManager.getActiveApexInfos(); + for (int i = 0; i < activeApexInfos.size(); i++) { + final ScanPartition scanPartition = resolveApexToScanPartition(activeApexInfos.get(i)); + if (scanPartition != null) { + scanPartitions.add(scanPartition); + } + } + mDirsToScanAsSystem = new ArrayList<>(); mDirsToScanAsSystem.addAll(SYSTEM_PARTITIONS); - mDirsToScanAsSystem.addAll(mApexManager.getActiveApexInfos().stream() - .map(PackageManagerService::resolveApexToScanPartition) - .filter(Objects::nonNull).collect(Collectors.toList())); - Slog.d(TAG, - "Directories scanned as system partitions: [" + mDirsToScanAsSystem.stream().map( - d -> (d.folder.getAbsolutePath() + ":" + d.scanFlag)) - .collect(Collectors.joining(",")) + "]"); + mDirsToScanAsSystem.addAll(scanPartitions); + Slog.d(TAG, "Directories scanned as system partitions: " + mDirsToScanAsSystem); // CHECKSTYLE:OFF IndentationCheck synchronized (mInstallLock) { diff --git a/services/core/java/com/android/server/pm/StagingManager.java b/services/core/java/com/android/server/pm/StagingManager.java index 342c90719916e..60292b45c0eeb 100644 --- a/services/core/java/com/android/server/pm/StagingManager.java +++ b/services/core/java/com/android/server/pm/StagingManager.java @@ -75,13 +75,11 @@ import com.android.server.rollback.WatchdogRollbackLogger; import java.io.File; import java.io.IOException; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; import java.util.function.Consumer; import java.util.function.Predicate; -import java.util.stream.Collectors; /** * This class handles staged install sessions, i.e. install sessions that require packages to @@ -222,6 +220,7 @@ public class StagingManager { // which will be propagated to populate stagedSessionErrorMessage of this session. final ApexInfoList apexInfoList = mApexManager.submitStagedSession(apexSessionParams); final List result = new ArrayList<>(); + final List apexPackageNames = new ArrayList<>(); for (ApexInfo apexInfo : apexInfoList.apexInfos) { final PackageInfo packageInfo; int flags = PackageManager.GET_META_DATA; @@ -245,9 +244,10 @@ public class StagingManager { checkRequiredVersionCode(session, activePackage); checkDowngrade(session, activePackage, packageInfo); result.add(packageInfo); + apexPackageNames.add(packageInfo.packageName); } - Slog.d(TAG, "Session " + session.sessionId + " has following APEX packages: [" - + result.stream().map(p -> p.packageName).collect(Collectors.joining(",")) + "]"); + Slog.d(TAG, "Session " + session.sessionId + " has following APEX packages: " + + apexPackageNames); return result; } @@ -313,13 +313,16 @@ public class StagingManager { return filter.test(session); } synchronized (mStagedSessions) { - return !(Arrays.stream(session.getChildSessionIds()) - // Retrieve cached sessions matching ids. - .mapToObj(i -> mStagedSessions.get(i)) - // Filter only the ones containing APEX. - .filter(childSession -> filter.test(childSession)) - .collect(Collectors.toList()) - .isEmpty()); + 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; + } + } + return false; } } @@ -669,15 +672,15 @@ public class StagingManager { // contain an APK, and with those then create a new multi-package group of sessions, // carrying over all the session parameters and unmarking them as staged. On commit the // sessions will be installed atomically. - final List childSessions; + final List childSessions = new ArrayList<>(); synchronized (mStagedSessions) { - childSessions = - Arrays.stream(session.getChildSessionIds()) - // Retrieve cached sessions matching ids. - .mapToObj(i -> mStagedSessions.get(i)) - // Filter only the ones containing APKs. - .filter(childSession -> !isApexSession(childSession)) - .collect(Collectors.toList()); + final int[] childSessionIds = session.getChildSessionIds(); + for (int id : childSessionIds) { + final PackageInstallerSession s = mStagedSessions.get(id); + if (!isApexSession(s)) { + childSessions.add(s); + } + } } if (childSessions.isEmpty()) { // APEX-only multi-package staged session, nothing to do.