Merge "Move more fields to InstallSource."

This commit is contained in:
Alan Stokes
2019-10-18 15:06:16 +00:00
committed by Android (Google) Code Review
10 changed files with 166 additions and 133 deletions

View File

@@ -20,40 +20,103 @@ import android.annotation.Nullable;
import com.android.internal.util.IndentingPrintWriter;
import java.util.Objects;
/**
* Immutable class holding information about where the request to install or update an app
* came from.
*/
final class InstallSource {
private static final InstallSource EMPTY = new InstallSource(null);
/**
* The package that requested the installation, if known.
* An instance of InstallSource representing an absence of knowledge of the source of
* a package. Used in preference to null.
*/
static final InstallSource EMPTY = new InstallSource(null, null, false);
/** The package that requested the installation, if known. */
@Nullable
final String initiatingPackageName;
static InstallSource create(@Nullable String initiatingPackageName) {
return initiatingPackageName == null
? EMPTY : new InstallSource(initiatingPackageName.intern());
/**
* Package name of the app that installed this package (the installer of record). Note that
* this may be modified.
*/
@Nullable
final String installerPackageName;
/** Indicates if the package that was the installerPackageName has been uninstalled. */
final boolean isOrphaned;
static InstallSource create(@Nullable String initiatingPackageName,
@Nullable String installerPackageName) {
return create(initiatingPackageName, installerPackageName, false);
}
private InstallSource(@Nullable String initiatingPackageName) {
static InstallSource create(@Nullable String initiatingPackageName,
@Nullable String installerPackageName, boolean isOrphaned) {
if (initiatingPackageName == null && installerPackageName == null && !isOrphaned) {
return EMPTY;
}
return new InstallSource(
initiatingPackageName == null ? null : initiatingPackageName.intern(),
installerPackageName == null ? null : installerPackageName.intern(),
isOrphaned);
}
private InstallSource(@Nullable String initiatingPackageName,
@Nullable String installerPackageName, boolean isOrphaned) {
this.initiatingPackageName = initiatingPackageName;
this.isOrphaned = isOrphaned;
this.installerPackageName = installerPackageName;
}
void dump(IndentingPrintWriter pw) {
pw.printPair("installerPackageName", installerPackageName);
pw.printPair("installInitiatingPackageName", initiatingPackageName);
}
/**
* Return an InstallSource the same as this one except with the specified installerPackageName.
*/
InstallSource setInstallerPackage(String installerPackageName) {
return Objects.equals(installerPackageName, this.installerPackageName) ? this
: create(initiatingPackageName, installerPackageName, isOrphaned);
}
/**
* Return an InstallSource the same as this one except with the specified value for isOrphaned.
*/
InstallSource setIsOrphaned(boolean isOrphaned) {
return isOrphaned == this.isOrphaned ? this
: create(initiatingPackageName, installerPackageName, isOrphaned);
}
/**
* Return an InstallSource the same as this one except it does not refer to the specified
* installer package name.
* installer package name (which is being uninstalled).
*/
InstallSource removeInstallerPackage(String packageName) {
if (packageName != null && packageName.equals(initiatingPackageName)) {
return create(null);
if (packageName == null) {
return this;
}
return this;
boolean modified = false;
String initiatingPackageName = this.initiatingPackageName;
String installerPackageName = this.installerPackageName;
boolean isOrphaned = this.isOrphaned;
if (packageName.equals(initiatingPackageName)) {
initiatingPackageName = null;
modified = true;
}
if (packageName.equals(installerPackageName)) {
installerPackageName = null;
isOrphaned = true;
modified = true;
}
return modified
? create(initiatingPackageName, installerPackageName, isOrphaned)
: this;
}
}

View File

@@ -623,10 +623,11 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
stageCid = buildExternalStageCid(sessionId);
}
}
InstallSource installSource = InstallSource.create(installerPackageName);
InstallSource installSource = InstallSource.create(installerPackageName,
requestedInstallerPackageName);
session = new PackageInstallerSession(mInternalCallback, mContext, mPm, this,
mInstallThread.getLooper(), mStagingManager, sessionId, userId,
requestedInstallerPackageName, callingUid, installSource, params, createdMillis,
mInstallThread.getLooper(), mStagingManager, sessionId, userId, callingUid,
installSource, params, createdMillis,
stageDir, stageCid, false, false, false, null, SessionInfo.INVALID_ID,
false, false, false, SessionInfo.STAGED_SESSION_NO_ERROR, "");

View File

@@ -212,10 +212,6 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
/** Uid of the creator of this session. */
private final int mOriginalInstallerUid;
/** Package of the owner of the installer session */
@GuardedBy("mLock")
private @Nullable String mInstallerPackageName;
/** Uid of the owner of the installer session */
@GuardedBy("mLock")
private int mInstallerUid;
@@ -374,7 +370,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
}
DevicePolicyManagerInternal dpmi =
LocalServices.getService(DevicePolicyManagerInternal.class);
return dpmi != null && dpmi.canSilentlyInstallPackage(mInstallerPackageName, mInstallerUid);
return dpmi != null && dpmi.canSilentlyInstallPackage(
mInstallSource.installerPackageName, mInstallerUid);
}
/**
@@ -418,8 +415,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
public PackageInstallerSession(PackageInstallerService.InternalCallback callback,
Context context, PackageManagerService pm,
PackageSessionProvider sessionProvider, Looper looper, StagingManager stagingManager,
int sessionId, int userId,
String installerPackageName, int installerUid, @NonNull InstallSource installSource,
int sessionId, int userId, int installerUid, @NonNull InstallSource installSource,
SessionParams params, long createdMillis,
File stageDir, String stageCid, boolean prepared, boolean committed, boolean sealed,
@Nullable int[] childSessionIds, int parentSessionId, boolean isReady,
@@ -435,7 +431,6 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
this.sessionId = sessionId;
this.userId = userId;
mOriginalInstallerUid = installerUid;
mInstallerPackageName = installerPackageName;
mInstallerUid = installerUid;
mInstallSource = Preconditions.checkNotNull(installSource);
this.params = params;
@@ -475,7 +470,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
synchronized (mLock) {
info.sessionId = sessionId;
info.userId = userId;
info.installerPackageName = mInstallerPackageName;
info.installerPackageName = mInstallSource.installerPackageName;
info.resolvedBaseCodePath = (mResolvedBaseFile != null) ?
mResolvedBaseFile.getAbsolutePath() : null;
info.progress = mProgress;
@@ -1226,14 +1221,13 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
throw new IllegalArgumentException("Package is not valid", e);
}
if (!mPackageName.equals(mInstallerPackageName)) {
if (!mPackageName.equals(mInstallSource.installerPackageName)) {
throw new SecurityException("Can only transfer sessions that update the original "
+ "installer");
}
mInstallerPackageName = packageName;
mInstallerUid = newOwnerAppInfo.uid;
mInstallSource = InstallSource.create(packageName);
mInstallSource = InstallSource.create(packageName, packageName);
}
// Persist the fact that we've sealed ourselves to prevent
@@ -1246,7 +1240,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
if (isInstallerDeviceOwnerOrAffiliatedProfileOwnerLocked()) {
DevicePolicyEventLogger
.createEvent(DevicePolicyEnums.INSTALL_PACKAGE)
.setAdmin(mInstallerPackageName)
.setAdmin(mInstallSource.installerPackageName)
.write();
}
if (params.isStaged) {
@@ -1452,8 +1446,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
mRelinquished = true;
return new PackageManagerService.ActiveInstallSession(mPackageName, stageDir,
localObserver, params, mInstallerPackageName, mInstallerUid, mInstallSource, user,
mSigningDetails);
localObserver, params, mInstallerUid, mInstallSource, user, mSigningDetails);
}
private static void maybeRenameFile(File from, File to) throws PackageManagerException {
@@ -1902,7 +1895,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
String getInstallerPackageName() {
synchronized (mLock) {
return mInstallerPackageName;
return mInstallSource.installerPackageName;
}
}
@@ -2343,9 +2336,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
pw.printPair("userId", userId);
pw.printPair("mOriginalInstallerUid", mOriginalInstallerUid);
pw.printPair("mInstallerPackageName", mInstallerPackageName);
pw.printPair("mInstallerUid", mInstallerUid);
mInstallSource.dump(pw);
pw.printPair("mInstallerUid", mInstallerUid);
pw.printPair("createdMillis", createdMillis);
pw.printPair("updatedMillis", updatedMillis);
pw.printPair("stageDir", stageDir);
@@ -2424,7 +2416,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
writeIntAttribute(out, ATTR_SESSION_ID, sessionId);
writeIntAttribute(out, ATTR_USER_ID, userId);
writeStringAttribute(out, ATTR_INSTALLER_PACKAGE_NAME,
mInstallerPackageName);
mInstallSource.installerPackageName);
writeIntAttribute(out, ATTR_INSTALLER_UID, mInstallerUid);
writeStringAttribute(out, ATTR_INITIATING_PACKAGE_NAME,
mInstallSource.initiatingPackageName);
@@ -2626,10 +2618,11 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
childSessionIdsArray = EMPTY_CHILD_SESSION_ARRAY;
}
InstallSource installSource = InstallSource.create(installInitiatingPackageName);
InstallSource installSource = InstallSource.create(installInitiatingPackageName,
installerPackageName);
return new PackageInstallerSession(callback, context, pm, sessionProvider,
installerThread, stagingManager, sessionId, userId, installerPackageName,
installerUid, installSource, params, createdMillis, stageDir, stageCid,
installerThread, stagingManager, sessionId, userId, installerUid,
installSource, params, createdMillis, stageDir, stageCid,
prepared, committed, sealed, childSessionIdsArray, parentSessionId,
isReady, isFailed, isApplied, stagedSessionErrorCode, stagedSessionErrorMessage);
}

View File

@@ -1598,7 +1598,7 @@ public class PackageManagerService extends IPackageManager.Stub
handlePackagePostInstall(parentRes, grantPermissions,
killApp, virtualPreload, grantedPermissions,
whitelistedRestrictedPermissions, didRestore,
args.installerPackageName, args.observer);
args.installSource.installerPackageName, args.observer);
// Handle the child packages
final int childCount = (parentRes.addedChildPackages != null)
@@ -1608,7 +1608,7 @@ public class PackageManagerService extends IPackageManager.Stub
handlePackagePostInstall(childRes, grantPermissions,
killApp, virtualPreload, grantedPermissions,
whitelistedRestrictedPermissions, false /*didRestore*/,
args.installerPackageName, args.observer);
args.installSource.installerPackageName, args.observer);
}
// Log tracing if needed
@@ -10899,7 +10899,7 @@ public class PackageManagerService extends IPackageManager.Stub
}
if (isSystemApp(pkg)) {
pkgSetting.isOrphaned = true;
pkgSetting.setIsOrphaned(true);
}
// Take care of first install / last update times.
@@ -12382,7 +12382,7 @@ public class PackageManagerService extends IPackageManager.Stub
int userId) {
final PackageRemovedInfo info = new PackageRemovedInfo(this);
info.removedPackage = packageName;
info.installerPackageName = pkgSetting.installerPackageName;
info.installerPackageName = pkgSetting.installSource.installerPackageName;
info.removedUsers = new int[] {userId};
info.broadcastUsers = new int[] {userId};
info.uid = UserHandle.getUid(userId, pkgSetting.appId);
@@ -13404,9 +13404,11 @@ public class PackageManagerService extends IPackageManager.Stub
// Verify: if target already has an installer package, it must
// be signed with the same cert as the caller.
if (targetPackageSetting.installerPackageName != null) {
String targetInstallerPackageName =
targetPackageSetting.installSource.installerPackageName;
if (targetInstallerPackageName != null) {
PackageSetting setting = mSettings.mPackages.get(
targetPackageSetting.installerPackageName);
targetInstallerPackageName);
// If the currently set package isn't valid, then it's always
// okay to change it.
if (setting != null) {
@@ -13415,13 +13417,13 @@ public class PackageManagerService extends IPackageManager.Stub
!= PackageManager.SIGNATURE_MATCH) {
throw new SecurityException(
"Caller does not have same cert as old installer package "
+ targetPackageSetting.installerPackageName);
+ targetInstallerPackageName);
}
}
}
// Okay!
targetPackageSetting.installerPackageName = installerPackageName;
targetPackageSetting.setInstallerPackageName(installerPackageName);
if (installerPackageName != null) {
mSettings.mInstallerPackages.add(installerPackageName);
}
@@ -13446,7 +13448,7 @@ public class PackageManagerService extends IPackageManager.Stub
ps, Binder.getCallingUid(), UserHandle.getCallingUserId())) {
throw new IllegalArgumentException("Unknown target package " + packageName);
}
if (!Objects.equals(callerPackageName, ps.installerPackageName)) {
if (!Objects.equals(callerPackageName, ps.installSource.installerPackageName)) {
throw new IllegalArgumentException("Calling package " + callerPackageName
+ " is not installer for " + packageName);
}
@@ -13906,8 +13908,7 @@ public class PackageManagerService extends IPackageManager.Stub
final MoveInfo move;
final IPackageInstallObserver2 observer;
int installFlags;
final String installerPackageName;
final InstallSource installSource;
@NonNull final InstallSource installSource;
final String volumeUuid;
private boolean mVerificationCompleted;
private boolean mEnableRollbackCompleted;
@@ -13924,8 +13925,7 @@ public class PackageManagerService extends IPackageManager.Stub
final long requiredInstalledVersionCode;
InstallParams(OriginInfo origin, MoveInfo move, IPackageInstallObserver2 observer,
int installFlags, String installerPackageName,
InstallSource installSource, String volumeUuid,
int installFlags, InstallSource installSource, String volumeUuid,
VerificationInfo verificationInfo, UserHandle user, String packageAbiOverride,
String[] grantedPermissions, List<String> whitelistedRestrictedPermissions,
SigningDetails signingDetails, int installReason,
@@ -13935,8 +13935,7 @@ public class PackageManagerService extends IPackageManager.Stub
this.move = move;
this.observer = observer;
this.installFlags = installFlags;
this.installerPackageName = installerPackageName;
this.installSource = installSource;
this.installSource = Preconditions.checkNotNull(installSource);
this.volumeUuid = volumeUuid;
this.verificationInfo = verificationInfo;
this.packageAbiOverride = packageAbiOverride;
@@ -13962,12 +13961,12 @@ public class PackageManagerService extends IPackageManager.Stub
activeInstallSession.getInstallerUid());
origin = OriginInfo.fromStagedFile(activeInstallSession.getStagedDir());
move = null;
installReason = fixUpInstallReason(activeInstallSession.getInstallerPackageName(),
installReason = fixUpInstallReason(
activeInstallSession.getInstallSource().installerPackageName,
activeInstallSession.getInstallerUid(),
activeInstallSession.getSessionParams().installReason);
observer = activeInstallSession.getObserver();
installFlags = activeInstallSession.getSessionParams().installFlags;
installerPackageName = activeInstallSession.getInstallerPackageName();
installSource = activeInstallSession.getInstallSource();
volumeUuid = activeInstallSession.getSessionParams().volumeUuid;
packageAbiOverride = activeInstallSession.getSessionParams().abiOverride;
@@ -14219,7 +14218,7 @@ public class PackageManagerService extends IPackageManager.Stub
verification.putExtra(PackageManager.EXTRA_VERIFICATION_ID, verificationId);
verification.putExtra(PackageManager.EXTRA_VERIFICATION_INSTALLER_PACKAGE,
installerPackageName);
installSource.installerPackageName);
verification.putExtra(PackageManager.EXTRA_VERIFICATION_INSTALL_FLAGS,
installFlags);
@@ -14450,8 +14449,7 @@ public class PackageManagerService extends IPackageManager.Stub
final IPackageInstallObserver2 observer;
// Always refers to PackageManager flags only
final int installFlags;
final String installerPackageName;
final InstallSource installSource;
@NonNull final InstallSource installSource;
final String volumeUuid;
final UserHandle user;
final String abiOverride;
@@ -14470,8 +14468,7 @@ public class PackageManagerService extends IPackageManager.Stub
/* nullable */ String[] instructionSets;
InstallArgs(OriginInfo origin, MoveInfo move, IPackageInstallObserver2 observer,
int installFlags, String installerPackageName,
InstallSource installSource, String volumeUuid,
int installFlags, InstallSource installSource, String volumeUuid,
UserHandle user, String[] instructionSets,
String abiOverride, String[] installGrantPermissions,
List<String> whitelistedRestrictedPermissions,
@@ -14482,8 +14479,7 @@ public class PackageManagerService extends IPackageManager.Stub
this.move = move;
this.installFlags = installFlags;
this.observer = observer;
this.installerPackageName = installerPackageName;
this.installSource = installSource;
this.installSource = Preconditions.checkNotNull(installSource);
this.volumeUuid = volumeUuid;
this.user = user;
this.instructionSets = instructionSets;
@@ -14500,7 +14496,7 @@ public class PackageManagerService extends IPackageManager.Stub
/** New install */
InstallArgs(InstallParams params) {
this(params.origin, params.move, params.observer, params.installFlags,
params.installerPackageName, params.installSource, params.volumeUuid,
params.installSource, params.volumeUuid,
params.getUser(), null /*instructionSets*/, params.packageAbiOverride,
params.grantedRuntimePermissions, params.whitelistedRestrictedPermissions,
params.traceMethod, params.traceCookie, params.signingDetails,
@@ -14592,8 +14588,9 @@ public class PackageManagerService extends IPackageManager.Stub
/** Existing install */
FileInstallArgs(String codePath, String resourcePath, String[] instructionSets) {
super(OriginInfo.fromNothing(), null, null, 0, null, null, null, null, instructionSets,
null, null, null, null, 0, PackageParser.SigningDetails.UNKNOWN,
super(OriginInfo.fromNothing(), null, null, 0, InstallSource.EMPTY,
null, null, instructionSets, null, null, null, null, 0,
PackageParser.SigningDetails.UNKNOWN,
PackageManager.INSTALL_REASON_UNKNOWN, null /* parent */);
this.codeFile = (codePath != null) ? new File(codePath) : null;
this.resourceFile = (resourcePath != null) ? new File(resourcePath) : null;
@@ -15049,7 +15046,7 @@ public class PackageManagerService extends IPackageManager.Stub
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "updateSettings");
final String pkgName = pkg.packageName;
final String installerPackageName = installArgs.installerPackageName;
final String installerPackageName = installArgs.installSource.installerPackageName;
final int[] installedForUsers = res.origUsers;
final int installReason = installArgs.installReason;
@@ -15817,7 +15814,8 @@ public class PackageManagerService extends IPackageManager.Stub
Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
}
request.installResult.setReturnCode(PackageManager.INSTALL_SUCCEEDED);
request.installResult.installerPackageName = request.args.installerPackageName;
request.installResult.installerPackageName =
request.args.installSource.installerPackageName;
final String packageName = prepareResult.packageToScan.packageName;
prepareResults.put(packageName, prepareResult);
@@ -16163,7 +16161,8 @@ public class PackageManagerService extends IPackageManager.Stub
if ((mPackages.containsKey(childPkg.packageName))) {
childRes.removedInfo = new PackageRemovedInfo(this);
childRes.removedInfo.removedPackage = childPkg.packageName;
childRes.removedInfo.installerPackageName = childPs.installerPackageName;
childRes.removedInfo.installerPackageName =
childPs.installSource.installerPackageName;
}
if (res.addedChildPackages == null) {
res.addedChildPackages = new ArrayMap<>();
@@ -16611,7 +16610,7 @@ public class PackageManagerService extends IPackageManager.Stub
res.removedInfo = new PackageRemovedInfo(this);
res.removedInfo.uid = oldPackage.applicationInfo.uid;
res.removedInfo.removedPackage = oldPackage.packageName;
res.removedInfo.installerPackageName = ps.installerPackageName;
res.removedInfo.installerPackageName = ps.installSource.installerPackageName;
res.removedInfo.isStaticSharedLib = pkg.staticSharedLibName != null;
res.removedInfo.isUpdate = true;
res.removedInfo.origUsers = installedUsers;
@@ -16634,7 +16633,7 @@ public class PackageManagerService extends IPackageManager.Stub
childRes.removedInfo.removedPackage = childPkg.packageName;
if (childPs != null) {
childRes.removedInfo.installerPackageName =
childPs.installerPackageName;
childPs.installSource.installerPackageName;
}
childRes.removedInfo.isUpdate = true;
childRes.removedInfo.installReasons =
@@ -16646,7 +16645,8 @@ public class PackageManagerService extends IPackageManager.Stub
PackageRemovedInfo childRemovedRes = new PackageRemovedInfo(this);
childRemovedRes.removedPackage = childPkg.packageName;
if (childPs != null) {
childRemovedRes.installerPackageName = childPs.installerPackageName;
childRemovedRes.installerPackageName =
childPs.installSource.installerPackageName;
}
childRemovedRes.isUpdate = false;
childRemovedRes.dataRemoved = true;
@@ -17668,7 +17668,7 @@ public class PackageManagerService extends IPackageManager.Stub
final PackageParser.Package deletedPkg = deletedPs.pkg;
if (outInfo != null) {
outInfo.removedPackage = packageName;
outInfo.installerPackageName = deletedPs.installerPackageName;
outInfo.installerPackageName = deletedPs.installSource.installerPackageName;
outInfo.isStaticSharedLib = deletedPkg != null
&& deletedPkg.staticSharedLibName != null;
outInfo.populateUsers(deletedPs == null ? null
@@ -18263,7 +18263,7 @@ public class PackageManagerService extends IPackageManager.Stub
String childPackageName = ps.childPackageNames.get(i);
PackageRemovedInfo childInfo = new PackageRemovedInfo(this);
childInfo.removedPackage = childPackageName;
childInfo.installerPackageName = ps.installerPackageName;
childInfo.installerPackageName = ps.installSource.installerPackageName;
outInfo.removedChildPackages.put(childPackageName, childInfo);
PackageSetting childPs = mSettings.getPackageLPr(childPackageName);
if (childPs != null) {
@@ -18403,7 +18403,7 @@ public class PackageManagerService extends IPackageManager.Stub
if (outInfo != null) {
outInfo.removedPackage = ps.name;
outInfo.installerPackageName = ps.installerPackageName;
outInfo.installerPackageName = ps.installSource.installerPackageName;
outInfo.isStaticSharedLib = pkg != null && pkg.staticSharedLibName != null;
outInfo.removedAppId = ps.appId;
outInfo.removedUsers = userIds;
@@ -21868,7 +21868,6 @@ public class PackageManagerService extends IPackageManager.Stub
final String currentVolumeUuid;
final File codeFile;
final String installerPackageName;
final InstallSource installSource;
final String packageAbiOverride;
final int appId;
@@ -21926,7 +21925,6 @@ public class PackageManagerService extends IPackageManager.Stub
isCurrentLocationExternal = isExternal(pkg);
codeFile = new File(pkg.codePath);
installerPackageName = ps.installerPackageName;
installSource = ps.installSource;
packageAbiOverride = ps.cpuAbiOverrideString;
appId = UserHandle.getAppId(pkg.applicationInfo.uid);
@@ -22073,7 +22071,7 @@ public class PackageManagerService extends IPackageManager.Stub
final Message msg = mHandler.obtainMessage(INIT_COPY);
final OriginInfo origin = OriginInfo.fromExistingFile(codeFile);
final InstallParams params = new InstallParams(origin, move, installObserver, installFlags,
installerPackageName, installSource, volumeUuid, null /*verificationInfo*/, user,
installSource, volumeUuid, null /*verificationInfo*/, user,
packageAbiOverride, null /*grantedPermissions*/,
null /*whitelistedRestrictedPermissions*/, PackageParser.SigningDetails.UNKNOWN,
PackageManager.INSTALL_REASON_UNKNOWN, PackageManager.VERSION_CODE_HIGHEST);
@@ -23535,7 +23533,7 @@ public class PackageManagerService extends IPackageManager.Stub
return false;
}
final PackageSetting installerPackageSetting =
mSettings.mPackages.get(packageSetting.installerPackageName);
mSettings.mPackages.get(packageSetting.installSource.installerPackageName);
return installerPackageSetting != null
&& UserHandle.isSameApp(installerPackageSetting.appId, callingUid);
}
@@ -23958,23 +23956,20 @@ public class PackageManagerService extends IPackageManager.Stub
private final File mStagedDir;
private final IPackageInstallObserver2 mObserver;
private final PackageInstaller.SessionParams mSessionParams;
private final String mInstallerPackageName;
private final int mInstallerUid;
private final InstallSource mInstallSource;
@NonNull private final InstallSource mInstallSource;
private final UserHandle mUser;
private final SigningDetails mSigningDetails;
ActiveInstallSession(String packageName, File stagedDir, IPackageInstallObserver2 observer,
PackageInstaller.SessionParams sessionParams, String installerPackageName,
int installerUid, InstallSource installSource,
UserHandle user, SigningDetails signingDetails) {
PackageInstaller.SessionParams sessionParams, int installerUid,
InstallSource installSource, UserHandle user, SigningDetails signingDetails) {
mPackageName = packageName;
mStagedDir = stagedDir;
mObserver = observer;
mSessionParams = sessionParams;
mInstallerPackageName = installerPackageName;
mInstallerUid = installerUid;
mInstallSource = installSource;
mInstallSource = Preconditions.checkNotNull(installSource);
mUser = user;
mSigningDetails = signingDetails;
}
@@ -23995,14 +23990,11 @@ public class PackageManagerService extends IPackageManager.Stub
return mSessionParams;
}
public String getInstallerPackageName() {
return mInstallerPackageName;
}
public int getInstallerUid() {
return mInstallerUid;
}
@NonNull
public InstallSource getInstallSource() {
return mInstallSource;
}

View File

@@ -187,7 +187,7 @@ public final class PackageSetting extends PackageSettingBase {
proto.write(PackageProto.VERSION_CODE, versionCode);
proto.write(PackageProto.INSTALL_TIME_MS, firstInstallTime);
proto.write(PackageProto.UPDATE_TIME_MS, lastUpdateTime);
proto.write(PackageProto.INSTALLER_NAME, installerPackageName);
proto.write(PackageProto.INSTALLER_NAME, installSource.installerPackageName);
if (pkg != null) {
proto.write(PackageProto.VERSION_STRING, pkg.mVersionName);

View File

@@ -36,6 +36,7 @@ import android.util.SparseArray;
import android.util.proto.ProtoOutputStream;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.Preconditions;
import java.io.File;
import java.util.ArrayList;
@@ -122,13 +123,8 @@ public abstract class PackageSettingBase extends SettingBase {
*/
Set<String> mOldCodePaths;
/** Package name of the app that installed this package */
String installerPackageName;
/** Indicates if the package that installed this app has been uninstalled */
boolean isOrphaned;
/** Information about the initial install of this package. */
@NonNull
InstallSource installSource;
/** Information about how this package was installed/updated. */
@NonNull InstallSource installSource;
/** UUID of {@link VolumeInfo} hosting this app */
String volumeUuid;
/** The category of this app, as hinted by the installer */
@@ -162,7 +158,7 @@ public abstract class PackageSettingBase extends SettingBase {
this.cpuAbiOverrideString = cpuAbiOverrideString;
this.versionCode = pVersionCode;
this.signatures = new PackageSignatures();
this.installSource = InstallSource.create(null);
this.installSource = InstallSource.EMPTY;
}
/**
@@ -180,28 +176,21 @@ public abstract class PackageSettingBase extends SettingBase {
}
public void setInstallerPackageName(String packageName) {
installerPackageName = packageName;
}
public String getInstallerPackageName() {
return installerPackageName;
installSource = installSource.setInstallerPackage(packageName);
}
public void setInstallSource(InstallSource installSource) {
this.installSource = installSource == null ? InstallSource.create(null) : installSource;
this.installSource = Preconditions.checkNotNull(installSource);
}
void removeInstallerPackage(String packageName) {
if (packageName == null) {
return;
}
if (packageName.equals(installerPackageName)) {
installerPackageName = null;
isOrphaned = true;
}
installSource = installSource.removeInstallerPackage(packageName);
}
public void setIsOrphaned(boolean isOrphaned) {
installSource = installSource.setIsOrphaned(isOrphaned);
}
public void setVolumeUuid(String volumeUuid) {
this.volumeUuid = volumeUuid;
}
@@ -253,9 +242,7 @@ public abstract class PackageSettingBase extends SettingBase {
cpuAbiOverrideString = orig.cpuAbiOverrideString;
firstInstallTime = orig.firstInstallTime;
installPermissionsFixed = orig.installPermissionsFixed;
installerPackageName = orig.installerPackageName;
installSource = orig.installSource;
isOrphaned = orig.isOrphaned;
keySetData = orig.keySetData;
lastUpdateTime = orig.lastUpdateTime;
legacyNativeLibraryPathString = orig.legacyNativeLibraryPathString;
@@ -703,8 +690,7 @@ public abstract class PackageSettingBase extends SettingBase {
this.signatures = other.signatures;
this.installPermissionsFixed = other.installPermissionsFixed;
this.keySetData = other.keySetData;
this.installerPackageName = other.installerPackageName;
this.isOrphaned = other.isOrphaned;
this.installSource = other.installSource;
this.volumeUuid = other.volumeUuid;
this.categoryHint = other.categoryHint;
this.updateAvailable = other.updateAvailable;

View File

@@ -2838,13 +2838,13 @@ public final class Settings {
if (pkg.uidError) {
serializer.attribute(null, "uidError", "true");
}
if (pkg.installerPackageName != null) {
serializer.attribute(null, "installer", pkg.installerPackageName);
InstallSource installSource = pkg.installSource;
if (installSource.installerPackageName != null) {
serializer.attribute(null, "installer", installSource.installerPackageName);
}
if (pkg.isOrphaned) {
if (installSource.isOrphaned) {
serializer.attribute(null, "isOrphaned", "true");
}
InstallSource installSource = pkg.installSource;
if (installSource.initiatingPackageName != null) {
serializer.attribute(null, "installInitiator", installSource.initiatingPackageName);
}
@@ -3807,9 +3807,8 @@ public final class Settings {
}
if (packageSetting != null) {
packageSetting.uidError = "true".equals(uidError);
packageSetting.installerPackageName = installerPackageName;
packageSetting.isOrphaned = "true".equals(isOrphaned);
packageSetting.installSource = InstallSource.create(installInitiatingPackageName);
packageSetting.installSource = InstallSource.create(
installInitiatingPackageName, installerPackageName, "true".equals(isOrphaned));
packageSetting.volumeUuid = volumeUuid;
packageSetting.categoryHint = categoryHint;
packageSetting.legacyNativeLibraryPathString = legacyNativeLibraryPathStr;
@@ -4252,7 +4251,7 @@ public final class Settings {
if (pkg == null) {
throw new IllegalArgumentException("Unknown package: " + packageName);
}
return pkg.installerPackageName;
return pkg.installSource.installerPackageName;
}
boolean isOrphaned(String packageName) {
@@ -4260,7 +4259,7 @@ public final class Settings {
if (pkg == null) {
throw new IllegalArgumentException("Unknown package: " + packageName);
}
return pkg.isOrphaned;
return pkg.installSource.isOrphaned;
}
int getApplicationEnabledSettingLPr(String packageName, int userId) {
@@ -4313,8 +4312,9 @@ public final class Settings {
pkgSetting.setStopped(stopped, userId);
// pkgSetting.pkg.mSetStopped = stopped;
if (pkgSetting.getNotLaunched(userId)) {
if (pkgSetting.installerPackageName != null) {
pm.notifyFirstLaunch(pkgSetting.name, pkgSetting.installerPackageName, userId);
if (pkgSetting.installSource.installerPackageName != null) {
pm.notifyFirstLaunch(pkgSetting.name,
pkgSetting.installSource.installerPackageName, userId);
}
pkgSetting.setNotLaunched(false, userId);
}
@@ -4477,7 +4477,8 @@ public final class Settings {
pw.print(",");
pw.print(ps.lastUpdateTime);
pw.print(",");
pw.print(ps.installerPackageName != null ? ps.installerPackageName : "?");
pw.print(ps.installSource.installerPackageName != null
? ps.installSource.installerPackageName : "?");
pw.println();
if (ps.pkg != null) {
pw.print(checkinTag); pw.print("-"); pw.print("splt,");
@@ -4690,9 +4691,9 @@ public final class Settings {
pw.print(prefix); pw.print(" lastUpdateTime=");
date.setTime(ps.lastUpdateTime);
pw.println(sdf.format(date));
if (ps.installerPackageName != null) {
if (ps.installSource.installerPackageName != null) {
pw.print(prefix); pw.print(" installerPackageName=");
pw.println(ps.installerPackageName);
pw.println(ps.installSource.installerPackageName);
}
if (ps.volumeUuid != null) {
pw.print(prefix); pw.print(" volumeUuid=");

View File

@@ -165,9 +165,8 @@ public class PackageInstallerSessionTest {
/* stagingManager */ null,
/* sessionId */ sessionId,
/* userId */ 456,
/* installerPackageName */ "testInstaller",
/* installerUid */ -1,
InstallSource.create("testInstaller"),
/* installSource */ InstallSource.create("testInstaller", "testInstaller"),
/* sessionParams */ params,
/* createdMillis */ 0L,
/* stageDir */ mTmpDir,

View File

@@ -812,11 +812,9 @@ public class PackageManagerSettingsTests {
assertSame(origPkgSetting.cpuAbiOverrideString, testPkgSetting.cpuAbiOverrideString);
assertThat(origPkgSetting.cpuAbiOverrideString, is(testPkgSetting.cpuAbiOverrideString));
assertThat(origPkgSetting.firstInstallTime, is(testPkgSetting.firstInstallTime));
assertSame(origPkgSetting.installerPackageName, testPkgSetting.installerPackageName);
assertThat(origPkgSetting.installerPackageName, is(testPkgSetting.installerPackageName));
assertSame(origPkgSetting.installSource, testPkgSetting.installSource);
assertThat(origPkgSetting.installPermissionsFixed,
is(testPkgSetting.installPermissionsFixed));
assertThat(origPkgSetting.isOrphaned, is(testPkgSetting.isOrphaned));
assertSame(origPkgSetting.keySetData, testPkgSetting.keySetData);
assertThat(origPkgSetting.keySetData, is(testPkgSetting.keySetData));
assertThat(origPkgSetting.lastUpdateTime, is(testPkgSetting.lastUpdateTime));

View File

@@ -429,7 +429,7 @@ public class ScanTests {
final PackageManagerService.ScanResult scanResult = executeScan(scanRequest);
assertThat(scanResult.pkgSetting.isOrphaned, is(true));
assertThat(scanResult.pkgSetting.installSource.isOrphaned, is(true));
}
private static Matcher<Integer> hasFlag(final int flag) {