Merge "dexopt: Add listeners when packages are updated by bg-dexopt" into rvc-dev am: 9b2931e973 am: 42e6558150

Change-Id: Id948e2c1f7422294d3a3c3ab866f5c001f115f37
This commit is contained in:
TreeHugger Robot
2020-04-08 19:58:51 +00:00
committed by Automerger Merge Worker
2 changed files with 48 additions and 0 deletions

View File

@@ -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);

View File

@@ -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.