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

Commit 255b69ac authored by Nicolas Geoffray's avatar Nicolas Geoffray Committed by android-build-merger
Browse files

Merge "Pass bootComplete to dexopt." am: 18c32019

am: 1e35b7b5

Change-Id: Id4633d3729c8532d901b33bb6720d8f34df1e6e9
parents ae278410 1e35b7b5
Loading
Loading
Loading
Loading
+2 −11
Original line number Diff line number Diff line
@@ -466,22 +466,13 @@ interface IPackageManager {
     */
    void notifyDexLoad(String loadingPackageName, in List<String> dexPaths, String loaderIsa);

    /**
     * Ask the package manager to perform dex-opt (if needed) on the given
     * package if it already hasn't done so.
     *
     * In most cases, apps are dexopted in advance and this function will
     * be a no-op.
     */
    boolean performDexOptIfNeeded(String packageName);

    /**
     * Ask the package manager to perform a dex-opt for the given reason. The package
     * manager will map the reason to a compiler filter according to the current system
     * configuration.
     */
    boolean performDexOpt(String packageName, boolean checkProfiles,
            int compileReason, boolean force);
            int compileReason, boolean force, boolean bootComplete);

    /**
     * Ask the package manager to perform a dex-opt with the given compiler filter.
@@ -490,7 +481,7 @@ interface IPackageManager {
     *       definite state.
     */
    boolean performDexOptMode(String packageName, boolean checkProfiles,
            String targetCompilerFilter, boolean force);
            String targetCompilerFilter, boolean force, boolean bootComplete);

    /**
     * Ask the package manager to perform a dex-opt with the given compiler filter on the
+4 −2
Original line number Diff line number Diff line
@@ -211,7 +211,8 @@ public class BackgroundDexOptService extends JobService {
            pm.performDexOpt(pkg,
                    /* checkProfiles */ false,
                    PackageManagerService.REASON_BOOT,
                    /* force */ false);
                    /* force */ false,
                    /* bootComplete */ true);
        }
        // Ran to completion, so we abandon our timeslice and do not reschedule.
        jobFinished(jobParams, /* reschedule */ false);
@@ -288,7 +289,8 @@ public class BackgroundDexOptService extends JobService {
                    ? pm.performDexOpt(pkg,
                            /* checkProfiles */ true,
                            PackageManagerService.REASON_BACKGROUND_DEXOPT,
                            /* force */ false)
                            /* force */ false,
                            /* bootComplete */ true)
                    : pm.performDexOptSecondary(pkg,
                            PackageManagerService.REASON_BACKGROUND_DEXOPT,
                            /* force */ false);
+2 −1
Original line number Diff line number Diff line
@@ -315,7 +315,8 @@ public class OtaDexoptService extends IOtaDexopt.Stub {
                null /* ISAs */, false /* checkProfiles */,
                getCompilerFilterForReason(compilationReason),
                null /* CompilerStats.PackageStats */,
                mPackageManagerService.getDexManager().isUsedByOtherApps(pkg.packageName));
                mPackageManagerService.getDexManager().isUsedByOtherApps(pkg.packageName),
                true /* bootComplete */);

        return commands;
    }
+13 −9
Original line number Diff line number Diff line
@@ -104,7 +104,8 @@ public class PackageDexOptimizer {
     */
    int performDexOpt(PackageParser.Package pkg, String[] sharedLibraries,
            String[] instructionSets, boolean checkProfiles, String targetCompilationFilter,
            CompilerStats.PackageStats packageStats, boolean isUsedByOtherApps) {
            CompilerStats.PackageStats packageStats, boolean isUsedByOtherApps,
            boolean bootComplete) {
        if (!canOptimizePackage(pkg)) {
            return DEX_OPT_SKIPPED;
        }
@@ -119,7 +120,7 @@ public class PackageDexOptimizer {
            }
            try {
                return performDexOptLI(pkg, sharedLibraries, instructionSets, checkProfiles,
                        targetCompilationFilter, packageStats, isUsedByOtherApps);
                        targetCompilationFilter, packageStats, isUsedByOtherApps, bootComplete);
            } finally {
                if (useLock) {
                    mDexoptWakeLock.release();
@@ -136,7 +137,7 @@ public class PackageDexOptimizer {
    private int performDexOptLI(PackageParser.Package pkg, String[] sharedLibraries,
            String[] targetInstructionSets, boolean checkForProfileUpdates,
            String targetCompilerFilter, CompilerStats.PackageStats packageStats,
            boolean isUsedByOtherApps) {
            boolean isUsedByOtherApps, boolean bootComplete) {
        final String[] instructionSets = targetInstructionSets != null ?
                targetInstructionSets : getAppDexInstructionSets(pkg.applicationInfo);
        final String[] dexCodeInstructionSets = getDexCodeInstructionSets(instructionSets);
@@ -152,7 +153,7 @@ public class PackageDexOptimizer {
        // paths (b/34169257).
        String sharedLibrariesPath = getSharedLibrariesPath(sharedLibraries);
        // Get the dexopt flags after getRealCompilerFilter to make sure we get the correct flags.
        final int dexoptFlags = getDexFlags(pkg, compilerFilter);
        final int dexoptFlags = getDexFlags(pkg, compilerFilter, bootComplete);

        int result = DEX_OPT_SKIPPED;
        // TODO: Iterate based on dependency hierarchy (currently alphabetically by name)
@@ -274,7 +275,9 @@ public class PackageDexOptimizer {
    @GuardedBy("mInstallLock")
    private int dexOptSecondaryDexPathLI(ApplicationInfo info, String path, Set<String> isas,
            String compilerFilter, boolean isUsedByOtherApps) {
        int dexoptFlags = getDexFlags(info, compilerFilter) | DEXOPT_SECONDARY_DEX;
        // Secondary dex files are currently not compiled at boot.
        int dexoptFlags = getDexFlags(info, compilerFilter, /* bootComplete */ true)
                | DEXOPT_SECONDARY_DEX;
        // Check the app storage and add the appropriate flags.
        if (info.dataDir.equals(info.deviceProtectedDataDir)) {
            dexoptFlags |= DEXOPT_STORAGE_DE;
@@ -374,11 +377,12 @@ public class PackageDexOptimizer {
     * Computes the dex flags that needs to be pass to installd for the given package and compiler
     * filter.
     */
    private int getDexFlags(PackageParser.Package pkg, String compilerFilter) {
        return getDexFlags(pkg.applicationInfo, compilerFilter);
    private int getDexFlags(PackageParser.Package pkg, String compilerFilter,
            boolean bootComplete) {
        return getDexFlags(pkg.applicationInfo, compilerFilter, bootComplete);
    }

    private int getDexFlags(ApplicationInfo info, String compilerFilter) {
    private int getDexFlags(ApplicationInfo info, String compilerFilter, boolean bootComplete) {
        int flags = info.flags;
        boolean debuggable = (flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
        // Profile guide compiled oat files should not be public.
@@ -389,7 +393,7 @@ public class PackageDexOptimizer {
                (isPublic ? DEXOPT_PUBLIC : 0)
                | (debuggable ? DEXOPT_DEBUGGABLE : 0)
                | profileFlag
                | DEXOPT_BOOTCOMPLETE;
                | (bootComplete ? DEXOPT_BOOTCOMPLETE : 0);
        return adjustDexoptFlags(dexFlags);
    }

+25 −25
Original line number Diff line number Diff line
@@ -2662,7 +2662,7 @@ public class PackageManagerService extends IPackageManager.Stub {
                }
                int[] stats = performDexOptUpgrade(coreApps, false,
                        getCompilerFilterForReason(REASON_CORE_APP));
                        getCompilerFilterForReason(REASON_CORE_APP), /* bootComplete */ false);
                final int elapsedTimeSeconds =
                        (int) TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - start);
@@ -7309,7 +7309,8 @@ public class PackageManagerService extends IPackageManager.Stub {
        final long startTime = System.nanoTime();
        final int[] stats = performDexOptUpgrade(pkgs, mIsPreNUpgrade /* showDialog */,
                    getCompilerFilterForReason(causeFirstBoot ? REASON_FIRST_BOOT : REASON_BOOT));
                    getCompilerFilterForReason(causeFirstBoot ? REASON_FIRST_BOOT : REASON_BOOT),
                    false /* bootComplete */);
        final int elapsedTimeSeconds =
                (int) TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - startTime);
@@ -7328,7 +7329,7 @@ public class PackageManagerService extends IPackageManager.Stub {
     * and {@code numberOfPackagesFailed}.
     */
    private int[] performDexOptUpgrade(List<PackageParser.Package> pkgs, boolean showDialog,
            String compilerFilter) {
            String compilerFilter, boolean bootComplete) {
        int numberOfPackagesVisited = 0;
        int numberOfPackagesOptimized = 0;
@@ -7385,7 +7386,8 @@ public class PackageManagerService extends IPackageManager.Stub {
            int dexOptStatus = performDexOptTraced(pkg.packageName,
                    false /* checkProfiles */,
                    compilerFilter,
                    false /* force */);
                    false /* force */,
                    bootComplete);
            switch (dexOptStatus) {
                case PackageDexOptimizer.DEX_OPT_PERFORMED:
                    numberOfPackagesOptimized++;
@@ -7429,36 +7431,30 @@ public class PackageManagerService extends IPackageManager.Stub {
        mDexManager.notifyDexLoad(ai, dexPaths, loaderIsa, userId);
    }
    // TODO: this is not used nor needed. Delete it.
    @Override
    public boolean performDexOptIfNeeded(String packageName) {
        int dexOptStatus = performDexOptTraced(packageName,
                false /* checkProfiles */, getFullCompilerFilter(), false /* force */);
        return dexOptStatus != PackageDexOptimizer.DEX_OPT_FAILED;
    }
    @Override
    public boolean performDexOpt(String packageName,
            boolean checkProfiles, int compileReason, boolean force) {
            boolean checkProfiles, int compileReason, boolean force, boolean bootComplete) {
        int dexOptStatus = performDexOptTraced(packageName, checkProfiles,
                getCompilerFilterForReason(compileReason), force);
                getCompilerFilterForReason(compileReason), force, bootComplete);
        return dexOptStatus != PackageDexOptimizer.DEX_OPT_FAILED;
    }
    @Override
    public boolean performDexOptMode(String packageName,
            boolean checkProfiles, String targetCompilerFilter, boolean force) {
            boolean checkProfiles, String targetCompilerFilter, boolean force,
            boolean bootComplete) {
        int dexOptStatus = performDexOptTraced(packageName, checkProfiles,
                targetCompilerFilter, force);
                targetCompilerFilter, force, bootComplete);
        return dexOptStatus != PackageDexOptimizer.DEX_OPT_FAILED;
    }
    private int performDexOptTraced(String packageName,
                boolean checkProfiles, String targetCompilerFilter, boolean force) {
                boolean checkProfiles, String targetCompilerFilter, boolean force,
                boolean bootComplete) {
        Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "dexopt");
        try {
            return performDexOptInternal(packageName, checkProfiles,
                    targetCompilerFilter, force);
                    targetCompilerFilter, force, bootComplete);
        } finally {
            Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
        }
@@ -7467,7 +7463,8 @@ public class PackageManagerService extends IPackageManager.Stub {
    // Run dexopt on a given package. Returns true if dexopt did not fail, i.e.
    // if the package can now be considered up to date for the given filter.
    private int performDexOptInternal(String packageName,
                boolean checkProfiles, String targetCompilerFilter, boolean force) {
                boolean checkProfiles, String targetCompilerFilter, boolean force,
                boolean bootComplete) {
        PackageParser.Package p;
        synchronized (mPackages) {
            p = mPackages.get(packageName);
@@ -7482,7 +7479,7 @@ public class PackageManagerService extends IPackageManager.Stub {
        try {
            synchronized (mInstallLock) {
                return performDexOptInternalWithDependenciesLI(p, checkProfiles,
                        targetCompilerFilter, force);
                        targetCompilerFilter, force, bootComplete);
            }
        } finally {
            Binder.restoreCallingIdentity(callingId);
@@ -7503,7 +7500,7 @@ public class PackageManagerService extends IPackageManager.Stub {
    private int performDexOptInternalWithDependenciesLI(PackageParser.Package p,
            boolean checkProfiles, String targetCompilerFilter,
            boolean force) {
            boolean force, boolean bootComplete) {
        // Select the dex optimizer based on the force parameter.
        // Note: The force option is rarely used (cmdline input for testing, mostly), so it's OK to
        //       allocate an object here.
@@ -7523,12 +7520,13 @@ public class PackageManagerService extends IPackageManager.Stub {
                        false /* checkProfiles */,
                        getCompilerFilterForReason(REASON_NON_SYSTEM_LIBRARY),
                        getOrCreateCompilerPackageStats(depPackage),
                        mDexManager.isUsedByOtherApps(p.packageName));
                        mDexManager.isUsedByOtherApps(p.packageName),
                        bootComplete);
            }
        }
        return pdo.performDexOpt(p, p.usesLibraryFiles, instructionSets, checkProfiles,
                targetCompilerFilter, getOrCreateCompilerPackageStats(p),
                mDexManager.isUsedByOtherApps(p.packageName));
                mDexManager.isUsedByOtherApps(p.packageName), bootComplete);
    }
    // Performs dexopt on the used secondary dex files belonging to the given package.
@@ -7674,7 +7672,8 @@ public class PackageManagerService extends IPackageManager.Stub {
            // Don't use profiles since that may cause compilation to be skipped.
            final int res = performDexOptInternalWithDependenciesLI(pkg,
                    false /* checkProfiles */, getCompilerFilterForReason(REASON_FORCED_DEXOPT),
                    true /* force */);
                    true /* force */,
                    true /* bootComplete */);
            Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
            if (res != PackageDexOptimizer.DEX_OPT_PERFORMED) {
@@ -15260,7 +15259,8 @@ public class PackageManagerService extends IPackageManager.Stub {
                    null /* instructionSets */, false /* checkProfiles */,
                    getCompilerFilterForReason(REASON_INSTALL),
                    getOrCreateCompilerPackageStats(pkg),
                    mDexManager.isUsedByOtherApps(pkg.packageName));
                    mDexManager.isUsedByOtherApps(pkg.packageName),
                    true /* bootComplete */);
            Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
            // Notify BackgroundDexOptService that the package has been changed.
Loading