diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index ceee0facf6c56..0f5f293caaaae 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -128,6 +128,7 @@ import android.text.TextUtils; import android.util.ArrayMap; import android.util.ArraySet; import android.util.ExceptionUtils; +import android.util.IntArray; import android.util.MathUtils; import android.util.Slog; import android.util.SparseArray; @@ -280,6 +281,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { private final PackageInstallerService.InternalCallback mCallback; private final Context mContext; private final PackageManagerService mPm; + private final Installer mInstaller; private final Handler mHandler; private final PackageSessionProvider mSessionProvider; private final SilentUpdatePolicy mSilentUpdatePolicy; @@ -587,7 +589,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { @Override public void installSession(IntentSender statusReceiver) { assertCallerIsOwnerOrRootOrSystem(); - assertNotChildLocked("StagedSession#installSession"); + assertNotChild("StagedSession#installSession"); Preconditions.checkArgument(isCommitted() && isSessionReady()); // Since staged sessions are installed during boot, the original reference to status @@ -599,12 +601,12 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { private void updateRemoteStatusReceiver(IntentSender remoteStatusReceiver) { synchronized (mLock) { - mRemoteStatusReceiver = remoteStatusReceiver; + setRemoteStatusReceiver(remoteStatusReceiver); if (isMultiPackage()) { final IntentSender childIntentSender = new ChildStatusIntentReceiver( mChildSessions.clone(), remoteStatusReceiver).getIntentSender(); for (int i = mChildSessions.size() - 1; i >= 0; --i) { - mChildSessions.valueAt(i).mRemoteStatusReceiver = childIntentSender; + mChildSessions.valueAt(i).setRemoteStatusReceiver(childIntentSender); } } } @@ -684,7 +686,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { public void abandon() { final Runnable r; synchronized (mLock) { - assertNotChildLocked("StagedSession#abandon"); + assertNotChild("StagedSession#abandon"); assertCallerIsOwnerOrRoot(); if (isInTerminalState()) { // We keep the session in the database if it's in a finalized state. It will be @@ -754,7 +756,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { public void verifySession() { assertCallerIsOwnerOrRootOrSystem(); Preconditions.checkArgument(isCommitted()); - Preconditions.checkArgument(!mSessionApplied && !mSessionFailed); + Preconditions.checkArgument(!isInTerminalState()); notifyStartPreRebootVerification(); verify(); } @@ -918,8 +920,10 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } DevicePolicyManagerInternal dpmi = LocalServices.getService(DevicePolicyManagerInternal.class); + // It may wait for a long time to finish {@code dpmi.canSilentlyInstallPackage}. + // Please don't acquire mLock before calling {@code dpmi.canSilentlyInstallPackage}. return dpmi != null && dpmi.canSilentlyInstallPackage( - mInstallSource.installerPackageName, mInstallerUid); + getInstallSource().installerPackageName, mInstallerUid); } private static final int USER_ACTION_NOT_NEEDED = 0; @@ -1008,8 +1012,10 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { return USER_ACTION_REQUIRED; } + @SuppressWarnings("GuardedBy" /*mPm.mInstaller is {@code final} field*/) public PackageInstallerSession(PackageInstallerService.InternalCallback callback, - Context context, PackageManagerService pm, PackageSessionProvider sessionProvider, + Context context, PackageManagerService pm, + PackageSessionProvider sessionProvider, SilentUpdatePolicy silentUpdatePolicy, Looper looper, StagingManager stagingManager, int sessionId, int userId, int installerUid, @NonNull InstallSource installSource, SessionParams params, long createdMillis, long committedMillis, @@ -1022,6 +1028,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { mCallback = callback; mContext = context; mPm = pm; + mInstaller = (mPm != null) ? mPm.mInstaller : null; mSessionProvider = sessionProvider; mSilentUpdatePolicy = silentUpdatePolicy; mHandler = new Handler(looper, mHandlerCallback); @@ -1131,6 +1138,10 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { private SessionInfo generateInfoInternal(boolean includeIcon, boolean scrubData) { final SessionInfo info = new SessionInfo(); + final float progress; + synchronized (mProgressLock) { + progress = mProgress; + } synchronized (mLock) { info.sessionId = sessionId; info.userId = userId; @@ -1138,7 +1149,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { info.installerAttributionTag = mInstallSource.installerAttributionTag; info.resolvedBaseCodePath = (mResolvedBaseFile != null) ? mResolvedBaseFile.getAbsolutePath() : null; - info.progress = mProgress; + info.progress = progress; info.sealed = mSealed; info.isCommitted = mCommitted.get(); info.active = mActiveCount.get() > 0; @@ -1364,7 +1375,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { return; } - final String initiatingPackageName = mInstallSource.initiatingPackageName; + final String initiatingPackageName = getInstallSource().initiatingPackageName; final AppOpsManager appOps = mContext.getSystemService(AppOpsManager.class); appOps.checkPackage(Binder.getCallingUid(), initiatingPackageName); @@ -1585,7 +1596,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { if (params.sizeBytes > 0) { final long delta = progress - last.value; last.value = progress; - synchronized (mLock) { + synchronized (mProgressLock) { setClientProgressLocked(mClientProgress + (float) delta / (float) params.sizeBytes); } @@ -1897,13 +1908,6 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } } - /** {@hide} */ - private class StreamingException extends Exception { - StreamingException(Throwable cause) { - super(cause); - } - } - /** * Returns whether or not a package can be installed while Secure FRP is enabled. *
@@ -1973,7 +1977,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
}
}
- mRemoteStatusReceiver = statusReceiver;
+ setRemoteStatusReceiver(statusReceiver);
// After updating the observer, we can skip re-sealing.
if (mSealed) {
@@ -2140,7 +2144,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
private void onSystemDataLoaderUnrecoverable() {
final PackageManagerService packageManagerService = mPm;
- final String packageName = mPackageName;
+ final String packageName = getPackageName();
if (TextUtils.isEmpty(packageName)) {
// The package has not been installed.
return;
@@ -2303,9 +2307,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
*/
@WorkerThread
private boolean sendPendingUserActionIntentIfNeeded() {
- synchronized (mLock) {
- assertNotChildLocked("PackageInstallerSession#sendPendingUserActionIntentIfNeeded");
- }
+ assertNotChild("PackageInstallerSession#sendPendingUserActionIntentIfNeeded");
return sessionContains(PackageInstallerSession::checkUserActionRequirement);
}
@@ -2315,7 +2317,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
if (isInstallerDeviceOwnerOrAffiliatedProfileOwner()) {
DevicePolicyEventLogger
.createEvent(DevicePolicyEnums.INSTALL_PACKAGE)
- .setAdmin(mInstallSource.installerPackageName)
+ .setAdmin(getInstallSource().installerPackageName)
.write();
}
@@ -2392,6 +2394,12 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
}
}
+ private void setRemoteStatusReceiver(IntentSender remoteStatusReceiver) {
+ synchronized (mLock) {
+ mRemoteStatusReceiver = remoteStatusReceiver;
+ }
+ }
+
private void verifyNonStaged()
throws PackageManagerException {
final VerificationParams verifyingSession = prepareForVerification();
@@ -2882,7 +2890,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
final List