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

Commit 8c6e5372 authored by Todd Kennedy's avatar Todd Kennedy
Browse files

Allow using the JIT

Instead of the JIT only being available for eng builds [or configurable
via environment variable], allow the JIT to be enabled programatically.

Change-Id: Ifcbc8445fb8bd45ce2bfed3f80fbaf48496f8e3a
parent 7de7e0b0
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -43,6 +43,8 @@ public final class Installer extends SystemService {
    public static final int DEXOPT_DEBUGGABLE   = 1 << 3;
    /** The system boot has finished */
    public static final int DEXOPT_BOOTCOMPLETE = 1 << 4;
    /** Run the application with the JIT compiler */
    public static final int DEXOPT_USEJIT       = 1 << 5;

    private final InstallerConnection mInstaller;

+16 −9
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ import static com.android.server.pm.Installer.DEXOPT_BOOTCOMPLETE;
import static com.android.server.pm.Installer.DEXOPT_DEBUGGABLE;
import static com.android.server.pm.Installer.DEXOPT_PUBLIC;
import static com.android.server.pm.Installer.DEXOPT_SAFEMODE;
import static com.android.server.pm.Installer.DEXOPT_USEJIT;
import static com.android.server.pm.InstructionSets.getAppDexInstructionSets;
import static com.android.server.pm.InstructionSets.getDexCodeInstructionSets;

@@ -67,7 +68,8 @@ final class PackageDexOptimizer {
     * {@link PackageManagerService#mInstallLock}.
     */
    int performDexOpt(PackageParser.Package pkg, String[] instructionSets,
            boolean forceDex, boolean defer, boolean inclDependencies, boolean bootComplete) {
            boolean forceDex, boolean defer, boolean inclDependencies,
            boolean bootComplete, boolean useJit) {
        ArraySet<String> done;
        if (inclDependencies && (pkg.usesLibraries != null || pkg.usesOptionalLibraries != null)) {
            done = new ArraySet<String>();
@@ -76,12 +78,14 @@ final class PackageDexOptimizer {
            done = null;
        }
        synchronized (mPackageManagerService.mInstallLock) {
            return performDexOptLI(pkg, instructionSets, forceDex, defer, bootComplete, done);
            return performDexOptLI(pkg, instructionSets, forceDex, defer, bootComplete,
                    useJit, done);
        }
    }

    private int performDexOptLI(PackageParser.Package pkg, String[] targetInstructionSets,
            boolean forceDex, boolean defer, boolean bootComplete, ArraySet<String> done) {
            boolean forceDex, boolean defer, boolean bootComplete, boolean useJit,
            ArraySet<String> done) {
        final String[] instructionSets = targetInstructionSets != null ?
                targetInstructionSets : getAppDexInstructionSets(pkg.applicationInfo);

@@ -89,11 +93,11 @@ final class PackageDexOptimizer {
            done.add(pkg.packageName);
            if (pkg.usesLibraries != null) {
                performDexOptLibsLI(pkg.usesLibraries, instructionSets, forceDex, defer,
                        bootComplete, done);
                        bootComplete, useJit, done);
            }
            if (pkg.usesOptionalLibraries != null) {
                performDexOptLibsLI(pkg.usesOptionalLibraries, instructionSets, forceDex, defer,
                        bootComplete, done);
                        bootComplete, useJit, done);
            }
        }

@@ -150,13 +154,15 @@ final class PackageDexOptimizer {
                        Log.i(TAG, "Running dexopt (" + dexoptType + ") on: " + path + " pkg="
                                + pkg.applicationInfo.packageName + " isa=" + dexCodeInstructionSet
                                + " vmSafeMode=" + vmSafeMode + " debuggable=" + debuggable
                                + " oatDir = " + oatDir + " bootComplete=" + bootComplete);
                                + " oatDir = " + oatDir + " bootComplete=" + bootComplete
                                + " useJit=" + useJit);
                        final int sharedGid = UserHandle.getSharedAppGid(pkg.applicationInfo.uid);
                        final int dexFlags =
                                (!pkg.isForwardLocked() ? DEXOPT_PUBLIC : 0)
                                | (vmSafeMode ? DEXOPT_SAFEMODE : 0)
                                | (debuggable ? DEXOPT_DEBUGGABLE : 0)
                                | (bootComplete ? DEXOPT_BOOTCOMPLETE : 0);
                                | (bootComplete ? DEXOPT_BOOTCOMPLETE : 0)
                                | (useJit ? DEXOPT_USEJIT : 0);
                        final int ret = mPackageManagerService.mInstaller.dexopt(path, sharedGid,
                                pkg.packageName, dexCodeInstructionSet, dexoptNeeded, oatDir, dexFlags);
                        if (ret < 0) {
@@ -227,12 +233,13 @@ final class PackageDexOptimizer {
    }

    private void performDexOptLibsLI(ArrayList<String> libs, String[] instructionSets,
            boolean forceDex, boolean defer, boolean bootComplete, ArraySet<String> done) {
            boolean forceDex, boolean defer, boolean bootComplete, boolean useJit,
            ArraySet<String> done) {
        for (String libName : libs) {
            PackageParser.Package libPkg = mPackageManagerService.findSharedNonSystemLibrary(
                    libName);
            if (libPkg != null && !done.contains(libName)) {
                performDexOptLI(libPkg, instructionSets, forceDex, defer, bootComplete, done);
                performDexOptLI(libPkg, instructionSets, forceDex, defer, bootComplete, useJit, done);
            }
        }
    }
+7 −7
Original line number Diff line number Diff line
@@ -4724,7 +4724,7 @@ public class PackageManagerService extends IPackageManager.Stub {
        synchronized (mInstallLock) {
            mPackageDexOptimizer.performDexOpt(p, null /* instruction sets */,
                    false /* force dex */, false /* defer */, true /* include dependencies */,
                    false /* boot complete */);
                    false /* boot complete */, false /*useJit*/);
        }
    }
@@ -4767,7 +4767,7 @@ public class PackageManagerService extends IPackageManager.Stub {
            final String[] instructionSets = new String[] { targetInstructionSet };
            int result = mPackageDexOptimizer.performDexOpt(p, instructionSets,
                    false /* forceDex */, false /* defer */, true /* inclDependencies */,
                    true /* boot complete */);
                    true /* boot complete */, false /*useJit*/);
            return result == PackageDexOptimizer.DEX_OPT_PERFORMED;
        }
    }
@@ -4812,7 +4812,7 @@ public class PackageManagerService extends IPackageManager.Stub {
                    getPrimaryInstructionSet(pkg.applicationInfo) };
            final int res = mPackageDexOptimizer.performDexOpt(pkg, instructionSets,
                    true /*forceDex*/, false /* defer */, true /* inclDependencies */,
                    true /* boot complete */);
                    true /* boot complete */, false /*useJit*/);
            if (res != PackageDexOptimizer.DEX_OPT_PERFORMED) {
                throw new IllegalStateException("Failed to dexopt: " + res);
            }
@@ -5583,7 +5583,7 @@ public class PackageManagerService extends IPackageManager.Stub {
        if ((scanFlags & SCAN_NO_DEX) == 0) {
            int result = mPackageDexOptimizer.performDexOpt(pkg, null /* instruction sets */,
                    forceDex, (scanFlags & SCAN_DEFER_DEX) != 0, false /* inclDependencies */,
                    (scanFlags & SCAN_BOOTING) == 0);
                    (scanFlags & SCAN_BOOTING) == 0, false /*useJit*/);
            if (result == PackageDexOptimizer.DEX_OPT_FAILED) {
                throw new PackageManagerException(INSTALL_FAILED_DEXOPT, "scanPackageLI");
            }
@@ -5660,7 +5660,7 @@ public class PackageManagerService extends IPackageManager.Stub {
                    int result = mPackageDexOptimizer.performDexOpt(clientPkg,
                            null /* instruction sets */, forceDex,
                            (scanFlags & SCAN_DEFER_DEX) != 0, false,
                            (scanFlags & SCAN_BOOTING) == 0);
                            (scanFlags & SCAN_BOOTING) == 0, false /*useJit*/);
                    if (result == PackageDexOptimizer.DEX_OPT_FAILED) {
                        throw new PackageManagerException(INSTALL_FAILED_DEXOPT,
                                "scanPackageLI failed to dexopt clientLibPkgs");
@@ -6271,7 +6271,7 @@ public class PackageManagerService extends IPackageManager.Stub {
                        int result = mPackageDexOptimizer.performDexOpt(ps.pkg,
                                null /* instruction sets */, forceDexOpt, deferDexOpt, true,
                                bootComplete);
                                bootComplete, false /*useJit*/);
                        if (result == PackageDexOptimizer.DEX_OPT_FAILED) {
                            ps.primaryCpuAbiString = null;
                            ps.pkg.applicationInfo.primaryCpuAbi = null;
@@ -10456,7 +10456,7 @@ public class PackageManagerService extends IPackageManager.Stub {
            int result = mPackageDexOptimizer
                    .performDexOpt(pkg, null /* instruction sets */, false /* forceDex */,
                            false /* defer */, false /* inclDependencies */,
                            true /*bootComplete*/);
                            true /*bootComplete*/, false /*useJit*/);
            if (result == PackageDexOptimizer.DEX_OPT_FAILED) {
                res.setError(INSTALL_FAILED_DEXOPT, "Dexopt failed for " + pkg.codePath);
                return;