Merge "Always parse sharedUserId and sharedUserLabel" into tm-dev

This commit is contained in:
John Wu
2022-02-22 21:01:45 +00:00
committed by Android (Google) Code Review
6 changed files with 40 additions and 19 deletions

View File

@@ -183,7 +183,6 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.ExecutorService;
@@ -1596,18 +1595,16 @@ final class InstallPackageHelper {
parsedPackage.setRestrictUpdateHash(oldPackage.getRestrictUpdateHash());
}
// Check for shared user id changes
if (!Objects.equals(oldPackage.getSharedUserId(),
parsedPackage.getSharedUserId())
// Don't mark as invalid if the app is trying to
// leave a sharedUserId
&& parsedPackage.getSharedUserId() != null) {
// APK should not change its sharedUserId declarations
final var oldSharedUid = oldPackage.getSharedUserId() != null
? oldPackage.getSharedUserId() : "<nothing>";
final var newSharedUid = parsedPackage.getSharedUserId() != null
? parsedPackage.getSharedUserId() : "<nothing>";
if (!oldSharedUid.equals(newSharedUid)) {
throw new PrepareFailure(INSTALL_FAILED_UID_CHANGED,
"Package " + parsedPackage.getPackageName()
+ " shared user changed from "
+ (oldPackage.getSharedUserId() != null
? oldPackage.getSharedUserId() : "<nothing>")
+ " to " + parsedPackage.getSharedUserId());
+ oldSharedUid + " to " + newSharedUid);
}
// In case of rollback, remember per-user/profile install state
@@ -3696,10 +3693,13 @@ final class InstallPackageHelper {
}
disabledPkgSetting = mPm.mSettings.getDisabledSystemPkgLPr(
parsedPackage.getPackageName());
sharedUserSetting = (parsedPackage.getSharedUserId() != null)
? mPm.mSettings.getSharedUserLPw(parsedPackage.getSharedUserId(),
0 /*pkgFlags*/, 0 /*pkgPrivateFlags*/, true)
: null;
if (parsedPackage.getSharedUserId() != null && !parsedPackage.isLeavingSharedUid()) {
sharedUserSetting = mPm.mSettings.getSharedUserLPw(
parsedPackage.getSharedUserId(),
0 /*pkgFlags*/, 0 /*pkgPrivateFlags*/, true /*create*/);
} else {
sharedUserSetting = null;
}
if (DEBUG_PACKAGE_SCANNING
&& (parseFlags & ParsingPackageUtils.PARSE_CHATTY) != 0
&& sharedUserSetting != null) {

View File

@@ -290,6 +290,9 @@ public interface ParsingPackage extends ParsingPackageRead {
/** @see R#styleable.AndroidManifest_inheritKeyStoreKeys */
ParsingPackage setInheritKeyStoreKeys(boolean inheritKeyStoreKeys);
/** @see R#styleable.AndroidManifest_sharedUserMaxSdkVersion */
ParsingPackage setLeavingSharedUid(boolean leavingSharedUid);
ParsingPackage setLabelRes(int labelRes);
ParsingPackage setLargestWidthLimitDp(int largestWidthLimitDp);

View File

@@ -549,6 +549,7 @@ public class ParsingPackageImpl implements ParsingPackage, ParsingPackageHidden,
private static final long SDK_LIBRARY = 1L << 49;
private static final long INHERIT_KEYSTORE_KEYS = 1L << 50;
private static final long ENABLE_ON_BACK_INVOKED_CALLBACK = 1L << 51;
private static final long LEAVING_SHARED_UID = 1L << 52;
}
private ParsingPackageImpl setBoolean(@Booleans.Values long flag, boolean value) {
@@ -2402,6 +2403,11 @@ public class ParsingPackageImpl implements ParsingPackage, ParsingPackageHidden,
return getBoolean(Booleans.ENABLE_ON_BACK_INVOKED_CALLBACK);
}
@Override
public boolean isLeavingSharedUid() {
return getBoolean(Booleans.LEAVING_SHARED_UID);
}
@Override
public ParsingPackageImpl setBaseRevisionCode(int value) {
baseRevisionCode = value;
@@ -2550,6 +2556,11 @@ public class ParsingPackageImpl implements ParsingPackage, ParsingPackageHidden,
return setBoolean(Booleans.INHERIT_KEYSTORE_KEYS, value);
}
@Override
public ParsingPackageImpl setLeavingSharedUid(boolean value) {
return setBoolean(Booleans.LEAVING_SHARED_UID, value);
}
@Override
public ParsingPackageImpl setLabelRes(int value) {
labelRes = value;

View File

@@ -360,4 +360,11 @@ public interface ParsingPackageRead extends PkgWithoutStateAppInfo, PkgWithoutSt
* @see R.styleable.AndroidManifestApplication_enableOnBackInvokedCallback
*/
boolean isOnBackInvokedCallbackEnabled();
/**
* Returns true if R.styleable#AndroidManifest_sharedUserMaxSdkVersion is set to a value
* smaller than the current SDK version.
* @see R.styleable#AndroidManifest_sharedUserMaxSdkVersion
*/
boolean isLeavingSharedUid();
}

View File

@@ -1032,11 +1032,6 @@ public class ParsingPackageUtils {
private static ParseResult<ParsingPackage> parseSharedUser(ParseInput input,
ParsingPackage pkg, TypedArray sa) {
int maxSdkVersion = anInteger(0, R.styleable.AndroidManifest_sharedUserMaxSdkVersion, sa);
if ((maxSdkVersion != 0) && maxSdkVersion < Build.VERSION.RESOURCES_SDK_INT) {
return input.success(pkg);
}
String str = nonConfigString(0, R.styleable.AndroidManifest_sharedUserId, sa);
if (TextUtils.isEmpty(str)) {
return input.success(pkg);
@@ -1052,7 +1047,11 @@ public class ParsingPackageUtils {
}
}
int maxSdkVersion = anInteger(0, R.styleable.AndroidManifest_sharedUserMaxSdkVersion, sa);
boolean leaving = (maxSdkVersion != 0) && (maxSdkVersion < Build.VERSION.RESOURCES_SDK_INT);
return input.success(pkg
.setLeavingSharedUid(leaving)
.setSharedUserId(str.intern())
.setSharedUserLabel(resId(R.styleable.AndroidManifest_sharedUserLabel, sa)));
}

View File

@@ -238,6 +238,7 @@ class AndroidPackageTest : ParcelableComponentTest(AndroidPackage::class, Packag
AndroidPackage::isVendor,
AndroidPackage::isVisibleToInstantApps,
AndroidPackage::isVmSafeMode,
AndroidPackage::isLeavingSharedUid,
AndroidPackage::isResetEnabledSettingsOnAppDataCleared,
AndroidPackage::getMaxAspectRatio,
AndroidPackage::getMinAspectRatio,