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

Commit ee5c04e7 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Perf regression fix on low-level devices."

parents 5b4895f5 d2faad6f
Loading
Loading
Loading
Loading
+51 −58
Original line number Diff line number Diff line
@@ -47,11 +47,13 @@ import libcore.util.HexEncoding;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.io.OutputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Collections;
@@ -302,49 +304,53 @@ public class RoleServicePlatformHelperImpl implements RoleServicePlatformHelper
    public String computePackageStateHash(@UserIdInt int userId) {
        PackageManagerInternal packageManagerInternal = LocalServices.getService(
                PackageManagerInternal.class);
        final MessageDigestUtils md = new MessageDigestUtils();
        final MessageDigestOutputStream mdos = new MessageDigestOutputStream();

        DataOutputStream dataOutputStream = new DataOutputStream(new BufferedOutputStream(mdos));
        packageManagerInternal.forEachInstalledPackage(pkg -> {
            md.writeString(pkg.getPackageName());
            md.writeLong(pkg.getLongVersionCode());
            md.writeInt(packageManagerInternal.getApplicationEnabledState(pkg.getPackageName(),
                    userId));
            try {
                dataOutputStream.writeUTF(pkg.getPackageName());
                dataOutputStream.writeLong(pkg.getLongVersionCode());
                dataOutputStream.writeInt(packageManagerInternal.getApplicationEnabledState(
                        pkg.getPackageName(), userId));

                final List<String> requestedPermissions = pkg.getRequestedPermissions();
                final int requestedPermissionsSize = requestedPermissions.size();
            md.writeInt(requestedPermissionsSize);
                dataOutputStream.writeInt(requestedPermissionsSize);
                for (int i = 0; i < requestedPermissionsSize; i++) {
                md.writeString(requestedPermissions.get(i));
                    dataOutputStream.writeUTF(requestedPermissions.get(i));
                }

            final ArraySet<String> enabledComponents = packageManagerInternal.getEnabledComponents(
                    pkg.getPackageName(), userId);
                final ArraySet<String> enabledComponents =
                        packageManagerInternal.getEnabledComponents(pkg.getPackageName(), userId);
                final int enabledComponentsSize = CollectionUtils.size(enabledComponents);
            md.writeInt(enabledComponentsSize);
                dataOutputStream.writeInt(enabledComponentsSize);
                for (int i = 0; i < enabledComponentsSize; i++) {
                md.writeString(enabledComponents.valueAt(i));
                    dataOutputStream.writeUTF(enabledComponents.valueAt(i));
                }

                final ArraySet<String> disabledComponents =
                        packageManagerInternal.getDisabledComponents(pkg.getPackageName(), userId);
                final int disabledComponentsSize = CollectionUtils.size(disabledComponents);
                for (int i = 0; i < disabledComponentsSize; i++) {
                md.writeString(disabledComponents.valueAt(i));
                    dataOutputStream.writeUTF(disabledComponents.valueAt(i));
                }

                for (final Signature signature : pkg.getSigningDetails().getSignatures()) {
                md.writeBytes(signature.toByteArray());
                    dataOutputStream.write(signature.toByteArray());
                }
            } catch (IOException e) {
                // Never happens for MessageDigestOutputStream and DataOutputStream.
                throw new AssertionError(e);
            }
        }, userId);

        return md.getDigestAsString();
        return mdos.getDigestAsString();
    }

    private static class MessageDigestUtils {
        private final byte[] mBuffer = new byte[8];
    private static class MessageDigestOutputStream extends OutputStream {
        private final MessageDigest mMessageDigest;

        MessageDigestUtils() {
        MessageDigestOutputStream() {
            try {
                mMessageDigest = MessageDigest.getInstance("SHA256");
            } catch (NoSuchAlgorithmException e) {
@@ -358,32 +364,19 @@ public class RoleServicePlatformHelperImpl implements RoleServicePlatformHelper
            return HexEncoding.encodeToString(mMessageDigest.digest(), true /* uppercase */);
        }

        void writeBytes(@NonNull byte[] bytes) {
            mMessageDigest.update(bytes);
        }

        void writeString(@NonNull String s) {
            mMessageDigest.update(s.getBytes(StandardCharsets.UTF_8));
        @Override
        public void write(int b) throws IOException {
            mMessageDigest.update((byte) b);
        }

        void writeLong(long v) {
            mBuffer[0] = (byte) (v >>> 56);
            mBuffer[1] = (byte) (v >>> 48);
            mBuffer[2] = (byte) (v >>> 40);
            mBuffer[3] = (byte) (v >>> 32);
            mBuffer[4] = (byte) (v >>> 24);
            mBuffer[5] = (byte) (v >>> 16);
            mBuffer[6] = (byte) (v >>>  8);
            mBuffer[7] = (byte) (v >>>  0);
            mMessageDigest.update(mBuffer, 0, 8);
        @Override
        public void write(byte[] b) throws IOException {
            mMessageDigest.update(b);
        }

        void writeInt(int v) {
            mBuffer[0] = (byte) (v >>> 24);
            mBuffer[1] = (byte) (v >>> 16);
            mBuffer[2] = (byte) (v >>>  8);
            mBuffer[3] = (byte) (v >>>  0);
            mMessageDigest.update(mBuffer, 0, 4);
        @Override
        public void write(byte[] b, int off, int len) throws IOException {
            mMessageDigest.update(b, off, len);
        }
    }
}