Allows forceQueryable to be set on install
This change adds a --force-queryable flag to adb install to allow, for development and testing purposes, the ability to install a package so it is visible to all other packages on the device. Bug: 142386643 Test: atest AppEnumerationTests Change-Id: Id793ac39a4dfb022fc5e4c0c1230a3da77bf41c6
This commit is contained in:
@@ -1467,6 +1467,8 @@ public class PackageInstaller {
|
||||
public DataLoaderParams dataLoaderParams;
|
||||
/** {@hide} */
|
||||
public int rollbackDataPolicy = PackageManager.RollbackDataPolicy.RESTORE;
|
||||
/** {@hide} */
|
||||
public boolean forceQueryableOverride;
|
||||
|
||||
/**
|
||||
* Construct parameters for a new package install session.
|
||||
@@ -1499,6 +1501,7 @@ public class PackageInstaller {
|
||||
installerPackageName = source.readString();
|
||||
isMultiPackage = source.readBoolean();
|
||||
isStaged = source.readBoolean();
|
||||
forceQueryableOverride = source.readBoolean();
|
||||
requiredInstalledVersionCode = source.readLong();
|
||||
DataLoaderParamsParcel dataLoaderParamsParcel = source.readParcelable(
|
||||
DataLoaderParamsParcel.class.getClassLoader());
|
||||
@@ -1528,6 +1531,7 @@ public class PackageInstaller {
|
||||
ret.installerPackageName = installerPackageName;
|
||||
ret.isMultiPackage = isMultiPackage;
|
||||
ret.isStaged = isStaged;
|
||||
ret.forceQueryableOverride = forceQueryableOverride;
|
||||
ret.requiredInstalledVersionCode = requiredInstalledVersionCode;
|
||||
ret.dataLoaderParams = dataLoaderParams;
|
||||
ret.rollbackDataPolicy = rollbackDataPolicy;
|
||||
@@ -1904,6 +1908,14 @@ public class PackageInstaller {
|
||||
this.dataLoaderParams = dataLoaderParams;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* {@hide}
|
||||
*/
|
||||
public void setForceQueryable() {
|
||||
this.forceQueryableOverride = true;
|
||||
}
|
||||
|
||||
/** {@hide} */
|
||||
public void dump(IndentingPrintWriter pw) {
|
||||
pw.printPair("mode", mode);
|
||||
@@ -1923,6 +1935,7 @@ public class PackageInstaller {
|
||||
pw.printPair("installerPackageName", installerPackageName);
|
||||
pw.printPair("isMultiPackage", isMultiPackage);
|
||||
pw.printPair("isStaged", isStaged);
|
||||
pw.printPair("forceQueryable", forceQueryableOverride);
|
||||
pw.printPair("requiredInstalledVersionCode", requiredInstalledVersionCode);
|
||||
pw.printPair("dataLoaderParams", dataLoaderParams);
|
||||
pw.printPair("rollbackDataPolicy", rollbackDataPolicy);
|
||||
@@ -1954,6 +1967,7 @@ public class PackageInstaller {
|
||||
dest.writeString(installerPackageName);
|
||||
dest.writeBoolean(isMultiPackage);
|
||||
dest.writeBoolean(isStaged);
|
||||
dest.writeBoolean(forceQueryableOverride);
|
||||
dest.writeLong(requiredInstalledVersionCode);
|
||||
if (dataLoaderParams != null) {
|
||||
dest.writeParcelable(dataLoaderParams.getData(), flags);
|
||||
@@ -2078,6 +2092,8 @@ public class PackageInstaller {
|
||||
/** {@hide} */
|
||||
public boolean isStaged;
|
||||
/** {@hide} */
|
||||
public boolean forceQueryable;
|
||||
/** {@hide} */
|
||||
public int parentSessionId = INVALID_ID;
|
||||
/** {@hide} */
|
||||
public int[] childSessionIds = NO_SESSIONS;
|
||||
@@ -2135,6 +2151,7 @@ public class PackageInstaller {
|
||||
installFlags = source.readInt();
|
||||
isMultiPackage = source.readBoolean();
|
||||
isStaged = source.readBoolean();
|
||||
forceQueryable = source.readBoolean();
|
||||
parentSessionId = source.readInt();
|
||||
childSessionIds = source.createIntArray();
|
||||
if (childSessionIds == null) {
|
||||
@@ -2475,6 +2492,14 @@ public class PackageInstaller {
|
||||
return rollbackDataPolicy;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if this session is marked as forceQueryable
|
||||
* {@hide}
|
||||
*/
|
||||
public boolean isForceQueryable() {
|
||||
return forceQueryable;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns {@code true} if this session is an active staged session.
|
||||
*
|
||||
@@ -2636,6 +2661,7 @@ public class PackageInstaller {
|
||||
dest.writeInt(installFlags);
|
||||
dest.writeBoolean(isMultiPackage);
|
||||
dest.writeBoolean(isStaged);
|
||||
dest.writeBoolean(forceQueryable);
|
||||
dest.writeInt(parentSessionId);
|
||||
dest.writeIntArray(childSessionIds);
|
||||
dest.writeBoolean(isStagedSessionApplied);
|
||||
|
||||
@@ -347,6 +347,7 @@ public class AppsFilter {
|
||||
mForceQueryable.contains(newPkgSetting.appId)
|
||||
/* shared user that is already force queryable */
|
||||
|| newPkg.isForceQueryable()
|
||||
|| newPkgSetting.forceQueryableOverride
|
||||
|| (newPkgSetting.isSystem() && (mSystemAppsQueryable
|
||||
|| ArrayUtils.contains(mForceQueryableByDevicePackageNames,
|
||||
newPkg.getPackageName())));
|
||||
|
||||
@@ -635,6 +635,13 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
|
||||
stageCid = buildExternalStageCid(sessionId);
|
||||
}
|
||||
}
|
||||
|
||||
// reset the force queryable param if it's not called by an approved caller.
|
||||
if (params.forceQueryableOverride) {
|
||||
if (callingUid != Process.SHELL_UID && callingUid != Process.ROOT_UID) {
|
||||
params.forceQueryableOverride = false;
|
||||
}
|
||||
}
|
||||
InstallSource installSource = InstallSource.create(installerPackageName,
|
||||
originatingPackageName, requestedInstallerPackageName);
|
||||
session = new PackageInstallerSession(mInternalCallback, mContext, mPm, this,
|
||||
|
||||
@@ -10570,6 +10570,10 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
if (pkgSetting.sharedUser != null) {
|
||||
pkgSetting.sharedUser.addPackage(pkgSetting);
|
||||
}
|
||||
if (reconciledPkg.installArgs != null && reconciledPkg.installArgs.forceQueryableOverride) {
|
||||
pkgSetting.forceQueryableOverride = true;
|
||||
}
|
||||
|
||||
// TODO(toddke): Consider a method specifically for modifying the Package object
|
||||
// post scan; or, moving this stuff out of the Package object since it has nothing
|
||||
// to do with the package on disk.
|
||||
@@ -14063,6 +14067,7 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
@Nullable
|
||||
MultiPackageInstallParams mParentInstallParams;
|
||||
final long requiredInstalledVersionCode;
|
||||
final boolean forceQueryableOverride;
|
||||
|
||||
InstallParams(OriginInfo origin, MoveInfo move, IPackageInstallObserver2 observer,
|
||||
int installFlags, InstallSource installSource, String volumeUuid,
|
||||
@@ -14084,6 +14089,7 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
this.signingDetails = signingDetails;
|
||||
this.installReason = installReason;
|
||||
this.requiredInstalledVersionCode = requiredInstalledVersionCode;
|
||||
this.forceQueryableOverride = false;
|
||||
}
|
||||
|
||||
InstallParams(ActiveInstallSession activeInstallSession) {
|
||||
@@ -14117,6 +14123,7 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
signingDetails = activeInstallSession.getSigningDetails();
|
||||
requiredInstalledVersionCode = activeInstallSession.getSessionParams()
|
||||
.requiredInstalledVersionCode;
|
||||
forceQueryableOverride = activeInstallSession.getSessionParams().forceQueryableOverride;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -14717,6 +14724,7 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
final int traceCookie;
|
||||
final PackageParser.SigningDetails signingDetails;
|
||||
final int installReason;
|
||||
final boolean forceQueryableOverride;
|
||||
@Nullable final MultiPackageInstallParams mMultiPackageInstallParams;
|
||||
|
||||
// The list of instruction sets supported by this app. This is currently
|
||||
@@ -14730,7 +14738,7 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
String abiOverride, String[] installGrantPermissions,
|
||||
List<String> whitelistedRestrictedPermissions,
|
||||
String traceMethod, int traceCookie, SigningDetails signingDetails,
|
||||
int installReason,
|
||||
int installReason, boolean forceQueryableOverride,
|
||||
MultiPackageInstallParams multiPackageInstallParams) {
|
||||
this.origin = origin;
|
||||
this.move = move;
|
||||
@@ -14747,6 +14755,7 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
this.traceCookie = traceCookie;
|
||||
this.signingDetails = signingDetails;
|
||||
this.installReason = installReason;
|
||||
this.forceQueryableOverride = forceQueryableOverride;
|
||||
this.mMultiPackageInstallParams = multiPackageInstallParams;
|
||||
}
|
||||
|
||||
@@ -14757,7 +14766,7 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
params.getUser(), null /*instructionSets*/, params.packageAbiOverride,
|
||||
params.grantedRuntimePermissions, params.whitelistedRestrictedPermissions,
|
||||
params.traceMethod, params.traceCookie, params.signingDetails,
|
||||
params.installReason, params.mParentInstallParams);
|
||||
params.installReason, params.forceQueryableOverride, params.mParentInstallParams);
|
||||
}
|
||||
|
||||
abstract int copyApk();
|
||||
@@ -14848,7 +14857,7 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
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 */);
|
||||
PackageManager.INSTALL_REASON_UNKNOWN, false, null /* parent */);
|
||||
this.codeFile = (codePath != null) ? new File(codePath) : null;
|
||||
this.resourceFile = (resourcePath != null) ? new File(resourcePath) : null;
|
||||
}
|
||||
|
||||
@@ -2730,6 +2730,9 @@ class PackageManagerShellCommand extends ShellCommand {
|
||||
case "--staged":
|
||||
sessionParams.setStaged();
|
||||
break;
|
||||
case "--force-queryable":
|
||||
sessionParams.setForceQueryable();
|
||||
break;
|
||||
case "--enable-rollback":
|
||||
if (params.installerPackageName == null) {
|
||||
// com.android.shell has the TEST_MANAGE_ROLLBACKS
|
||||
|
||||
@@ -36,7 +36,6 @@ 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.Arrays;
|
||||
@@ -132,6 +131,8 @@ public abstract class PackageSettingBase extends SettingBase {
|
||||
|
||||
IntentFilterVerificationInfo verificationInfo;
|
||||
|
||||
boolean forceQueryableOverride;
|
||||
|
||||
PackageSettingBase(String name, String realName, File codePath, File resourcePath,
|
||||
String legacyNativeLibraryPathString, String primaryCpuAbiString,
|
||||
String secondaryCpuAbiString, String cpuAbiOverrideString,
|
||||
@@ -261,6 +262,7 @@ public abstract class PackageSettingBase extends SettingBase {
|
||||
? Arrays.copyOf(orig.usesStaticLibrariesVersions,
|
||||
orig.usesStaticLibrariesVersions.length) : null;
|
||||
updateAvailable = orig.updateAvailable;
|
||||
forceQueryableOverride = orig.forceQueryableOverride;
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
@@ -693,6 +695,7 @@ public abstract class PackageSettingBase extends SettingBase {
|
||||
this.categoryHint = other.categoryHint;
|
||||
this.updateAvailable = other.updateAvailable;
|
||||
this.verificationInfo = other.verificationInfo;
|
||||
this.forceQueryableOverride = other.forceQueryableOverride;
|
||||
|
||||
if (mOldCodePaths != null) {
|
||||
if (other.mOldCodePaths != null) {
|
||||
|
||||
@@ -2836,6 +2836,9 @@ public final class Settings {
|
||||
if (pkg.updateAvailable) {
|
||||
serializer.attribute(null, "updateAvailable", "true");
|
||||
}
|
||||
if (pkg.forceQueryableOverride) {
|
||||
serializer.attribute(null, "forceQueryable", "true");
|
||||
}
|
||||
|
||||
writeUsesStaticLibLPw(serializer, pkg.usesStaticLibraries, pkg.usesStaticLibrariesVersions);
|
||||
|
||||
@@ -3599,6 +3602,7 @@ public final class Settings {
|
||||
PackageSetting packageSetting = null;
|
||||
String version = null;
|
||||
long versionCode = 0;
|
||||
String installedForceQueryable = null;
|
||||
try {
|
||||
name = parser.getAttributeValue(null, ATTR_NAME);
|
||||
realName = parser.getAttributeValue(null, "realName");
|
||||
@@ -3615,6 +3619,7 @@ public final class Settings {
|
||||
secondaryCpuAbiString = parser.getAttributeValue(null, "secondaryCpuAbi");
|
||||
cpuAbiOverrideString = parser.getAttributeValue(null, "cpuAbiOverride");
|
||||
updateAvailable = parser.getAttributeValue(null, "updateAvailable");
|
||||
installedForceQueryable = parser.getAttributeValue(null, "forceQueryable");
|
||||
|
||||
if (primaryCpuAbiString == null && legacyCpuAbiString != null) {
|
||||
primaryCpuAbiString = legacyCpuAbiString;
|
||||
@@ -3798,6 +3803,7 @@ public final class Settings {
|
||||
packageSetting.primaryCpuAbiString = primaryCpuAbiString;
|
||||
packageSetting.secondaryCpuAbiString = secondaryCpuAbiString;
|
||||
packageSetting.updateAvailable = "true".equals(updateAvailable);
|
||||
packageSetting.forceQueryableOverride = "true".equals(installedForceQueryable);
|
||||
// Handle legacy string here for single-user mode
|
||||
final String enabledStr = parser.getAttributeValue(null, ATTR_ENABLED);
|
||||
if (enabledStr != null) {
|
||||
|
||||
Reference in New Issue
Block a user