diff options
| author | 2020-02-04 01:55:44 +0000 | |
|---|---|---|
| committer | 2020-02-04 01:55:44 +0000 | |
| commit | 99e390e9af80fc10f651bbf1dd78ed19737cf4c0 (patch) | |
| tree | 24e2aa1d970405eaf7b3e0196c864ed5b0af2949 | |
| parent | c250524f4a473175f3aef4fdeae81fa648d333d6 (diff) | |
| parent | 5ff0f9ea6af2d8847f3fba62415c0e1c431628af (diff) | |
Merge "Allows forceQueryable to be set on install"
7 files changed, 59 insertions, 4 deletions
diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java index b1b9454aeddd..2acbb97cb20a 100644 --- a/core/java/android/content/pm/PackageInstaller.java +++ b/core/java/android/content/pm/PackageInstaller.java @@ -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) { @@ -2476,6 +2493,14 @@ public class PackageInstaller { } /** + * 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. * * We consider a session active if it has been committed and it is either pending @@ -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); diff --git a/services/core/java/com/android/server/pm/AppsFilter.java b/services/core/java/com/android/server/pm/AppsFilter.java index 89f24d86192c..3ad120705eb3 100644 --- a/services/core/java/com/android/server/pm/AppsFilter.java +++ b/services/core/java/com/android/server/pm/AppsFilter.java @@ -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()))); diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java index c17ad1119631..9116c4032ad5 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerService.java +++ b/services/core/java/com/android/server/pm/PackageInstallerService.java @@ -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, diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index d6fd4d040352..c09fb38c4d8a 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -10572,6 +10572,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. @@ -14065,6 +14069,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, @@ -14086,6 +14091,7 @@ public class PackageManagerService extends IPackageManager.Stub this.signingDetails = signingDetails; this.installReason = installReason; this.requiredInstalledVersionCode = requiredInstalledVersionCode; + this.forceQueryableOverride = false; } InstallParams(ActiveInstallSession activeInstallSession) { @@ -14119,6 +14125,7 @@ public class PackageManagerService extends IPackageManager.Stub signingDetails = activeInstallSession.getSigningDetails(); requiredInstalledVersionCode = activeInstallSession.getSessionParams() .requiredInstalledVersionCode; + forceQueryableOverride = activeInstallSession.getSessionParams().forceQueryableOverride; } @Override @@ -14719,6 +14726,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 @@ -14732,7 +14740,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; @@ -14749,6 +14757,7 @@ public class PackageManagerService extends IPackageManager.Stub this.traceCookie = traceCookie; this.signingDetails = signingDetails; this.installReason = installReason; + this.forceQueryableOverride = forceQueryableOverride; this.mMultiPackageInstallParams = multiPackageInstallParams; } @@ -14759,7 +14768,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(); @@ -14850,7 +14859,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; } diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index e7f6b8982b04..bb69680fb9f9 100644 --- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -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 diff --git a/services/core/java/com/android/server/pm/PackageSettingBase.java b/services/core/java/com/android/server/pm/PackageSettingBase.java index f1ac0afa5dfd..7d95b198d8ce 100644 --- a/services/core/java/com/android/server/pm/PackageSettingBase.java +++ b/services/core/java/com/android/server/pm/PackageSettingBase.java @@ -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) { diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index 5d948b24256a..fcd8e221a9e8 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -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) { |