Loading services/core/java/android/content/pm/PackageManagerInternal.java +6 −0 Original line number Diff line number Diff line Loading @@ -1442,4 +1442,10 @@ public abstract class PackageManagerInternal { * Returns true if the device is upgrading from an SDK version lower than the one specified. */ public abstract boolean isUpgradingFromLowerThan(int sdkVersion); /** * Returns true if the device is upgrading from an SDK version lower than the one specified by * checking a full SDK version (includes major version and minor version) */ public abstract boolean isUpgradingFromLowerThanBySdkVersionFull(int sdkVersionFull); } services/core/java/com/android/server/pm/PackageManagerService.java +25 −2 Original line number Diff line number Diff line Loading @@ -605,6 +605,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService final ProcessLoggingHandler mProcessLoggingHandler; private final int mSdkVersion; private final int mSdkVersionFull; final Context mContext; final boolean mFactoryTest; final DisplayMetrics mMetrics; Loading @@ -615,6 +616,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService private final boolean mIsPreQUpgrade; // If mIsUpgrade == true, contains the prior SDK version, else -1. private final int mPriorSdkVersion; // If mIsUpgrade == true, contains the prior full SDK version, else -1. private final int mPriorSdkVersionFull; // Used for privilege escalation. MUST NOT BE CALLED WITH mPackages // LOCK HELD. Can be called with mInstallLock held. Loading Loading @@ -1756,9 +1759,12 @@ public class PackageManagerService implements PackageSender, TestUtilityService Slog.w(TAG, "**** ro.build.version.sdk not set!"); } final int sdkVersionFull = android.sdk.Flags.majorMinorVersioningScheme() ? Build.VERSION.SDK_INT_FULL : 0; PackageManagerService m = new PackageManagerService(injector, factoryTest, PackagePartitions.FINGERPRINT, Build.IS_ENG, Build.IS_USERDEBUG, Build.VERSION.SDK_INT, Build.VERSION.INCREMENTAL); Build.VERSION.SDK_INT, Build.VERSION.INCREMENTAL, sdkVersionFull); t.traceEnd(); // "create package manager" final CompatChange.ChangeListener selinuxChangeListener = packageName -> { Loading Loading @@ -1901,6 +1907,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService mIsPreNMR1Upgrade = testParams.isPreNmr1Upgrade; mIsPreQUpgrade = testParams.isPreQupgrade; mPriorSdkVersion = testParams.priorSdkVersion; mPriorSdkVersionFull = testParams.priorSdkVersionFull; mIsUpgrade = testParams.isUpgrade; mMetrics = testParams.Metrics; mModuleInfoProvider = testParams.moduleInfoProvider; Loading Loading @@ -1942,6 +1949,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService mPackages.putAll(testParams.packages); mFreeStorageHelper = testParams.freeStorageHelper; mSdkVersion = testParams.sdkVersion; mSdkVersionFull = testParams.sdkVersionFull; mAppInstallDir = testParams.appInstallDir; mIsEngBuild = testParams.isEngBuild; mIsUserDebugBuild = testParams.isUserDebugBuild; Loading Loading @@ -1971,10 +1979,12 @@ public class PackageManagerService implements PackageSender, TestUtilityService public PackageManagerService(PackageManagerServiceInjector injector, boolean factoryTest, final String partitionsFingerprint, final boolean isEngBuild, final boolean isUserDebugBuild, final int sdkVersion, final String incrementalVersion) { final boolean isUserDebugBuild, final int sdkVersion, final String incrementalVersion, final int sdkVersionFull) { mIsEngBuild = isEngBuild; mIsUserDebugBuild = isUserDebugBuild; mSdkVersion = sdkVersion; mSdkVersionFull = sdkVersionFull; mIncrementalVersion = incrementalVersion; mInjector = injector; mInjector.getSystemWrapper().disablePackageCaches(); Loading Loading @@ -2247,6 +2257,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService + PackagePartitions.FINGERPRINT + " (" + Build.FINGERPRINT + ")"); } mPriorSdkVersion = mIsUpgrade ? ver.sdkVersion : -1; mPriorSdkVersionFull = (android.sdk.Flags.majorMinorVersioningScheme() && mIsUpgrade) ? ver.sdkVersionFull : -1; mInitAppsHelper = new InitAppsHelper(this, mApexManager, mInstallPackageHelper, mInjector.getSystemPartitions()); Loading Loading @@ -2375,6 +2387,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService mPermissionManager.onStorageVolumeMounted( StorageManager.UUID_PRIVATE_INTERNAL, mIsUpgrade); ver.sdkVersion = mSdkVersion; ver.sdkVersionFull = mSdkVersionFull; // If this is the first boot or an update from pre-M, then we need to initialize the // default preferred apps across all defined users. Loading Loading @@ -7302,6 +7315,12 @@ public class PackageManagerService implements PackageSender, TestUtilityService final boolean isUpgrading = mPriorSdkVersion != -1; return isUpgrading && mPriorSdkVersion < sdkVersion; } @Override public boolean isUpgradingFromLowerThanBySdkVersionFull(int sdkVersionFull) { final boolean isUpgrading = mPriorSdkVersionFull != -1; return isUpgrading && (mPriorSdkVersionFull < sdkVersionFull); } } private void setEnabledOverlayPackages(@UserIdInt int userId, Loading Loading @@ -7874,6 +7893,10 @@ public class PackageManagerService implements PackageSender, TestUtilityService return mSdkVersion; } int getSdkVersionFull() { return mSdkVersionFull; } void addAllPackageProperties(@NonNull AndroidPackage pkg) { mPackageProperty.addAllProperties(pkg); } Loading services/core/java/com/android/server/pm/PackageManagerServiceTestParams.java +2 −0 Original line number Diff line number Diff line Loading @@ -66,6 +66,7 @@ public final class PackageManagerServiceTestParams { public boolean isPreNmr1Upgrade; public boolean isPreQupgrade; public int priorSdkVersion = -1; public int priorSdkVersionFull = -1; public boolean isUpgrade; public LegacyPermissionManagerInternal legacyPermissionManagerInternal; public DisplayMetrics Metrics; Loading Loading @@ -100,6 +101,7 @@ public final class PackageManagerServiceTestParams { public ComponentName resolveComponentName; public ArrayMap<String, AndroidPackage> packages; public int sdkVersion; public int sdkVersionFull; public File appInstallDir; public File appLib32InstallDir; public boolean isEngBuild; Loading services/core/java/com/android/server/pm/Settings.java +16 −0 Original line number Diff line number Diff line Loading @@ -374,6 +374,7 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile private static final String ATTR_FINGERPRINT = "fingerprint"; private static final String ATTR_VOLUME_UUID = "volumeUuid"; private static final String ATTR_SDK_VERSION = "sdkVersion"; private static final String ATTR_SDK_VERSION_FULL = "sdkVersionFull"; private static final String ATTR_DATABASE_VERSION = "databaseVersion"; private static final String ATTR_VALUE = "value"; private static final String ATTR_FIRST_INSTALL_TIME = "first-install-time"; Loading Loading @@ -454,6 +455,14 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile * Version details for a storage volume that may hold apps. */ public static class VersionInfo { /** * These are the last platform API version we were using for the apps * installed on internal and external storage. It is used to grant newer * permissions one time during a system upgrade. The full SDK version includes a * major version and a minor version. */ int sdkVersionFull; /** * These are the last platform API version we were using for the apps * installed on internal and external storage. It is used to grant newer Loading Loading @@ -484,6 +493,10 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile * typically after resolving any required upgrade steps. */ public void forceCurrent() { if (android.sdk.Flags.majorMinorVersioningScheme()) { sdkVersionFull = Build.VERSION.SDK_INT_FULL; } sdkVersion = Build.VERSION.SDK_INT; databaseVersion = CURRENT_DATABASE_VERSION; buildFingerprint = Build.FINGERPRINT; Loading Loading @@ -2832,6 +2845,7 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile serializer.startTag(null, TAG_VERSION); XmlUtils.writeStringAttribute(serializer, ATTR_VOLUME_UUID, volumeUuid); serializer.attributeInt(null, ATTR_SDK_VERSION, ver.sdkVersion); serializer.attributeInt(null, ATTR_SDK_VERSION_FULL, ver.sdkVersionFull); serializer.attributeInt(null, ATTR_DATABASE_VERSION, ver.databaseVersion); XmlUtils.writeStringAttribute(serializer, ATTR_BUILD_FINGERPRINT, ver.buildFingerprint); Loading Loading @@ -3497,6 +3511,7 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile ATTR_VOLUME_UUID); final VersionInfo ver = findOrCreateVersion(volumeUuid); ver.sdkVersion = parser.getAttributeInt(null, ATTR_SDK_VERSION); ver.sdkVersionFull = parser.getAttributeInt(null, ATTR_SDK_VERSION_FULL); ver.databaseVersion = parser.getAttributeInt(null, ATTR_DATABASE_VERSION); ver.buildFingerprint = XmlUtils.readStringAttribute(parser, ATTR_BUILD_FINGERPRINT); Loading Loading @@ -5046,6 +5061,7 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile } pw.increaseIndent(); pw.printPair("sdkVersion", ver.sdkVersion); pw.printPair("sdkVersionFull", ver.sdkVersionFull); pw.printPair("databaseVersion", ver.databaseVersion); pw.println(); pw.printPair("buildFingerprint", ver.buildFingerprint); Loading services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageManagerSettingsTests.java +73 −17 Original line number Diff line number Diff line Loading @@ -53,11 +53,13 @@ import android.content.pm.SuspendDialogInfo; import android.content.pm.UserInfo; import android.content.pm.UserPackage; import android.os.BaseBundle; import android.os.Build; import android.os.Message; import android.os.PersistableBundle; import android.os.Process; import android.os.UserHandle; import android.platform.test.annotations.Presubmit; import android.platform.test.annotations.RequiresFlagsDisabled; import android.platform.test.annotations.RequiresFlagsEnabled; import android.platform.test.flag.junit.CheckFlagsRule; import android.platform.test.flag.junit.DeviceFlagsValueProvider; Loading @@ -67,9 +69,9 @@ import android.util.ArraySet; import android.util.AtomicFile; import android.util.LongSparseArray; import androidx.test.InstrumentationRegistry; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import androidx.test.platform.app.InstrumentationRegistry; import com.android.internal.pm.parsing.pkg.PackageImpl; import com.android.internal.pm.parsing.pkg.ParsedPackage; Loading Loading @@ -164,7 +166,7 @@ public class PackageManagerSettingsTests { try { // unregister the user manager from the local service LocalServices.removeServiceForTest(UserManagerInternal.class); new UserManagerService(InstrumentationRegistry.getContext()); new UserManagerService(InstrumentationRegistry.getInstrumentation().getContext()); } catch (Exception e) { e.printStackTrace(); fail("Could not create user manager service; " + e); Loading @@ -174,7 +176,7 @@ public class PackageManagerSettingsTests { @After public void tearDown() throws Exception { deleteFolder(InstrumentationRegistry.getContext().getFilesDir()); deleteFolder(InstrumentationRegistry.getInstrumentation().getContext().getFilesDir()); } @Test Loading Loading @@ -337,7 +339,7 @@ public class PackageManagerSettingsTests { // write out settings.writeLPr(computer, /*sync=*/true); File filesDir = InstrumentationRegistry.getContext().getFilesDir(); File filesDir = InstrumentationRegistry.getInstrumentation().getContext().getFilesDir(); File packageXml = new File(filesDir, "system/packages.xml"); File packagesReserveCopyXml = new File(filesDir, "system/packages.xml.reservecopy"); // Primary. Loading Loading @@ -677,6 +679,49 @@ public class PackageManagerSettingsTests { assertThat(readPus3.getDistractionFlags(), is(distractionFlags3)); } @Test public void testReadWriteSettingsVersionCodeWithSdkVersionFull() { final Settings settingsUnderTest = makeSettings(); final String uuid = UUID.randomUUID().toString(); final int sdkVersionFull = 100000; final int sdkVersion = 40; Settings.VersionInfo versionInfo = settingsUnderTest.findOrCreateVersion(uuid); versionInfo.sdkVersionFull = sdkVersionFull; versionInfo.sdkVersion = sdkVersion; settingsUnderTest.writeLPr(computer, /*sync=*/ true); settingsUnderTest.onVolumeForgotten(uuid); assertThat(settingsUnderTest.readLPw(computer, createFakeUsers()), is(true)); Settings.VersionInfo readVersionInfo = settingsUnderTest.findOrCreateVersion(uuid); assertThat(readVersionInfo.sdkVersionFull, is(sdkVersionFull)); assertThat(readVersionInfo.sdkVersion, is(sdkVersion)); } @RequiresFlagsDisabled(android.sdk.Flags.FLAG_MAJOR_MINOR_VERSIONING_SCHEME) @Test public void testSettingsGetInternalVersionNoSdkVersionFull() { final Settings settingsUnderTest = makeSettings(); settingsUnderTest.writeLPr(computer, /*sync=*/ true); assertThat(settingsUnderTest.readLPw(computer, createFakeUsers()), is(true)); assertThat(settingsUnderTest.getInternalVersion().sdkVersionFull, is(0)); assertThat(settingsUnderTest.getInternalVersion().sdkVersion, is(Build.VERSION.SDK_INT)); } @RequiresFlagsEnabled(android.sdk.Flags.FLAG_MAJOR_MINOR_VERSIONING_SCHEME) @Test public void testSettingsGetInternalVersionWithSdkVersionFull() { final Settings settingsUnderTest = makeSettings(); settingsUnderTest.writeLPr(computer, /*sync=*/ true); assertThat(settingsUnderTest.readLPw(computer, createFakeUsers()), is(true)); assertThat(settingsUnderTest.getInternalVersion().sdkVersionFull, is(Build.VERSION.SDK_INT_FULL)); assertThat(settingsUnderTest.getInternalVersion().sdkVersion, is(Build.VERSION.SDK_INT)); } @Test public void testReadWritePackageRestrictions_distractionFlags() { final Settings settingsUnderTest = makeSettings(); Loading Loading @@ -1382,11 +1427,14 @@ public class PackageManagerSettingsTests { private static final String PACKAGE_NAME = "com.android.bar"; private static final String REAL_PACKAGE_NAME = "com.android.foo"; private static final File INITIAL_CODE_PATH = new File(InstrumentationRegistry.getContext().getFilesDir(), "com.android.bar-1"); new File(InstrumentationRegistry.getInstrumentation().getContext().getFilesDir(), "com.android.bar-1"); private static final File UPDATED_CODE_PATH = new File(InstrumentationRegistry.getContext().getFilesDir(), "com.android.bar-2"); new File(InstrumentationRegistry.getInstrumentation().getContext().getFilesDir(), "com.android.bar-2"); private static final File UPDATED_CODE_PATH2 = new File(InstrumentationRegistry.getContext().getFilesDir(), "com.android.bar-3"); new File(InstrumentationRegistry.getInstrumentation().getContext().getFilesDir(), "com.android.bar-3"); private static final long INITIAL_VERSION_CODE = 10023L; private static final long UPDATED_VERSION_CODE = 10025L; Loading Loading @@ -2292,7 +2340,8 @@ public class PackageManagerSettingsTests { } private void writeCorruptedPackagesXml() { writeFile(new File(InstrumentationRegistry.getContext().getFilesDir(), "system/packages.xml"), writeFile(new File(InstrumentationRegistry.getInstrumentation().getContext().getFilesDir(), "system/packages.xml"), ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>" + "<packages>" + "<last-platform-version internal=\"15\" external=\"0\" />" Loading @@ -2302,7 +2351,8 @@ public class PackageManagerSettingsTests { } static void writePackagesXml(String fileName) { writeFile(new File(InstrumentationRegistry.getContext().getFilesDir(), fileName), writeFile(new File(InstrumentationRegistry.getInstrumentation().getContext().getFilesDir(), fileName), ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>" + "<packages>" + "<last-platform-version internal=\"15\" external=\"0\" fingerprint=\"foo\" />" Loading Loading @@ -2371,7 +2421,8 @@ public class PackageManagerSettingsTests { } private void writePackageRestrictions_noSuspendingPackageXml(final int userId) { writeFile(new File(InstrumentationRegistry.getContext().getFilesDir(), "system/users/" writeFile(new File(InstrumentationRegistry.getInstrumentation().getContext().getFilesDir(), "system/users/" + userId + "/package-restrictions.xml"), ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n" + "<package-restrictions>\n" Loading @@ -2386,7 +2437,8 @@ public class PackageManagerSettingsTests { } private void writePackageRestrictions_noSuspendParamsMapXml(final int userId) { writeFile(new File(InstrumentationRegistry.getContext().getFilesDir(), "system/users/" writeFile(new File(InstrumentationRegistry.getInstrumentation().getContext().getFilesDir(), "system/users/" + userId + "/package-restrictions.xml"), ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n" + "<package-restrictions>\n" Loading @@ -2410,7 +2462,8 @@ public class PackageManagerSettingsTests { } private void writeCorruptedPackageRestrictions(final int userId) { writeFile(new File(InstrumentationRegistry.getContext().getFilesDir(), "system/users/" writeFile(new File(InstrumentationRegistry.getInstrumentation().getContext().getFilesDir(), "system/users/" + userId + "/package-restrictions.xml"), ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n" + "<package-restrictions>\n" Loading @@ -2418,7 +2471,8 @@ public class PackageManagerSettingsTests { } private static void writeStoppedPackagesXml() { writeFile(new File(InstrumentationRegistry.getContext().getFilesDir(), "system/packages-stopped.xml"), writeFile(new File(InstrumentationRegistry.getInstrumentation().getContext().getFilesDir(), "system/packages-stopped.xml"), ( "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>" + "<stopped-packages>" + "<pkg name=\"com.android.app1\" nl=\"1\" />" Loading @@ -2428,7 +2482,8 @@ public class PackageManagerSettingsTests { } private static void writePackagesList() { writeFile(new File(InstrumentationRegistry.getContext().getFilesDir(), "system/packages.list"), writeFile(new File(InstrumentationRegistry.getInstrumentation().getContext().getFilesDir(), "system/packages.list"), ( "com.android.app1 11000 0 /data/data/com.android.app1 seinfo1" + "com.android.app2 11001 0 /data/data/com.android.app2 seinfo2" + "com.android.app3 11030 0 /data/data/com.android.app3 seinfo3") Loading @@ -2436,7 +2491,8 @@ public class PackageManagerSettingsTests { } private static void deleteSystemFolder() { File systemFolder = new File(InstrumentationRegistry.getContext().getFilesDir(), "system"); File systemFolder = new File( InstrumentationRegistry.getInstrumentation().getContext().getFilesDir(), "system"); deleteFolder(systemFolder); } Loading Loading @@ -2465,7 +2521,7 @@ public class PackageManagerSettingsTests { } private Settings makeSettings() { return new Settings(InstrumentationRegistry.getContext().getFilesDir(), return new Settings(InstrumentationRegistry.getInstrumentation().getContext().getFilesDir(), mRuntimePermissionsPersistence, mPermissionDataProvider, mDomainVerificationManager, mHandler, new PackageManagerTracedLock()); Loading Loading
services/core/java/android/content/pm/PackageManagerInternal.java +6 −0 Original line number Diff line number Diff line Loading @@ -1442,4 +1442,10 @@ public abstract class PackageManagerInternal { * Returns true if the device is upgrading from an SDK version lower than the one specified. */ public abstract boolean isUpgradingFromLowerThan(int sdkVersion); /** * Returns true if the device is upgrading from an SDK version lower than the one specified by * checking a full SDK version (includes major version and minor version) */ public abstract boolean isUpgradingFromLowerThanBySdkVersionFull(int sdkVersionFull); }
services/core/java/com/android/server/pm/PackageManagerService.java +25 −2 Original line number Diff line number Diff line Loading @@ -605,6 +605,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService final ProcessLoggingHandler mProcessLoggingHandler; private final int mSdkVersion; private final int mSdkVersionFull; final Context mContext; final boolean mFactoryTest; final DisplayMetrics mMetrics; Loading @@ -615,6 +616,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService private final boolean mIsPreQUpgrade; // If mIsUpgrade == true, contains the prior SDK version, else -1. private final int mPriorSdkVersion; // If mIsUpgrade == true, contains the prior full SDK version, else -1. private final int mPriorSdkVersionFull; // Used for privilege escalation. MUST NOT BE CALLED WITH mPackages // LOCK HELD. Can be called with mInstallLock held. Loading Loading @@ -1756,9 +1759,12 @@ public class PackageManagerService implements PackageSender, TestUtilityService Slog.w(TAG, "**** ro.build.version.sdk not set!"); } final int sdkVersionFull = android.sdk.Flags.majorMinorVersioningScheme() ? Build.VERSION.SDK_INT_FULL : 0; PackageManagerService m = new PackageManagerService(injector, factoryTest, PackagePartitions.FINGERPRINT, Build.IS_ENG, Build.IS_USERDEBUG, Build.VERSION.SDK_INT, Build.VERSION.INCREMENTAL); Build.VERSION.SDK_INT, Build.VERSION.INCREMENTAL, sdkVersionFull); t.traceEnd(); // "create package manager" final CompatChange.ChangeListener selinuxChangeListener = packageName -> { Loading Loading @@ -1901,6 +1907,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService mIsPreNMR1Upgrade = testParams.isPreNmr1Upgrade; mIsPreQUpgrade = testParams.isPreQupgrade; mPriorSdkVersion = testParams.priorSdkVersion; mPriorSdkVersionFull = testParams.priorSdkVersionFull; mIsUpgrade = testParams.isUpgrade; mMetrics = testParams.Metrics; mModuleInfoProvider = testParams.moduleInfoProvider; Loading Loading @@ -1942,6 +1949,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService mPackages.putAll(testParams.packages); mFreeStorageHelper = testParams.freeStorageHelper; mSdkVersion = testParams.sdkVersion; mSdkVersionFull = testParams.sdkVersionFull; mAppInstallDir = testParams.appInstallDir; mIsEngBuild = testParams.isEngBuild; mIsUserDebugBuild = testParams.isUserDebugBuild; Loading Loading @@ -1971,10 +1979,12 @@ public class PackageManagerService implements PackageSender, TestUtilityService public PackageManagerService(PackageManagerServiceInjector injector, boolean factoryTest, final String partitionsFingerprint, final boolean isEngBuild, final boolean isUserDebugBuild, final int sdkVersion, final String incrementalVersion) { final boolean isUserDebugBuild, final int sdkVersion, final String incrementalVersion, final int sdkVersionFull) { mIsEngBuild = isEngBuild; mIsUserDebugBuild = isUserDebugBuild; mSdkVersion = sdkVersion; mSdkVersionFull = sdkVersionFull; mIncrementalVersion = incrementalVersion; mInjector = injector; mInjector.getSystemWrapper().disablePackageCaches(); Loading Loading @@ -2247,6 +2257,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService + PackagePartitions.FINGERPRINT + " (" + Build.FINGERPRINT + ")"); } mPriorSdkVersion = mIsUpgrade ? ver.sdkVersion : -1; mPriorSdkVersionFull = (android.sdk.Flags.majorMinorVersioningScheme() && mIsUpgrade) ? ver.sdkVersionFull : -1; mInitAppsHelper = new InitAppsHelper(this, mApexManager, mInstallPackageHelper, mInjector.getSystemPartitions()); Loading Loading @@ -2375,6 +2387,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService mPermissionManager.onStorageVolumeMounted( StorageManager.UUID_PRIVATE_INTERNAL, mIsUpgrade); ver.sdkVersion = mSdkVersion; ver.sdkVersionFull = mSdkVersionFull; // If this is the first boot or an update from pre-M, then we need to initialize the // default preferred apps across all defined users. Loading Loading @@ -7302,6 +7315,12 @@ public class PackageManagerService implements PackageSender, TestUtilityService final boolean isUpgrading = mPriorSdkVersion != -1; return isUpgrading && mPriorSdkVersion < sdkVersion; } @Override public boolean isUpgradingFromLowerThanBySdkVersionFull(int sdkVersionFull) { final boolean isUpgrading = mPriorSdkVersionFull != -1; return isUpgrading && (mPriorSdkVersionFull < sdkVersionFull); } } private void setEnabledOverlayPackages(@UserIdInt int userId, Loading Loading @@ -7874,6 +7893,10 @@ public class PackageManagerService implements PackageSender, TestUtilityService return mSdkVersion; } int getSdkVersionFull() { return mSdkVersionFull; } void addAllPackageProperties(@NonNull AndroidPackage pkg) { mPackageProperty.addAllProperties(pkg); } Loading
services/core/java/com/android/server/pm/PackageManagerServiceTestParams.java +2 −0 Original line number Diff line number Diff line Loading @@ -66,6 +66,7 @@ public final class PackageManagerServiceTestParams { public boolean isPreNmr1Upgrade; public boolean isPreQupgrade; public int priorSdkVersion = -1; public int priorSdkVersionFull = -1; public boolean isUpgrade; public LegacyPermissionManagerInternal legacyPermissionManagerInternal; public DisplayMetrics Metrics; Loading Loading @@ -100,6 +101,7 @@ public final class PackageManagerServiceTestParams { public ComponentName resolveComponentName; public ArrayMap<String, AndroidPackage> packages; public int sdkVersion; public int sdkVersionFull; public File appInstallDir; public File appLib32InstallDir; public boolean isEngBuild; Loading
services/core/java/com/android/server/pm/Settings.java +16 −0 Original line number Diff line number Diff line Loading @@ -374,6 +374,7 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile private static final String ATTR_FINGERPRINT = "fingerprint"; private static final String ATTR_VOLUME_UUID = "volumeUuid"; private static final String ATTR_SDK_VERSION = "sdkVersion"; private static final String ATTR_SDK_VERSION_FULL = "sdkVersionFull"; private static final String ATTR_DATABASE_VERSION = "databaseVersion"; private static final String ATTR_VALUE = "value"; private static final String ATTR_FIRST_INSTALL_TIME = "first-install-time"; Loading Loading @@ -454,6 +455,14 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile * Version details for a storage volume that may hold apps. */ public static class VersionInfo { /** * These are the last platform API version we were using for the apps * installed on internal and external storage. It is used to grant newer * permissions one time during a system upgrade. The full SDK version includes a * major version and a minor version. */ int sdkVersionFull; /** * These are the last platform API version we were using for the apps * installed on internal and external storage. It is used to grant newer Loading Loading @@ -484,6 +493,10 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile * typically after resolving any required upgrade steps. */ public void forceCurrent() { if (android.sdk.Flags.majorMinorVersioningScheme()) { sdkVersionFull = Build.VERSION.SDK_INT_FULL; } sdkVersion = Build.VERSION.SDK_INT; databaseVersion = CURRENT_DATABASE_VERSION; buildFingerprint = Build.FINGERPRINT; Loading Loading @@ -2832,6 +2845,7 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile serializer.startTag(null, TAG_VERSION); XmlUtils.writeStringAttribute(serializer, ATTR_VOLUME_UUID, volumeUuid); serializer.attributeInt(null, ATTR_SDK_VERSION, ver.sdkVersion); serializer.attributeInt(null, ATTR_SDK_VERSION_FULL, ver.sdkVersionFull); serializer.attributeInt(null, ATTR_DATABASE_VERSION, ver.databaseVersion); XmlUtils.writeStringAttribute(serializer, ATTR_BUILD_FINGERPRINT, ver.buildFingerprint); Loading Loading @@ -3497,6 +3511,7 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile ATTR_VOLUME_UUID); final VersionInfo ver = findOrCreateVersion(volumeUuid); ver.sdkVersion = parser.getAttributeInt(null, ATTR_SDK_VERSION); ver.sdkVersionFull = parser.getAttributeInt(null, ATTR_SDK_VERSION_FULL); ver.databaseVersion = parser.getAttributeInt(null, ATTR_DATABASE_VERSION); ver.buildFingerprint = XmlUtils.readStringAttribute(parser, ATTR_BUILD_FINGERPRINT); Loading Loading @@ -5046,6 +5061,7 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile } pw.increaseIndent(); pw.printPair("sdkVersion", ver.sdkVersion); pw.printPair("sdkVersionFull", ver.sdkVersionFull); pw.printPair("databaseVersion", ver.databaseVersion); pw.println(); pw.printPair("buildFingerprint", ver.buildFingerprint); Loading
services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageManagerSettingsTests.java +73 −17 Original line number Diff line number Diff line Loading @@ -53,11 +53,13 @@ import android.content.pm.SuspendDialogInfo; import android.content.pm.UserInfo; import android.content.pm.UserPackage; import android.os.BaseBundle; import android.os.Build; import android.os.Message; import android.os.PersistableBundle; import android.os.Process; import android.os.UserHandle; import android.platform.test.annotations.Presubmit; import android.platform.test.annotations.RequiresFlagsDisabled; import android.platform.test.annotations.RequiresFlagsEnabled; import android.platform.test.flag.junit.CheckFlagsRule; import android.platform.test.flag.junit.DeviceFlagsValueProvider; Loading @@ -67,9 +69,9 @@ import android.util.ArraySet; import android.util.AtomicFile; import android.util.LongSparseArray; import androidx.test.InstrumentationRegistry; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import androidx.test.platform.app.InstrumentationRegistry; import com.android.internal.pm.parsing.pkg.PackageImpl; import com.android.internal.pm.parsing.pkg.ParsedPackage; Loading Loading @@ -164,7 +166,7 @@ public class PackageManagerSettingsTests { try { // unregister the user manager from the local service LocalServices.removeServiceForTest(UserManagerInternal.class); new UserManagerService(InstrumentationRegistry.getContext()); new UserManagerService(InstrumentationRegistry.getInstrumentation().getContext()); } catch (Exception e) { e.printStackTrace(); fail("Could not create user manager service; " + e); Loading @@ -174,7 +176,7 @@ public class PackageManagerSettingsTests { @After public void tearDown() throws Exception { deleteFolder(InstrumentationRegistry.getContext().getFilesDir()); deleteFolder(InstrumentationRegistry.getInstrumentation().getContext().getFilesDir()); } @Test Loading Loading @@ -337,7 +339,7 @@ public class PackageManagerSettingsTests { // write out settings.writeLPr(computer, /*sync=*/true); File filesDir = InstrumentationRegistry.getContext().getFilesDir(); File filesDir = InstrumentationRegistry.getInstrumentation().getContext().getFilesDir(); File packageXml = new File(filesDir, "system/packages.xml"); File packagesReserveCopyXml = new File(filesDir, "system/packages.xml.reservecopy"); // Primary. Loading Loading @@ -677,6 +679,49 @@ public class PackageManagerSettingsTests { assertThat(readPus3.getDistractionFlags(), is(distractionFlags3)); } @Test public void testReadWriteSettingsVersionCodeWithSdkVersionFull() { final Settings settingsUnderTest = makeSettings(); final String uuid = UUID.randomUUID().toString(); final int sdkVersionFull = 100000; final int sdkVersion = 40; Settings.VersionInfo versionInfo = settingsUnderTest.findOrCreateVersion(uuid); versionInfo.sdkVersionFull = sdkVersionFull; versionInfo.sdkVersion = sdkVersion; settingsUnderTest.writeLPr(computer, /*sync=*/ true); settingsUnderTest.onVolumeForgotten(uuid); assertThat(settingsUnderTest.readLPw(computer, createFakeUsers()), is(true)); Settings.VersionInfo readVersionInfo = settingsUnderTest.findOrCreateVersion(uuid); assertThat(readVersionInfo.sdkVersionFull, is(sdkVersionFull)); assertThat(readVersionInfo.sdkVersion, is(sdkVersion)); } @RequiresFlagsDisabled(android.sdk.Flags.FLAG_MAJOR_MINOR_VERSIONING_SCHEME) @Test public void testSettingsGetInternalVersionNoSdkVersionFull() { final Settings settingsUnderTest = makeSettings(); settingsUnderTest.writeLPr(computer, /*sync=*/ true); assertThat(settingsUnderTest.readLPw(computer, createFakeUsers()), is(true)); assertThat(settingsUnderTest.getInternalVersion().sdkVersionFull, is(0)); assertThat(settingsUnderTest.getInternalVersion().sdkVersion, is(Build.VERSION.SDK_INT)); } @RequiresFlagsEnabled(android.sdk.Flags.FLAG_MAJOR_MINOR_VERSIONING_SCHEME) @Test public void testSettingsGetInternalVersionWithSdkVersionFull() { final Settings settingsUnderTest = makeSettings(); settingsUnderTest.writeLPr(computer, /*sync=*/ true); assertThat(settingsUnderTest.readLPw(computer, createFakeUsers()), is(true)); assertThat(settingsUnderTest.getInternalVersion().sdkVersionFull, is(Build.VERSION.SDK_INT_FULL)); assertThat(settingsUnderTest.getInternalVersion().sdkVersion, is(Build.VERSION.SDK_INT)); } @Test public void testReadWritePackageRestrictions_distractionFlags() { final Settings settingsUnderTest = makeSettings(); Loading Loading @@ -1382,11 +1427,14 @@ public class PackageManagerSettingsTests { private static final String PACKAGE_NAME = "com.android.bar"; private static final String REAL_PACKAGE_NAME = "com.android.foo"; private static final File INITIAL_CODE_PATH = new File(InstrumentationRegistry.getContext().getFilesDir(), "com.android.bar-1"); new File(InstrumentationRegistry.getInstrumentation().getContext().getFilesDir(), "com.android.bar-1"); private static final File UPDATED_CODE_PATH = new File(InstrumentationRegistry.getContext().getFilesDir(), "com.android.bar-2"); new File(InstrumentationRegistry.getInstrumentation().getContext().getFilesDir(), "com.android.bar-2"); private static final File UPDATED_CODE_PATH2 = new File(InstrumentationRegistry.getContext().getFilesDir(), "com.android.bar-3"); new File(InstrumentationRegistry.getInstrumentation().getContext().getFilesDir(), "com.android.bar-3"); private static final long INITIAL_VERSION_CODE = 10023L; private static final long UPDATED_VERSION_CODE = 10025L; Loading Loading @@ -2292,7 +2340,8 @@ public class PackageManagerSettingsTests { } private void writeCorruptedPackagesXml() { writeFile(new File(InstrumentationRegistry.getContext().getFilesDir(), "system/packages.xml"), writeFile(new File(InstrumentationRegistry.getInstrumentation().getContext().getFilesDir(), "system/packages.xml"), ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>" + "<packages>" + "<last-platform-version internal=\"15\" external=\"0\" />" Loading @@ -2302,7 +2351,8 @@ public class PackageManagerSettingsTests { } static void writePackagesXml(String fileName) { writeFile(new File(InstrumentationRegistry.getContext().getFilesDir(), fileName), writeFile(new File(InstrumentationRegistry.getInstrumentation().getContext().getFilesDir(), fileName), ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>" + "<packages>" + "<last-platform-version internal=\"15\" external=\"0\" fingerprint=\"foo\" />" Loading Loading @@ -2371,7 +2421,8 @@ public class PackageManagerSettingsTests { } private void writePackageRestrictions_noSuspendingPackageXml(final int userId) { writeFile(new File(InstrumentationRegistry.getContext().getFilesDir(), "system/users/" writeFile(new File(InstrumentationRegistry.getInstrumentation().getContext().getFilesDir(), "system/users/" + userId + "/package-restrictions.xml"), ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n" + "<package-restrictions>\n" Loading @@ -2386,7 +2437,8 @@ public class PackageManagerSettingsTests { } private void writePackageRestrictions_noSuspendParamsMapXml(final int userId) { writeFile(new File(InstrumentationRegistry.getContext().getFilesDir(), "system/users/" writeFile(new File(InstrumentationRegistry.getInstrumentation().getContext().getFilesDir(), "system/users/" + userId + "/package-restrictions.xml"), ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n" + "<package-restrictions>\n" Loading @@ -2410,7 +2462,8 @@ public class PackageManagerSettingsTests { } private void writeCorruptedPackageRestrictions(final int userId) { writeFile(new File(InstrumentationRegistry.getContext().getFilesDir(), "system/users/" writeFile(new File(InstrumentationRegistry.getInstrumentation().getContext().getFilesDir(), "system/users/" + userId + "/package-restrictions.xml"), ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n" + "<package-restrictions>\n" Loading @@ -2418,7 +2471,8 @@ public class PackageManagerSettingsTests { } private static void writeStoppedPackagesXml() { writeFile(new File(InstrumentationRegistry.getContext().getFilesDir(), "system/packages-stopped.xml"), writeFile(new File(InstrumentationRegistry.getInstrumentation().getContext().getFilesDir(), "system/packages-stopped.xml"), ( "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>" + "<stopped-packages>" + "<pkg name=\"com.android.app1\" nl=\"1\" />" Loading @@ -2428,7 +2482,8 @@ public class PackageManagerSettingsTests { } private static void writePackagesList() { writeFile(new File(InstrumentationRegistry.getContext().getFilesDir(), "system/packages.list"), writeFile(new File(InstrumentationRegistry.getInstrumentation().getContext().getFilesDir(), "system/packages.list"), ( "com.android.app1 11000 0 /data/data/com.android.app1 seinfo1" + "com.android.app2 11001 0 /data/data/com.android.app2 seinfo2" + "com.android.app3 11030 0 /data/data/com.android.app3 seinfo3") Loading @@ -2436,7 +2491,8 @@ public class PackageManagerSettingsTests { } private static void deleteSystemFolder() { File systemFolder = new File(InstrumentationRegistry.getContext().getFilesDir(), "system"); File systemFolder = new File( InstrumentationRegistry.getInstrumentation().getContext().getFilesDir(), "system"); deleteFolder(systemFolder); } Loading Loading @@ -2465,7 +2521,7 @@ public class PackageManagerSettingsTests { } private Settings makeSettings() { return new Settings(InstrumentationRegistry.getContext().getFilesDir(), return new Settings(InstrumentationRegistry.getInstrumentation().getContext().getFilesDir(), mRuntimePermissionsPersistence, mPermissionDataProvider, mDomainVerificationManager, mHandler, new PackageManagerTracedLock()); Loading