Loading services/core/java/com/android/server/pm/BackgroundDexOptService.java +31 −0 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ import com.android.server.pm.dex.DexoptOptions; import java.io.File; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.concurrent.TimeUnit; Loading Loading @@ -106,6 +107,8 @@ public class BackgroundDexOptService extends JobService { private static final long mDowngradeUnusedAppsThresholdInMillis = getDowngradeUnusedAppsThresholdInMillis(); private static List<PackagesUpdatedListener> sPackagesUpdatedListeners = new ArrayList<>(); public static void schedule(Context context) { if (isBackgroundDexoptDisabled()) { return; Loading Loading @@ -244,6 +247,7 @@ public class BackgroundDexOptService extends JobService { } } notifyPinService(updatedPackages); notifyPackagesUpdated(updatedPackages); // Ran to completion, so we abandon our timeslice and do not reschedule. jobFinished(jobParams, /* reschedule */ false); } Loading Loading @@ -391,6 +395,7 @@ public class BackgroundDexOptService extends JobService { } finally { // Always let the pinner service know about changes. notifyPinService(updatedPackages); notifyPackagesUpdated(updatedPackages); } } Loading Loading @@ -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() { final String sysPropKey = "pm.dexopt.downgrade_after_inactive_days"; String sysPropValue = SystemProperties.get(sysPropKey); Loading startop/iorap/src/com/google/android/startop/iorap/IorapForwardingService.java +17 −0 Original line number Diff line number Diff line Loading @@ -34,18 +34,21 @@ import android.os.Parcel; import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemProperties; import android.util.ArraySet; import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import com.android.server.IoThread; import com.android.server.LocalServices; import com.android.server.SystemService; import com.android.server.pm.BackgroundDexOptService; import com.android.server.wm.ActivityMetricsLaunchObserver; import com.android.server.wm.ActivityMetricsLaunchObserver.ActivityRecordProto; import com.android.server.wm.ActivityMetricsLaunchObserver.Temperature; import com.android.server.wm.ActivityMetricsLaunchObserverRegistry; import com.android.server.wm.ActivityTaskManagerInternal; import java.util.ArrayList; import java.util.concurrent.TimeUnit; import java.util.HashMap; Loading Loading @@ -286,6 +289,7 @@ public class IorapForwardingService extends SystemService { private final AppLaunchObserver mAppLaunchObserver = new AppLaunchObserver(); private final EventSequenceValidator mEventSequenceValidator = new EventSequenceValidator(); private final DexOptPackagesUpdated mDexOptPackagesUpdated = new DexOptPackagesUpdated(); private boolean mRegisteredListeners = false; private void registerInProcessListenersLocked() { Loading @@ -308,9 +312,22 @@ public class IorapForwardingService extends SystemService { launchObserverRegistry.registerLaunchObserver(mAppLaunchObserver); launchObserverRegistry.registerLaunchObserver(mEventSequenceValidator); BackgroundDexOptService.addPackagesUpdatedListener(mDexOptPackagesUpdated); 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 { // We add a synthetic sequence ID here to make it easier to differentiate new // launch sequences on the native side. Loading Loading
services/core/java/com/android/server/pm/BackgroundDexOptService.java +31 −0 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ import com.android.server.pm.dex.DexoptOptions; import java.io.File; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.concurrent.TimeUnit; Loading Loading @@ -106,6 +107,8 @@ public class BackgroundDexOptService extends JobService { private static final long mDowngradeUnusedAppsThresholdInMillis = getDowngradeUnusedAppsThresholdInMillis(); private static List<PackagesUpdatedListener> sPackagesUpdatedListeners = new ArrayList<>(); public static void schedule(Context context) { if (isBackgroundDexoptDisabled()) { return; Loading Loading @@ -244,6 +247,7 @@ public class BackgroundDexOptService extends JobService { } } notifyPinService(updatedPackages); notifyPackagesUpdated(updatedPackages); // Ran to completion, so we abandon our timeslice and do not reschedule. jobFinished(jobParams, /* reschedule */ false); } Loading Loading @@ -391,6 +395,7 @@ public class BackgroundDexOptService extends JobService { } finally { // Always let the pinner service know about changes. notifyPinService(updatedPackages); notifyPackagesUpdated(updatedPackages); } } Loading Loading @@ -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() { final String sysPropKey = "pm.dexopt.downgrade_after_inactive_days"; String sysPropValue = SystemProperties.get(sysPropKey); Loading
startop/iorap/src/com/google/android/startop/iorap/IorapForwardingService.java +17 −0 Original line number Diff line number Diff line Loading @@ -34,18 +34,21 @@ import android.os.Parcel; import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemProperties; import android.util.ArraySet; import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import com.android.server.IoThread; import com.android.server.LocalServices; import com.android.server.SystemService; import com.android.server.pm.BackgroundDexOptService; import com.android.server.wm.ActivityMetricsLaunchObserver; import com.android.server.wm.ActivityMetricsLaunchObserver.ActivityRecordProto; import com.android.server.wm.ActivityMetricsLaunchObserver.Temperature; import com.android.server.wm.ActivityMetricsLaunchObserverRegistry; import com.android.server.wm.ActivityTaskManagerInternal; import java.util.ArrayList; import java.util.concurrent.TimeUnit; import java.util.HashMap; Loading Loading @@ -286,6 +289,7 @@ public class IorapForwardingService extends SystemService { private final AppLaunchObserver mAppLaunchObserver = new AppLaunchObserver(); private final EventSequenceValidator mEventSequenceValidator = new EventSequenceValidator(); private final DexOptPackagesUpdated mDexOptPackagesUpdated = new DexOptPackagesUpdated(); private boolean mRegisteredListeners = false; private void registerInProcessListenersLocked() { Loading @@ -308,9 +312,22 @@ public class IorapForwardingService extends SystemService { launchObserverRegistry.registerLaunchObserver(mAppLaunchObserver); launchObserverRegistry.registerLaunchObserver(mEventSequenceValidator); BackgroundDexOptService.addPackagesUpdatedListener(mDexOptPackagesUpdated); 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 { // We add a synthetic sequence ID here to make it easier to differentiate new // launch sequences on the native side. Loading