Loading services/core/java/com/android/server/pm/PackageManagerService.java +29 −0 Original line number Diff line number Diff line Loading @@ -1532,6 +1532,9 @@ public class PackageManagerService extends IPackageManager.Stub { mSettings.readDefaultPreferredAppsLPw(this, 0); } // All the changes are done during package scanning. mSettings.updateInternalDatabaseVersion(); // can downgrade to reader mSettings.writeLPr(); Loading Loading @@ -11074,6 +11077,8 @@ public class PackageManagerService extends IPackageManager.Stub { public static final int DUMP_KEYSETS = 1 << 11; public static final int DUMP_VERSION = 1 << 12; public static final int OPTION_SHOW_FILTERS = 1 << 0; private int mTypes; Loading Loading @@ -11172,6 +11177,7 @@ public class PackageManagerService extends IPackageManager.Stub { pw.println(" s[hared-users]: dump shared user IDs"); pw.println(" m[essages]: print collected runtime messages"); pw.println(" v[erifiers]: print package verifier info"); pw.println(" version: print database version info"); pw.println(" <package.name>: info about given package"); pw.println(" k[eysets]: print known keysets"); return; Loading Loading @@ -11220,6 +11226,8 @@ public class PackageManagerService extends IPackageManager.Stub { dumpState.setDump(DumpState.DUMP_MESSAGES); } else if ("v".equals(cmd) || "verifiers".equals(cmd)) { dumpState.setDump(DumpState.DUMP_VERIFIERS); } else if ("version".equals(cmd)) { dumpState.setDump(DumpState.DUMP_VERSION); } else if ("k".equals(cmd) || "keysets".equals(cmd)) { dumpState.setDump(DumpState.DUMP_KEYSETS); } Loading @@ -11231,6 +11239,24 @@ public class PackageManagerService extends IPackageManager.Stub { // reader synchronized (mPackages) { if (dumpState.isDumping(DumpState.DUMP_VERSION) && packageName == null) { if (!checkin) { if (dumpState.onTitlePrinted()) pw.println(); pw.println("Database versions:"); pw.print(" SDK Version:"); pw.print(" internal="); pw.print(mSettings.mInternalSdkPlatform); pw.print(" external="); pw.println(mSettings.mExternalSdkPlatform); pw.print(" DB Version:"); pw.print(" internal="); pw.print(mSettings.mInternalDatabaseVersion); pw.print(" external="); pw.println(mSettings.mExternalDatabaseVersion); } } if (dumpState.isDumping(DumpState.DUMP_VERIFIERS) && packageName == null) { if (!checkin) { if (dumpState.onTitlePrinted()) Loading Loading @@ -11761,6 +11787,9 @@ public class PackageManagerService extends IPackageManager.Stub { | (regrantPermissions ? (UPDATE_PERMISSIONS_REPLACE_PKG|UPDATE_PERMISSIONS_REPLACE_ALL) : 0)); mSettings.updateExternalDatabaseVersion(); // can downgrade to reader // Persist settings mSettings.writeLPr(); Loading services/core/java/com/android/server/pm/Settings.java +82 −0 Original line number Diff line number Diff line Loading @@ -89,6 +89,28 @@ import libcore.io.IoUtils; final class Settings { private static final String TAG = "PackageSettings"; /** * Current version of the package database. Set it to the latest version in * the {@link DatabaseVersion} class below to ensure the database upgrade * doesn't happen repeatedly. * <p> * Note that care should be taken to make sure all database upgrades are * idempotent. */ private static final int CURRENT_DATABASE_VERSION = DatabaseVersion.FIRST_VERSION; /** * This class contains constants that can be referred to from upgrade code. * Insert constant values here that describe the upgrade reason. The version * code must be monotonically increasing. */ public static class DatabaseVersion { /** * The initial version of the database. */ public static final int FIRST_VERSION = 1; } private static final boolean DEBUG_STOPPED = false; private static final boolean DEBUG_MU = false; Loading Loading @@ -133,6 +155,14 @@ final class Settings { int mInternalSdkPlatform; int mExternalSdkPlatform; /** * The current database version for apps on internal storage. This is * used to upgrade the format of the packages.xml database not necessarily * tied to an SDK version. */ int mInternalDatabaseVersion; int mExternalDatabaseVersion; Boolean mReadExternalStorageEnforced; /** Device identity for the purpose of package verification. */ Loading Loading @@ -825,6 +855,40 @@ final class Settings { } } /** * Returns whether the current database has is older than {@code version} * for apps on internal storage. */ public boolean isInternalDatabaseVersionOlderThan(int version) { return mInternalDatabaseVersion < version; } /** * Returns whether the current database has is older than {@code version} * for apps on external storage. */ public boolean isExternalDatabaseVersionOlderThan(int version) { return mExternalDatabaseVersion < version; } /** * Updates the database version for apps on internal storage. Called after * call the updates to the database format are done for apps on internal * storage after the initial start-up scan. */ public void updateInternalDatabaseVersion() { mInternalDatabaseVersion = CURRENT_DATABASE_VERSION; } /** * Updates the database version for apps on internal storage. Called after * call the updates to the database format are done for apps on internal * storage after the initial start-up scan. */ public void updateExternalDatabaseVersion() { mExternalDatabaseVersion = CURRENT_DATABASE_VERSION; } private void readPreferredActivitiesLPw(XmlPullParser parser, int userId) throws XmlPullParserException, IOException { int outerDepth = parser.getDepth(); Loading Loading @@ -1355,6 +1419,11 @@ final class Settings { serializer.attribute(null, "external", Integer.toString(mExternalSdkPlatform)); serializer.endTag(null, "last-platform-version"); serializer.startTag(null, "database-version"); serializer.attribute(null, "internal", Integer.toString(mInternalDatabaseVersion)); serializer.attribute(null, "external", Integer.toString(mExternalDatabaseVersion)); serializer.endTag(null, "database-version"); if (mVerifierDeviceIdentity != null) { serializer.startTag(null, "verifier"); serializer.attribute(null, "device", mVerifierDeviceIdentity.toString()); Loading Loading @@ -1830,6 +1899,19 @@ final class Settings { } } catch (NumberFormatException e) { } } else if (tagName.equals("database-version")) { mInternalDatabaseVersion = mExternalDatabaseVersion = 0; try { String internalDbVersionString = parser.getAttributeValue(null, "internal"); if (internalDbVersionString != null) { mInternalDatabaseVersion = Integer.parseInt(internalDbVersionString); } String externalDbVersionString = parser.getAttributeValue(null, "external"); if (externalDbVersionString != null) { mExternalDatabaseVersion = Integer.parseInt(externalDbVersionString); } } catch (NumberFormatException ignored) { } } else if (tagName.equals("verifier")) { final String deviceIdentity = parser.getAttributeValue(null, "device"); try { Loading Loading
services/core/java/com/android/server/pm/PackageManagerService.java +29 −0 Original line number Diff line number Diff line Loading @@ -1532,6 +1532,9 @@ public class PackageManagerService extends IPackageManager.Stub { mSettings.readDefaultPreferredAppsLPw(this, 0); } // All the changes are done during package scanning. mSettings.updateInternalDatabaseVersion(); // can downgrade to reader mSettings.writeLPr(); Loading Loading @@ -11074,6 +11077,8 @@ public class PackageManagerService extends IPackageManager.Stub { public static final int DUMP_KEYSETS = 1 << 11; public static final int DUMP_VERSION = 1 << 12; public static final int OPTION_SHOW_FILTERS = 1 << 0; private int mTypes; Loading Loading @@ -11172,6 +11177,7 @@ public class PackageManagerService extends IPackageManager.Stub { pw.println(" s[hared-users]: dump shared user IDs"); pw.println(" m[essages]: print collected runtime messages"); pw.println(" v[erifiers]: print package verifier info"); pw.println(" version: print database version info"); pw.println(" <package.name>: info about given package"); pw.println(" k[eysets]: print known keysets"); return; Loading Loading @@ -11220,6 +11226,8 @@ public class PackageManagerService extends IPackageManager.Stub { dumpState.setDump(DumpState.DUMP_MESSAGES); } else if ("v".equals(cmd) || "verifiers".equals(cmd)) { dumpState.setDump(DumpState.DUMP_VERIFIERS); } else if ("version".equals(cmd)) { dumpState.setDump(DumpState.DUMP_VERSION); } else if ("k".equals(cmd) || "keysets".equals(cmd)) { dumpState.setDump(DumpState.DUMP_KEYSETS); } Loading @@ -11231,6 +11239,24 @@ public class PackageManagerService extends IPackageManager.Stub { // reader synchronized (mPackages) { if (dumpState.isDumping(DumpState.DUMP_VERSION) && packageName == null) { if (!checkin) { if (dumpState.onTitlePrinted()) pw.println(); pw.println("Database versions:"); pw.print(" SDK Version:"); pw.print(" internal="); pw.print(mSettings.mInternalSdkPlatform); pw.print(" external="); pw.println(mSettings.mExternalSdkPlatform); pw.print(" DB Version:"); pw.print(" internal="); pw.print(mSettings.mInternalDatabaseVersion); pw.print(" external="); pw.println(mSettings.mExternalDatabaseVersion); } } if (dumpState.isDumping(DumpState.DUMP_VERIFIERS) && packageName == null) { if (!checkin) { if (dumpState.onTitlePrinted()) Loading Loading @@ -11761,6 +11787,9 @@ public class PackageManagerService extends IPackageManager.Stub { | (regrantPermissions ? (UPDATE_PERMISSIONS_REPLACE_PKG|UPDATE_PERMISSIONS_REPLACE_ALL) : 0)); mSettings.updateExternalDatabaseVersion(); // can downgrade to reader // Persist settings mSettings.writeLPr(); Loading
services/core/java/com/android/server/pm/Settings.java +82 −0 Original line number Diff line number Diff line Loading @@ -89,6 +89,28 @@ import libcore.io.IoUtils; final class Settings { private static final String TAG = "PackageSettings"; /** * Current version of the package database. Set it to the latest version in * the {@link DatabaseVersion} class below to ensure the database upgrade * doesn't happen repeatedly. * <p> * Note that care should be taken to make sure all database upgrades are * idempotent. */ private static final int CURRENT_DATABASE_VERSION = DatabaseVersion.FIRST_VERSION; /** * This class contains constants that can be referred to from upgrade code. * Insert constant values here that describe the upgrade reason. The version * code must be monotonically increasing. */ public static class DatabaseVersion { /** * The initial version of the database. */ public static final int FIRST_VERSION = 1; } private static final boolean DEBUG_STOPPED = false; private static final boolean DEBUG_MU = false; Loading Loading @@ -133,6 +155,14 @@ final class Settings { int mInternalSdkPlatform; int mExternalSdkPlatform; /** * The current database version for apps on internal storage. This is * used to upgrade the format of the packages.xml database not necessarily * tied to an SDK version. */ int mInternalDatabaseVersion; int mExternalDatabaseVersion; Boolean mReadExternalStorageEnforced; /** Device identity for the purpose of package verification. */ Loading Loading @@ -825,6 +855,40 @@ final class Settings { } } /** * Returns whether the current database has is older than {@code version} * for apps on internal storage. */ public boolean isInternalDatabaseVersionOlderThan(int version) { return mInternalDatabaseVersion < version; } /** * Returns whether the current database has is older than {@code version} * for apps on external storage. */ public boolean isExternalDatabaseVersionOlderThan(int version) { return mExternalDatabaseVersion < version; } /** * Updates the database version for apps on internal storage. Called after * call the updates to the database format are done for apps on internal * storage after the initial start-up scan. */ public void updateInternalDatabaseVersion() { mInternalDatabaseVersion = CURRENT_DATABASE_VERSION; } /** * Updates the database version for apps on internal storage. Called after * call the updates to the database format are done for apps on internal * storage after the initial start-up scan. */ public void updateExternalDatabaseVersion() { mExternalDatabaseVersion = CURRENT_DATABASE_VERSION; } private void readPreferredActivitiesLPw(XmlPullParser parser, int userId) throws XmlPullParserException, IOException { int outerDepth = parser.getDepth(); Loading Loading @@ -1355,6 +1419,11 @@ final class Settings { serializer.attribute(null, "external", Integer.toString(mExternalSdkPlatform)); serializer.endTag(null, "last-platform-version"); serializer.startTag(null, "database-version"); serializer.attribute(null, "internal", Integer.toString(mInternalDatabaseVersion)); serializer.attribute(null, "external", Integer.toString(mExternalDatabaseVersion)); serializer.endTag(null, "database-version"); if (mVerifierDeviceIdentity != null) { serializer.startTag(null, "verifier"); serializer.attribute(null, "device", mVerifierDeviceIdentity.toString()); Loading Loading @@ -1830,6 +1899,19 @@ final class Settings { } } catch (NumberFormatException e) { } } else if (tagName.equals("database-version")) { mInternalDatabaseVersion = mExternalDatabaseVersion = 0; try { String internalDbVersionString = parser.getAttributeValue(null, "internal"); if (internalDbVersionString != null) { mInternalDatabaseVersion = Integer.parseInt(internalDbVersionString); } String externalDbVersionString = parser.getAttributeValue(null, "external"); if (externalDbVersionString != null) { mExternalDatabaseVersion = Integer.parseInt(externalDbVersionString); } } catch (NumberFormatException ignored) { } } else if (tagName.equals("verifier")) { final String deviceIdentity = parser.getAttributeValue(null, "device"); try { Loading