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

Commit 12e15a9c authored by Calin Juravle's avatar Calin Juravle Committed by Android (Google) Code Review
Browse files

Merge "Report non-primary dex files loads to PM"

parents 0de5d03c 8d2a51f1
Loading
Loading
Loading
Loading
+35 −0
Original line number Diff line number Diff line
@@ -51,6 +51,7 @@ import android.util.SparseArray;
import android.view.Display;
import android.view.DisplayAdjustments;

import dalvik.system.BaseDexClassLoader;
import dalvik.system.VMRuntime;

import java.io.File;
@@ -600,6 +601,40 @@ public final class LoadedApk {

        VMRuntime.registerAppInfo(profileFile.getPath(), mApplicationInfo.dataDir,
                codePaths.toArray(new String[codePaths.size()]), foreignDexProfilesFile.getPath());

        // Setup the reporter to notify package manager of any relevant dex loads.
        // At this point the primary apk is loaded and will not be reported.
        // Anything loaded from now on will be tracked as a potential secondary
        // or foreign dex file. The goal is to enable:
        //    1) monitoring and compilation of secondary dex file
        //    2) track foreign dex file usage (used to determined the
        //       compilation filter of apks).
        if (BaseDexClassLoader.getReporter() != DexLoadReporter.INSTANCE) {
            // Set the dex load reporter if not already set.
            // Note that during the app's life cycle different LoadedApks may be
            // created and loaded (e.g. if two different apps share the same runtime).
            BaseDexClassLoader.setReporter(DexLoadReporter.INSTANCE);
        }
    }

    private static class DexLoadReporter implements BaseDexClassLoader.Reporter {
        private static final DexLoadReporter INSTANCE = new DexLoadReporter();

        private DexLoadReporter() {}

        @Override
        public void report(List<String> dexPaths) {
            if (dexPaths.isEmpty()) {
                return;
            }
            String packageName = ActivityThread.currentPackageName();
            try {
                ActivityThread.getPackageManager().notifyDexLoad(
                        packageName, dexPaths, VMRuntime.getRuntime().vmInstructionSet());
            } catch (RemoteException re) {
                Slog.e(TAG, "Failed to notify PM about dex load for package " + packageName, re);
            }
        }
    }

    /**
+9 −0
Original line number Diff line number Diff line
@@ -457,6 +457,15 @@ interface IPackageManager {
     */
    void notifyPackageUse(String packageName, int reason);

    /**
     * Notify the package manager that a list of dex files have been loaded.
     *
     * @param loadingPackageName the name of the package who performs the load
     * @param dexPats the list of the dex files paths that have been loaded
     * @param loaderIsa the ISA of the loader process
     */
    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.
+5 −0
Original line number Diff line number Diff line
@@ -7639,6 +7639,11 @@ public class PackageManagerService extends IPackageManager.Stub {
        }
    }
    @Override
    public void notifyDexLoad(String loadingPackageName, List<String> dexPaths, String loaderIsa) {
      // TODO(calin): b/32871170
    }
    // TODO: this is not used nor needed. Delete it.
    @Override
    public boolean performDexOptIfNeeded(String packageName) {