Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9909e283 authored by dhacker29's avatar dhacker29 Committed by Gerrit Code Review
Browse files

Core: Allow Build.DISPLAY or Build.FINGERPRINT to deterimine mIsUpgrade

Many CM devices use a static fingerprint that is only changed when a new stock
version is released, so every boot we see Android is starting instead of
upgrading.  Build.DISPLAY is updated each time the rom is built and will
signal framework that this is an upgrade even if Build.FINGERPRINT is unchanged.

Change-Id: I73c72bba6d3f6e678da3a2d05729ab8bc8eaa919
parent 3bf37977
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -2136,7 +2136,8 @@ public class PackageManagerService extends IPackageManager.Stub {
            }
            final VersionInfo ver = mSettings.getInternalVersion();
            mIsUpgrade = !Build.FINGERPRINT.equals(ver.fingerprint);
            mIsUpgrade = !Build.FINGERPRINT.equals(ver.fingerprint) ||
                    !Build.DISPLAY.equals(ver.displayversion);
            // when upgrading from pre-M, promote system app permissions from install to runtime
            mPromoteSystemApps =
                    mIsUpgrade && ver.sdkVersion <= Build.VERSION_CODES.LOLLIPOP_MR1;
@@ -2443,7 +2444,7 @@ public class PackageManagerService extends IPackageManager.Stub {
            // If this is first boot after an OTA, and a normal boot, then
            // we need to clear code cache directories.
            if (mIsUpgrade && !onlyCore) {
                Slog.i(TAG, "Build fingerprint changed; clearing code caches");
                Slog.i(TAG, "Build fingerprint or displayversion changed; clearing code caches");
                for (int i = 0; i < mSettings.mPackages.size(); i++) {
                    final PackageSetting ps = mSettings.mPackages.valueAt(i);
                    if (Objects.equals(StorageManager.UUID_PRIVATE_INTERNAL, ps.volumeUuid)) {
@@ -2451,6 +2452,7 @@ public class PackageManagerService extends IPackageManager.Stub {
                    }
                }
                ver.fingerprint = Build.FINGERPRINT;
                ver.displayversion = Build.DISPLAY;
            }
            checkDefaultBrowser();
@@ -16418,7 +16420,8 @@ public class PackageManagerService extends IPackageManager.Stub {
                    Slog.w(TAG, "Failed to scan " + ps.codePath + ": " + e.getMessage());
                }
                if (!Build.FINGERPRINT.equals(ver.fingerprint)) {
                if ((!Build.FINGERPRINT.equals(ver.fingerprint)) ||
                        (!Build.DISPLAY.equals(ver.displayversion))) {
                    deleteCodeCacheDirsLI(ps.volumeUuid, ps.name);
                }
            }
+31 −3
Original line number Diff line number Diff line
@@ -217,6 +217,7 @@ final class Settings {
    private static final String ATTR_DOMAIN_VERIFICATON_STATE = "domainVerificationStatus";
    private static final String ATTR_PACKAGE_NAME = "packageName";
    private static final String ATTR_FINGERPRINT = "fingerprint";
    private static final String ATTR_DISPLAYVERSION = "displayversion";
    private static final String ATTR_APP_LINK_GENERATION = "app-link-generation";
    private static final String ATTR_VOLUME_UUID = "volumeUuid";
    private static final String ATTR_SDK_VERSION = "sdkVersion";
@@ -273,6 +274,12 @@ final class Settings {
         */
        String fingerprint;

        /**
         * Last known value of {@link Build#DISPLAY}. Used to determine when
         * an system update has occurred, meaning we need to clear code caches.
         */
        String displayversion;

        /**
         * Force all version information to match current system values,
         * typically after resolving any required upgrade steps.
@@ -281,6 +288,7 @@ final class Settings {
            sdkVersion = Build.VERSION.SDK_INT;
            databaseVersion = CURRENT_DATABASE_VERSION;
            fingerprint = Build.FINGERPRINT;
            displayversion = Build.DISPLAY;
        }
    }

@@ -2156,6 +2164,7 @@ final class Settings {
                XmlUtils.writeIntAttribute(serializer, ATTR_SDK_VERSION, ver.sdkVersion);
                XmlUtils.writeIntAttribute(serializer, ATTR_DATABASE_VERSION, ver.databaseVersion);
                XmlUtils.writeStringAttribute(serializer, ATTR_FINGERPRINT, ver.fingerprint);
                XmlUtils.writeStringAttribute(serializer, ATTR_DISPLAYVERSION, ver.displayversion);
                serializer.endTag(null, TAG_VERSION);
            }

@@ -2846,6 +2855,8 @@ final class Settings {
                    external.sdkVersion = XmlUtils.readIntAttribute(parser, "external", 0);
                    internal.fingerprint = external.fingerprint =
                            XmlUtils.readStringAttribute(parser, "fingerprint");
                    internal.displayversion = external.displayversion =
                            XmlUtils.readStringAttribute(parser, "displayversion");

                } else if (tagName.equals("database-version")) {
                    // Upgrade from older XML schema
@@ -2877,6 +2888,7 @@ final class Settings {
                    ver.sdkVersion = XmlUtils.readIntAttribute(parser, ATTR_SDK_VERSION);
                    ver.databaseVersion = XmlUtils.readIntAttribute(parser, ATTR_SDK_VERSION);
                    ver.fingerprint = XmlUtils.readStringAttribute(parser, ATTR_FINGERPRINT);
                    ver.displayversion = XmlUtils.readStringAttribute(parser, ATTR_DISPLAYVERSION);

                } else {
                    Slog.w(PackageManagerService.TAG, "Unknown element under <packages>: "
@@ -2902,7 +2914,8 @@ final class Settings {
        // on update drop the files before loading them.
        if (PackageManagerService.CLEAR_RUNTIME_PERMISSIONS_ON_UPGRADE) {
            final VersionInfo internal = getInternalVersion();
            if (!Build.FINGERPRINT.equals(internal.fingerprint)) {
            if ((!Build.FINGERPRINT.equals(internal.fingerprint)) ||
                    (!Build.DISPLAY.equals(internal.displayversion))) {
                if (users == null) {
                    mRuntimePermissionsPersistence.deleteUserRuntimePermissionsFile(
                            UserHandle.USER_OWNER);
@@ -4241,6 +4254,7 @@ final class Settings {
            pw.printPair("databaseVersion", ver.databaseVersion);
            pw.println();
            pw.printPair("fingerprint", ver.fingerprint);
            pw.printPair("displayversion", ver.displayversion);
            pw.println();
            pw.decreaseIndent();
        }
@@ -4806,6 +4820,10 @@ final class Settings {
        // The mapping keys are user ids.
        private final SparseArray<String> mFingerprints = new SparseArray<>();

        @GuardedBy("mLock")
        // The mapping keys are user ids.
        private final SparseArray<String> mDisplayversion = new SparseArray<>();

        @GuardedBy("mLock")
        // The mapping keys are user ids.
        private final SparseBooleanArray mDefaultPermissionsGranted = new SparseBooleanArray();
@@ -4820,6 +4838,7 @@ final class Settings {

        public void onDefaultRuntimePermissionsGrantedLPr(int userId) {
            mFingerprints.put(userId, Build.FINGERPRINT);
            mDisplayversion.put(userId, Build.DISPLAY);
            writePermissionsForUserAsyncLPr(userId);
        }

@@ -4912,6 +4931,11 @@ final class Settings {
                    serializer.attribute(null, ATTR_FINGERPRINT, fingerprint);
                }

                String displayversion = mDisplayversion.get(userId);
                if (displayversion != null) {
                    serializer.attribute(null, ATTR_DISPLAYVERSION, displayversion);
                }

                final int packageCount = permissionsForPackage.size();
                for (int i = 0; i < packageCount; i++) {
                    String packageName = permissionsForPackage.keyAt(i);
@@ -4936,7 +4960,8 @@ final class Settings {
                serializer.endDocument();
                destination.finishWrite(out);

                if (Build.FINGERPRINT.equals(fingerprint)) {
                if ((Build.FINGERPRINT.equals(fingerprint)) ||
                        (Build.DISPLAY.equals(displayversion))) {
                    mDefaultPermissionsGranted.put(userId, true);
                }
            // Any error while writing is fatal.
@@ -5019,8 +5044,11 @@ final class Settings {
                switch (parser.getName()) {
                    case TAG_RUNTIME_PERMISSIONS: {
                        String fingerprint = parser.getAttributeValue(null, ATTR_FINGERPRINT);
                        String displayversion = parser.getAttributeValue(null, ATTR_DISPLAYVERSION);
                        mFingerprints.put(userId, fingerprint);
                        final boolean defaultsGranted = Build.FINGERPRINT.equals(fingerprint);
                        mDisplayversion.put(userId, displayversion);
                        final boolean defaultsGranted = Build.FINGERPRINT.equals(fingerprint) ||
                                Build.DISPLAY.equals(displayversion);
                        mDefaultPermissionsGranted.put(userId, defaultsGranted);
                    } break;