Loading services/core/java/com/android/server/pm/PackageInstallerSession.java +31 −6 Original line number Diff line number Diff line Loading @@ -169,6 +169,7 @@ import java.util.Objects; import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Predicate; public class PackageInstallerSession extends IPackageInstallerSession.Stub { private static final String TAG = "PackageInstallerSession"; Loading Loading @@ -689,7 +690,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { stagedSessionErrorMessage != null ? stagedSessionErrorMessage : ""; if (isDataLoaderInstallation()) { if (isApexInstallation()) { if (isApexSession()) { throw new IllegalArgumentException( "DataLoader installation of APEX modules is not allowed."); } Loading Loading @@ -1576,7 +1577,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { return false; } if (isApexInstallation()) { if (isApexSession()) { validateApexInstallLocked(); } else { validateApkInstallLocked(); Loading Loading @@ -1733,7 +1734,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { try { sealLocked(); if (isApexInstallation()) { if (isApexSession()) { // APEX installations rely on certain fields to be populated after reboot. // E.g. mPackageName. validateApexInstallLocked(); Loading Loading @@ -1809,7 +1810,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { return; } if (isApexInstallation()) { if (isApexSession()) { destroyInternal(); dispatchSessionFinished(PackageManager.INSTALL_FAILED_INTERNAL_ERROR, "APEX packages can only be installed using staged sessions.", null); Loading Loading @@ -1986,7 +1987,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { // TODO(b/136257624): Some logic in this if block probably belongs in // makeInstallParams(). if (!params.isMultiPackage && !isApexInstallation()) { if (!params.isMultiPackage && !isApexSession()) { Objects.requireNonNull(mPackageName); Objects.requireNonNull(mSigningDetails); Objects.requireNonNull(mResolvedBaseFile); Loading Loading @@ -2215,10 +2216,34 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { /** * Returns true if the session is installing an APEX package. */ private boolean isApexInstallation() { boolean isApexSession() { return (params.installFlags & PackageManager.INSTALL_APEX) != 0; } private boolean sessionContains(Predicate<PackageInstallerSession> filter) { if (!isMultiPackage()) { return filter.test(this); } final List<PackageInstallerSession> childSessions; synchronized (mLock) { childSessions = getChildSessionsLocked(); } for (PackageInstallerSession child: childSessions) { if (filter.test(child)) { return true; } } return false; } boolean containsApexSession() { return sessionContains((s) -> s.isApexSession()); } boolean containsApkSession() { return sessionContains((s) -> !s.isApexSession()); } /** * Validate apex install. * <p> Loading services/core/java/com/android/server/pm/StagingManager.java +10 −36 Original line number Diff line number Diff line Loading @@ -86,7 +86,6 @@ import java.util.List; import java.util.Set; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; import java.util.function.Predicate; import java.util.function.Supplier; /** Loading Loading @@ -226,7 +225,7 @@ public class StagingManager { final IntArray childSessionIds = new IntArray(); if (session.isMultiPackage()) { for (PackageInstallerSession s : session.getChildSessions()) { if (isApexSession(s)) { if (s.isApexSession()) { childSessionIds.add(s.sessionId); } } Loading Loading @@ -329,31 +328,6 @@ public class StagingManager { } } private static boolean isApexSession(@NonNull PackageInstallerSession session) { return (session.params.installFlags & PackageManager.INSTALL_APEX) != 0; } private boolean sessionContains(@NonNull PackageInstallerSession session, Predicate<PackageInstallerSession> filter) { if (!session.isMultiPackage()) { return filter.test(session); } for (PackageInstallerSession s : session.getChildSessions()) { if (filter.test(s)) { return true; } } return false; } private boolean sessionContainsApex(@NonNull PackageInstallerSession session) { return sessionContains(session, (s) -> isApexSession(s)); } private boolean sessionContainsApk(@NonNull PackageInstallerSession session) { return sessionContains(session, (s) -> !isApexSession(s)); } // Reverts apex sessions and user data (if checkpoint is supported). Also reboots the device. private void abortCheckpoint(int sessionId, String errorMsg) { String failureReason = "Failed to install sessionId: " + sessionId + " Error: " + errorMsg; Loading Loading @@ -400,7 +374,7 @@ public class StagingManager { List<PackageInstallerSession> apexSessions = new ArrayList<>(); if (session.isMultiPackage()) { for (PackageInstallerSession s : session.getChildSessions()) { if (sessionContainsApex(s)) { if (s.containsApexSession()) { apexSessions.add(s); } } Loading Loading @@ -521,7 +495,7 @@ public class StagingManager { private void resumeSession(@NonNull PackageInstallerSession session) { Slog.d(TAG, "Resuming session " + session.sessionId); final boolean hasApex = sessionContainsApex(session); final boolean hasApex = session.containsApexSession(); ApexSessionInfo apexSessionInfo = null; if (hasApex) { // Check with apexservice whether the apex packages have been activated. Loading Loading @@ -740,7 +714,7 @@ public class StagingManager { @Nullable private PackageInstallerSession extractApksInSession(PackageInstallerSession session) throws PackageManagerException { if (!session.isMultiPackage() && !isApexSession(session)) { if (!session.isMultiPackage() && !session.isApexSession()) { return createAndWriteApkSession(session); } else if (session.isMultiPackage()) { // For multi-package staged sessions containing APKs, we identify which child sessions Loading @@ -749,7 +723,7 @@ public class StagingManager { // sessions will be installed atomically. final List<PackageInstallerSession> childSessions = new ArrayList<>(); for (PackageInstallerSession s : session.getChildSessions()) { if (!isApexSession(s)) { if (!s.isApexSession()) { childSessions.add(s); } } Loading Loading @@ -798,7 +772,7 @@ public class StagingManager { } final Set<String> apkNames = new ArraySet<>(); for (PackageInstallerSession s : session.getChildSessions()) { if (!isApexSession(s)) { if (!s.isApexSession()) { apkNames.add(s.getPackageName()); } } Loading Loading @@ -1020,7 +994,7 @@ public class StagingManager { * @return returns true if it is ensured that there is no active apex session, otherwise false */ private boolean ensureActiveApexSessionIsAborted(PackageInstallerSession session) { if (!sessionContainsApex(session)) { if (!session.containsApexSession()) { return true; } final ApexSessionInfo apexSession = mApexManager.getStagedSessionInfo(session.sessionId); Loading Loading @@ -1342,7 +1316,7 @@ public class StagingManager { */ private void handlePreRebootVerification_Apex( @NonNull PackageInstallerSession session, int rollbackId) { final boolean hasApex = sessionContainsApex(session); final boolean hasApex = session.containsApexSession(); // APEX checks. For single-package sessions, check if they contain an APEX. For // multi-package sessions, find all the child sessions that contain an APEX. Loading Loading @@ -1372,7 +1346,7 @@ public class StagingManager { * {@link #notifyPreRebootVerification_Apk_Complete} */ private void handlePreRebootVerification_Apk(@NonNull PackageInstallerSession session) { if (!sessionContainsApk(session)) { if (!session.containsApkSession()) { notifyPreRebootVerification_Apk_Complete(session); return; } Loading Loading @@ -1421,7 +1395,7 @@ public class StagingManager { Slog.d(TAG, "Marking session " + session.sessionId + " as ready"); session.setStagedSessionReady(); if (session.isStagedSessionReady()) { final boolean hasApex = sessionContainsApex(session); final boolean hasApex = session.containsApexSession(); if (hasApex) { try { mApexManager.markStagedSessionReady(session.sessionId); Loading Loading
services/core/java/com/android/server/pm/PackageInstallerSession.java +31 −6 Original line number Diff line number Diff line Loading @@ -169,6 +169,7 @@ import java.util.Objects; import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Predicate; public class PackageInstallerSession extends IPackageInstallerSession.Stub { private static final String TAG = "PackageInstallerSession"; Loading Loading @@ -689,7 +690,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { stagedSessionErrorMessage != null ? stagedSessionErrorMessage : ""; if (isDataLoaderInstallation()) { if (isApexInstallation()) { if (isApexSession()) { throw new IllegalArgumentException( "DataLoader installation of APEX modules is not allowed."); } Loading Loading @@ -1576,7 +1577,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { return false; } if (isApexInstallation()) { if (isApexSession()) { validateApexInstallLocked(); } else { validateApkInstallLocked(); Loading Loading @@ -1733,7 +1734,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { try { sealLocked(); if (isApexInstallation()) { if (isApexSession()) { // APEX installations rely on certain fields to be populated after reboot. // E.g. mPackageName. validateApexInstallLocked(); Loading Loading @@ -1809,7 +1810,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { return; } if (isApexInstallation()) { if (isApexSession()) { destroyInternal(); dispatchSessionFinished(PackageManager.INSTALL_FAILED_INTERNAL_ERROR, "APEX packages can only be installed using staged sessions.", null); Loading Loading @@ -1986,7 +1987,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { // TODO(b/136257624): Some logic in this if block probably belongs in // makeInstallParams(). if (!params.isMultiPackage && !isApexInstallation()) { if (!params.isMultiPackage && !isApexSession()) { Objects.requireNonNull(mPackageName); Objects.requireNonNull(mSigningDetails); Objects.requireNonNull(mResolvedBaseFile); Loading Loading @@ -2215,10 +2216,34 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { /** * Returns true if the session is installing an APEX package. */ private boolean isApexInstallation() { boolean isApexSession() { return (params.installFlags & PackageManager.INSTALL_APEX) != 0; } private boolean sessionContains(Predicate<PackageInstallerSession> filter) { if (!isMultiPackage()) { return filter.test(this); } final List<PackageInstallerSession> childSessions; synchronized (mLock) { childSessions = getChildSessionsLocked(); } for (PackageInstallerSession child: childSessions) { if (filter.test(child)) { return true; } } return false; } boolean containsApexSession() { return sessionContains((s) -> s.isApexSession()); } boolean containsApkSession() { return sessionContains((s) -> !s.isApexSession()); } /** * Validate apex install. * <p> Loading
services/core/java/com/android/server/pm/StagingManager.java +10 −36 Original line number Diff line number Diff line Loading @@ -86,7 +86,6 @@ import java.util.List; import java.util.Set; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; import java.util.function.Predicate; import java.util.function.Supplier; /** Loading Loading @@ -226,7 +225,7 @@ public class StagingManager { final IntArray childSessionIds = new IntArray(); if (session.isMultiPackage()) { for (PackageInstallerSession s : session.getChildSessions()) { if (isApexSession(s)) { if (s.isApexSession()) { childSessionIds.add(s.sessionId); } } Loading Loading @@ -329,31 +328,6 @@ public class StagingManager { } } private static boolean isApexSession(@NonNull PackageInstallerSession session) { return (session.params.installFlags & PackageManager.INSTALL_APEX) != 0; } private boolean sessionContains(@NonNull PackageInstallerSession session, Predicate<PackageInstallerSession> filter) { if (!session.isMultiPackage()) { return filter.test(session); } for (PackageInstallerSession s : session.getChildSessions()) { if (filter.test(s)) { return true; } } return false; } private boolean sessionContainsApex(@NonNull PackageInstallerSession session) { return sessionContains(session, (s) -> isApexSession(s)); } private boolean sessionContainsApk(@NonNull PackageInstallerSession session) { return sessionContains(session, (s) -> !isApexSession(s)); } // Reverts apex sessions and user data (if checkpoint is supported). Also reboots the device. private void abortCheckpoint(int sessionId, String errorMsg) { String failureReason = "Failed to install sessionId: " + sessionId + " Error: " + errorMsg; Loading Loading @@ -400,7 +374,7 @@ public class StagingManager { List<PackageInstallerSession> apexSessions = new ArrayList<>(); if (session.isMultiPackage()) { for (PackageInstallerSession s : session.getChildSessions()) { if (sessionContainsApex(s)) { if (s.containsApexSession()) { apexSessions.add(s); } } Loading Loading @@ -521,7 +495,7 @@ public class StagingManager { private void resumeSession(@NonNull PackageInstallerSession session) { Slog.d(TAG, "Resuming session " + session.sessionId); final boolean hasApex = sessionContainsApex(session); final boolean hasApex = session.containsApexSession(); ApexSessionInfo apexSessionInfo = null; if (hasApex) { // Check with apexservice whether the apex packages have been activated. Loading Loading @@ -740,7 +714,7 @@ public class StagingManager { @Nullable private PackageInstallerSession extractApksInSession(PackageInstallerSession session) throws PackageManagerException { if (!session.isMultiPackage() && !isApexSession(session)) { if (!session.isMultiPackage() && !session.isApexSession()) { return createAndWriteApkSession(session); } else if (session.isMultiPackage()) { // For multi-package staged sessions containing APKs, we identify which child sessions Loading @@ -749,7 +723,7 @@ public class StagingManager { // sessions will be installed atomically. final List<PackageInstallerSession> childSessions = new ArrayList<>(); for (PackageInstallerSession s : session.getChildSessions()) { if (!isApexSession(s)) { if (!s.isApexSession()) { childSessions.add(s); } } Loading Loading @@ -798,7 +772,7 @@ public class StagingManager { } final Set<String> apkNames = new ArraySet<>(); for (PackageInstallerSession s : session.getChildSessions()) { if (!isApexSession(s)) { if (!s.isApexSession()) { apkNames.add(s.getPackageName()); } } Loading Loading @@ -1020,7 +994,7 @@ public class StagingManager { * @return returns true if it is ensured that there is no active apex session, otherwise false */ private boolean ensureActiveApexSessionIsAborted(PackageInstallerSession session) { if (!sessionContainsApex(session)) { if (!session.containsApexSession()) { return true; } final ApexSessionInfo apexSession = mApexManager.getStagedSessionInfo(session.sessionId); Loading Loading @@ -1342,7 +1316,7 @@ public class StagingManager { */ private void handlePreRebootVerification_Apex( @NonNull PackageInstallerSession session, int rollbackId) { final boolean hasApex = sessionContainsApex(session); final boolean hasApex = session.containsApexSession(); // APEX checks. For single-package sessions, check if they contain an APEX. For // multi-package sessions, find all the child sessions that contain an APEX. Loading Loading @@ -1372,7 +1346,7 @@ public class StagingManager { * {@link #notifyPreRebootVerification_Apk_Complete} */ private void handlePreRebootVerification_Apk(@NonNull PackageInstallerSession session) { if (!sessionContainsApk(session)) { if (!session.containsApkSession()) { notifyPreRebootVerification_Apk_Complete(session); return; } Loading Loading @@ -1421,7 +1395,7 @@ public class StagingManager { Slog.d(TAG, "Marking session " + session.sessionId + " as ready"); session.setStagedSessionReady(); if (session.isStagedSessionReady()) { final boolean hasApex = sessionContainsApex(session); final boolean hasApex = session.containsApexSession(); if (hasApex) { try { mApexManager.markStagedSessionReady(session.sessionId); Loading