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

Commit 87776bdc authored by Igor Murashkin's avatar Igor Murashkin
Browse files

dexopt: Add listeners when packages are updated by bg-dexopt

The plan is to use it for iorap to purge its traces when a package
is updated.

Bug: 150640692
Test: adb shell cmd package bg-dexopt-job com.google.android.GoogleCamera
Change-Id: I45f4dacc1630c4afd7cf2321371a04f79ef18d9e
parent fcbe6c43
Loading
Loading
Loading
Loading
+31 −0
Original line number Original line Diff line number Diff line
@@ -46,6 +46,7 @@ import com.android.server.pm.dex.DexoptOptions;


import java.io.File;
import java.io.File;
import java.nio.file.Paths;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.List;
import java.util.Set;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeUnit;
@@ -106,6 +107,8 @@ public class BackgroundDexOptService extends JobService {
    private static final long mDowngradeUnusedAppsThresholdInMillis =
    private static final long mDowngradeUnusedAppsThresholdInMillis =
            getDowngradeUnusedAppsThresholdInMillis();
            getDowngradeUnusedAppsThresholdInMillis();


    private static List<PackagesUpdatedListener> sPackagesUpdatedListeners = new ArrayList<>();

    public static void schedule(Context context) {
    public static void schedule(Context context) {
        if (isBackgroundDexoptDisabled()) {
        if (isBackgroundDexoptDisabled()) {
            return;
            return;
@@ -244,6 +247,7 @@ public class BackgroundDexOptService extends JobService {
            }
            }
        }
        }
        notifyPinService(updatedPackages);
        notifyPinService(updatedPackages);
        notifyPackagesUpdated(updatedPackages);
        // Ran to completion, so we abandon our timeslice and do not reschedule.
        // Ran to completion, so we abandon our timeslice and do not reschedule.
        jobFinished(jobParams, /* reschedule */ false);
        jobFinished(jobParams, /* reschedule */ false);
    }
    }
@@ -391,6 +395,7 @@ public class BackgroundDexOptService extends JobService {
        } finally {
        } finally {
            // Always let the pinner service know about changes.
            // Always let the pinner service know about changes.
            notifyPinService(updatedPackages);
            notifyPinService(updatedPackages);
            notifyPackagesUpdated(updatedPackages);
        }
        }
    }
    }


@@ -642,6 +647,32 @@ public class BackgroundDexOptService extends JobService {
        }
        }
    }
    }


    public static interface PackagesUpdatedListener {
        /** Callback when packages have been updated by the bg-dexopt service. */
        public void onPackagesUpdated(ArraySet<String> updatedPackages);
    }

    public static void addPackagesUpdatedListener(PackagesUpdatedListener listener) {
        synchronized (sPackagesUpdatedListeners) {
            sPackagesUpdatedListeners.add(listener);
        }
    }

    public static void removePackagesUpdatedListener(PackagesUpdatedListener listener) {
        synchronized (sPackagesUpdatedListeners) {
            sPackagesUpdatedListeners.remove(listener);
        }
    }

    /** Notify all listeners (#addPackagesUpdatedListener) that packages have been updated. */
    private void notifyPackagesUpdated(ArraySet<String> updatedPackages) {
        synchronized (sPackagesUpdatedListeners) {
            for (PackagesUpdatedListener listener : sPackagesUpdatedListeners) {
                listener.onPackagesUpdated(updatedPackages);
            }
        }
    }

    private static long getDowngradeUnusedAppsThresholdInMillis() {
    private static long getDowngradeUnusedAppsThresholdInMillis() {
        final String sysPropKey = "pm.dexopt.downgrade_after_inactive_days";
        final String sysPropKey = "pm.dexopt.downgrade_after_inactive_days";
        String sysPropValue = SystemProperties.get(sysPropKey);
        String sysPropValue = SystemProperties.get(sysPropKey);
+17 −0
Original line number Original line Diff line number Diff line
@@ -34,18 +34,21 @@ import android.os.Parcel;
import android.os.RemoteException;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.ServiceManager;
import android.os.SystemProperties;
import android.os.SystemProperties;
import android.util.ArraySet;
import android.util.Log;
import android.util.Log;


import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.IoThread;
import com.android.server.IoThread;
import com.android.server.LocalServices;
import com.android.server.LocalServices;
import com.android.server.SystemService;
import com.android.server.SystemService;
import com.android.server.pm.BackgroundDexOptService;
import com.android.server.wm.ActivityMetricsLaunchObserver;
import com.android.server.wm.ActivityMetricsLaunchObserver;
import com.android.server.wm.ActivityMetricsLaunchObserver.ActivityRecordProto;
import com.android.server.wm.ActivityMetricsLaunchObserver.ActivityRecordProto;
import com.android.server.wm.ActivityMetricsLaunchObserver.Temperature;
import com.android.server.wm.ActivityMetricsLaunchObserver.Temperature;
import com.android.server.wm.ActivityMetricsLaunchObserverRegistry;
import com.android.server.wm.ActivityMetricsLaunchObserverRegistry;
import com.android.server.wm.ActivityTaskManagerInternal;
import com.android.server.wm.ActivityTaskManagerInternal;


import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeUnit;
import java.util.HashMap;
import java.util.HashMap;


@@ -286,6 +289,7 @@ public class IorapForwardingService extends SystemService {


    private final AppLaunchObserver mAppLaunchObserver = new AppLaunchObserver();
    private final AppLaunchObserver mAppLaunchObserver = new AppLaunchObserver();
    private final EventSequenceValidator mEventSequenceValidator = new EventSequenceValidator();
    private final EventSequenceValidator mEventSequenceValidator = new EventSequenceValidator();
    private final DexOptPackagesUpdated mDexOptPackagesUpdated = new DexOptPackagesUpdated();
    private boolean mRegisteredListeners = false;
    private boolean mRegisteredListeners = false;


    private void registerInProcessListenersLocked() {
    private void registerInProcessListenersLocked() {
@@ -308,9 +312,22 @@ public class IorapForwardingService extends SystemService {
        launchObserverRegistry.registerLaunchObserver(mAppLaunchObserver);
        launchObserverRegistry.registerLaunchObserver(mAppLaunchObserver);
        launchObserverRegistry.registerLaunchObserver(mEventSequenceValidator);
        launchObserverRegistry.registerLaunchObserver(mEventSequenceValidator);


        BackgroundDexOptService.addPackagesUpdatedListener(mDexOptPackagesUpdated);


        mRegisteredListeners = true;
        mRegisteredListeners = true;
    }
    }


    private class DexOptPackagesUpdated implements BackgroundDexOptService.PackagesUpdatedListener {
        @Override
        public void onPackagesUpdated(ArraySet<String> updatedPackages) {
            String[] updated = updatedPackages.toArray(new String[0]);
            for (String packageName : updated) {
                Log.d(TAG, "onPackagesUpdated: " + packageName);
            }
        }
    }

    private class AppLaunchObserver implements ActivityMetricsLaunchObserver {
    private class AppLaunchObserver implements ActivityMetricsLaunchObserver {
        // We add a synthetic sequence ID here to make it easier to differentiate new
        // We add a synthetic sequence ID here to make it easier to differentiate new
        // launch sequences on the native side.
        // launch sequences on the native side.