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

Commit a25dc2bb authored by Alex Light's avatar Alex Light Committed by Brian Carlstrom
Browse files

resolved conflicts for merge of 37651b60 to lmp-dev-plus-aosp

Change-Id: I1fe0e64d2069b7424014bd3ff0bf6f80b439220d
(cherry picked from commit 1faf2d0d25550dc759481fd523456711808e8251)
parent 7bbf9e72
Loading
Loading
Loading
Loading
+28 −0
Original line number Diff line number Diff line
@@ -212,6 +212,34 @@ public final class Installer extends SystemService {
        return execute(builder.toString());
    }

    public int patchoat(String apkPath, int uid, boolean isPublic, String pkgName,
            String instructionSet) {
        StringBuilder builder = new StringBuilder("patchoat");
        builder.append(' ');
        builder.append(apkPath);
        builder.append(' ');
        builder.append(uid);
        builder.append(isPublic ? " 1" : " 0");
        builder.append(' ');
        builder.append(pkgName);
        builder.append(' ');
        builder.append(instructionSet);
        return execute(builder.toString());
    }

    public int patchoat(String apkPath, int uid, boolean isPublic, String instructionSet) {
        StringBuilder builder = new StringBuilder("patchoat");
        builder.append(' ');
        builder.append(apkPath);
        builder.append(' ');
        builder.append(uid);
        builder.append(isPublic ? " 1" : " 0");
        builder.append(" *");         // No pkgName arg present
        builder.append(' ');
        builder.append(instructionSet);
        return execute(builder.toString());
    }

    public int dexopt(String apkPath, int uid, boolean isPublic, String instructionSet) {
        StringBuilder builder = new StringBuilder("dexopt");
        builder.append(' ');
+39 −6
Original line number Diff line number Diff line
@@ -1420,11 +1420,18 @@ public class PackageManagerService extends IPackageManager.Stub {
                        }
                        try {
                            if (DexFile.isDexOptNeededInternal(lib, null, instructionSet, false)) {
                            byte dexoptRequired = DexFile.isDexOptNeededInternal(lib, null,
                                                                                 instructionSet,
                                                                                 false);
                            if (dexoptRequired != DexFile.UP_TO_DATE) {
                                alreadyDexOpted.add(lib);
                                // The list of "shared libraries" we have at this point is
                                if (dexoptRequired == DexFile.DEXOPT_NEEDED) {
                                    mInstaller.dexopt(lib, Process.SYSTEM_UID, true, instructionSet);
                                } else {
                                    mInstaller.patchoat(lib, Process.SYSTEM_UID, true, instructionSet);
                                }
                                didDexOptLibraryOrTool = true;
                            }
                        } catch (FileNotFoundException e) {
@@ -1471,9 +1478,15 @@ public class PackageManagerService extends IPackageManager.Stub {
                            continue;
                        }
                        try {
                            if (DexFile.isDexOptNeededInternal(path, null, instructionSet, false)) {
                            byte dexoptRequired = DexFile.isDexOptNeededInternal(path, null,
                                                                                 instructionSet,
                                                                                 false);
                            if (dexoptRequired == DexFile.DEXOPT_NEEDED) {
                                mInstaller.dexopt(path, Process.SYSTEM_UID, true, instructionSet);
                                didDexOptLibraryOrTool = true;
                            } else if (dexoptRequired == DexFile.PATCHOAT_NEEDED) {
                                mInstaller.patchoat(path, Process.SYSTEM_UID, true, instructionSet);
                                didDexOptLibraryOrTool = true;
                            }
                        } catch (FileNotFoundException e) {
                            Slog.w(TAG, "Jar not found: " + path);
@@ -4625,9 +4638,14 @@ public class PackageManagerService extends IPackageManager.Stub {
                }
                try {
                    final boolean isDexOptNeeded = DexFile.isDexOptNeededInternal(path,
                    // This will return DEXOPT_NEEDED if we either cannot find any odex file for this
                    // patckage or the one we find does not match the image checksum (i.e. it was
                    // compiled against an old image). It will return PATCHOAT_NEEDED if we can find a
                    // odex file and it matches the checksum of the image but not its base address,
                    // meaning we need to move it.
                    final byte isDexOptNeeded = DexFile.isDexOptNeededInternal(path,
                            pkg.packageName, instructionSet, defer);
                    if (forceDex || (!defer && isDexOptNeeded)) {
                    if (forceDex || (!defer && isDexOptNeeded == DexFile.DEXOPT_NEEDED)) {
                        Log.i(TAG, "Running dexopt on: " + path + " pkg="
                                + pkg.applicationInfo.packageName + " isa=" + instructionSet);
                        final int sharedGid = UserHandle.getSharedAppGid(pkg.applicationInfo.uid);
@@ -4643,12 +4661,27 @@ public class PackageManagerService extends IPackageManager.Stub {
                            performedDexOpt = true;
                            pkg.mDexOptPerformed.add(instructionSet);
                        }
                    } else if (!defer && isDexOptNeeded == DexFile.PATCHOAT_NEEDED) {
                        Log.i(TAG, "Running patchoat on: " + pkg.applicationInfo.packageName);
                        final int sharedGid = UserHandle.getSharedAppGid(pkg.applicationInfo.uid);
                        final int ret = mInstaller.patchoat(path, sharedGid, !isForwardLocked(pkg),
                                pkg.packageName, instructionSet);
                        if (ret < 0) {
                            // Don't bother running patchoat again if we failed, it will probably
                            // just result in an error again. Also, don't bother dexopting for other
                            // paths & ISAs.
                            return DEX_OPT_FAILED;
                        } else {
                            performedDexOpt = true;
                            pkg.mDexOptPerformed.add(instructionSet);
                        }
                    }
                    // We're deciding to defer a needed dexopt. Don't bother dexopting for other
                    // paths and instruction sets. We'll deal with them all together when we process
                    // our list of deferred dexopts.
                    if (defer && isDexOptNeeded) {
                    if (defer && isDexOptNeeded != DexFile.UP_TO_DATE) {
                        if (mDeferredDexOpt == null) {
                            mDeferredDexOpt = new HashSet<PackageParser.Package>();
                        }