diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index 5cc32743af34a..b6ebcaea84002 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -112,7 +112,6 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.procstats.ServiceState; import com.android.internal.messages.nano.SystemMessageProto; import com.android.internal.notification.SystemNotificationChannels; -import com.android.internal.os.BatteryStatsImpl; import com.android.internal.os.TransferPipe; import com.android.internal.util.DumpUtils; import com.android.internal.util.FastPrintWriter; @@ -1069,10 +1068,13 @@ public final class ActiveServices { stracker.setStarted(true, mAm.mProcessStats.getMemFactorLocked(), r.lastActivity); } r.callStart = false; - FrameworkStatsLog.write(FrameworkStatsLog.SERVICE_STATE_CHANGED, r.appInfo.uid, - r.name.getPackageName(), r.name.getClassName(), - FrameworkStatsLog.SERVICE_STATE_CHANGED__STATE__START); - mAm.mBatteryStatsService.noteServiceStartRunning(r.stats); + + final int uid = r.appInfo.uid; + final String packageName = r.name.getPackageName(); + final String serviceName = r.name.getClassName(); + FrameworkStatsLog.write(FrameworkStatsLog.SERVICE_STATE_CHANGED, uid, packageName, + serviceName, FrameworkStatsLog.SERVICE_STATE_CHANGED__STATE__START); + mAm.mBatteryStatsService.noteServiceStartRunning(uid, packageName, serviceName); String error = bringUpServiceLocked(r, service.getFlags(), callerFg, false, false, false); if (error != null) { return new ComponentName("!!", error); @@ -1108,10 +1110,13 @@ public final class ActiveServices { service.delayedStop = true; return; } - FrameworkStatsLog.write(FrameworkStatsLog.SERVICE_STATE_CHANGED, service.appInfo.uid, - service.name.getPackageName(), service.name.getClassName(), - FrameworkStatsLog.SERVICE_STATE_CHANGED__STATE__STOP); - mAm.mBatteryStatsService.noteServiceStopRunning(service.stats); + + final int uid = service.appInfo.uid; + final String packageName = service.name.getPackageName(); + final String serviceName = service.name.getClassName(); + FrameworkStatsLog.write(FrameworkStatsLog.SERVICE_STATE_CHANGED, uid, packageName, + serviceName, FrameworkStatsLog.SERVICE_STATE_CHANGED__STATE__STOP); + mAm.mBatteryStatsService.noteServiceStopRunning(uid, packageName, serviceName); service.startRequested = false; if (service.tracker != null) { service.tracker.setStarted(false, mAm.mProcessStats.getMemFactorLocked(), @@ -1267,10 +1272,12 @@ public final class ActiveServices { } } - FrameworkStatsLog.write(FrameworkStatsLog.SERVICE_STATE_CHANGED, r.appInfo.uid, - r.name.getPackageName(), r.name.getClassName(), - FrameworkStatsLog.SERVICE_STATE_CHANGED__STATE__STOP); - mAm.mBatteryStatsService.noteServiceStopRunning(r.stats); + final int uid = r.appInfo.uid; + final String packageName = r.name.getPackageName(); + final String serviceName = r.name.getClassName(); + FrameworkStatsLog.write(FrameworkStatsLog.SERVICE_STATE_CHANGED, uid, packageName, + serviceName, FrameworkStatsLog.SERVICE_STATE_CHANGED__STATE__STOP); + mAm.mBatteryStatsService.noteServiceStopRunning(uid, packageName, serviceName); r.startRequested = false; if (r.tracker != null) { r.tracker.setStarted(false, mAm.mProcessStats.getMemFactorLocked(), @@ -2876,15 +2883,7 @@ public final class ActiveServices { final Intent.FilterComparison filter = new Intent.FilterComparison(service.cloneFilter()); final ServiceRestarter res = new ServiceRestarter(); - final BatteryStatsImpl.Uid.Pkg.Serv ss; - final BatteryStatsImpl stats = mAm.mBatteryStatsService.getActiveStatistics(); - synchronized (stats) { - ss = stats.getServiceStatsLocked( - sInfo.applicationInfo.uid, name.getPackageName(), - name.getClassName(), SystemClock.elapsedRealtime(), - SystemClock.uptimeMillis()); - } - r = new ServiceRecord(mAm, ss, className, name, definingPackageName, + r = new ServiceRecord(mAm, className, name, definingPackageName, definingUid, filter, sInfo, callingFromFg, res); r.mRecentCallingPackage = callingPackage; res.setService(r); @@ -3428,9 +3427,13 @@ public final class ActiveServices { EventLogTags.writeAmCreateService( r.userId, System.identityHashCode(r), nameTerm, r.app.uid, r.app.pid); } - FrameworkStatsLog.write(FrameworkStatsLog.SERVICE_LAUNCH_REPORTED, r.appInfo.uid, - r.name.getPackageName(), r.name.getClassName()); - mAm.mBatteryStatsService.noteServiceStartLaunch(r.stats); + + final int uid = r.appInfo.uid; + final String packageName = r.name.getPackageName(); + final String serviceName = r.name.getClassName(); + FrameworkStatsLog.write(FrameworkStatsLog.SERVICE_LAUNCH_REPORTED, uid, packageName, + serviceName); + mAm.mBatteryStatsService.noteServiceStartLaunch(uid, packageName, serviceName); mAm.notifyPackageUse(r.serviceInfo.packageName, PackageManager.NOTIFY_PACKAGE_USE_SERVICE); app.forceProcessStateUpTo(ActivityManager.PROCESS_STATE_SERVICE); @@ -3777,7 +3780,8 @@ public final class ActiveServices { smap.mDelayedStartList.remove(r); if (r.app != null) { - mAm.mBatteryStatsService.noteServiceStopLaunch(r.stats); + mAm.mBatteryStatsService.noteServiceStopLaunch(r.appInfo.uid, r.name.getPackageName(), + r.name.getClassName()); r.app.stopService(r); r.app.updateBoundClientUids(); if (r.whitelistManager) { @@ -4323,7 +4327,8 @@ public final class ActiveServices { // Clear app state from services. for (int i = app.numberOfRunningServices() - 1; i >= 0; i--) { ServiceRecord sr = app.getRunningServiceAt(i); - mAm.mBatteryStatsService.noteServiceStopLaunch(sr.stats); + mAm.mBatteryStatsService.noteServiceStopLaunch(sr.appInfo.uid, sr.name.getPackageName(), + sr.name.getClassName()); if (sr.app != app && sr.app != null && !sr.app.isPersistent()) { sr.app.stopService(sr); sr.app.updateBoundClientUids(); diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index 405ee72665781..4fb7abbd13568 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -2498,44 +2498,56 @@ public final class BatteryStatsService extends IBatteryStats.Stub } } - void noteServiceStartRunning(final BatteryStatsImpl.Uid.Pkg.Serv stats) { + void noteServiceStartRunning(int uid, String pkg, String name) { synchronized (mLock) { + final long elapsedRealtime = SystemClock.elapsedRealtime(); final long uptime = SystemClock.uptimeMillis(); mHandler.post(() -> { synchronized (mStats) { + final BatteryStatsImpl.Uid.Pkg.Serv stats = mStats.getServiceStatsLocked(uid, + pkg, name, elapsedRealtime, uptime); stats.startRunningLocked(uptime); } }); } } - void noteServiceStopRunning(final BatteryStatsImpl.Uid.Pkg.Serv stats) { + void noteServiceStopRunning(int uid, String pkg, String name) { synchronized (mLock) { + final long elapsedRealtime = SystemClock.elapsedRealtime(); final long uptime = SystemClock.uptimeMillis(); mHandler.post(() -> { synchronized (mStats) { + final BatteryStatsImpl.Uid.Pkg.Serv stats = mStats.getServiceStatsLocked(uid, + pkg, name, elapsedRealtime, uptime); stats.stopRunningLocked(uptime); } }); } } - void noteServiceStartLaunch(final BatteryStatsImpl.Uid.Pkg.Serv stats) { + void noteServiceStartLaunch(int uid, String pkg, String name) { synchronized (mLock) { + final long elapsedRealtime = SystemClock.elapsedRealtime(); final long uptime = SystemClock.uptimeMillis(); mHandler.post(() -> { synchronized (mStats) { + final BatteryStatsImpl.Uid.Pkg.Serv stats = mStats.getServiceStatsLocked(uid, + pkg, name, elapsedRealtime, uptime); stats.startLaunchedLocked(uptime); } }); } } - void noteServiceStopLaunch(final BatteryStatsImpl.Uid.Pkg.Serv stats) { + void noteServiceStopLaunch(int uid, String pkg, String name) { synchronized (mLock) { + final long elapsedRealtime = SystemClock.elapsedRealtime(); final long uptime = SystemClock.uptimeMillis(); mHandler.post(() -> { synchronized (mStats) { + final BatteryStatsImpl.Uid.Pkg.Serv stats = mStats.getServiceStatsLocked(uid, + pkg, name, elapsedRealtime, uptime); stats.stopLaunchedLocked(uptime); } }); diff --git a/services/core/java/com/android/server/am/ServiceRecord.java b/services/core/java/com/android/server/am/ServiceRecord.java index d9c83da69b930..8a1b4e3e832ed 100644 --- a/services/core/java/com/android/server/am/ServiceRecord.java +++ b/services/core/java/com/android/server/am/ServiceRecord.java @@ -46,7 +46,6 @@ import android.util.proto.ProtoUtils; import com.android.internal.annotations.GuardedBy; import com.android.internal.app.procstats.ServiceState; -import com.android.internal.os.BatteryStatsImpl; import com.android.server.LocalServices; import com.android.server.notification.NotificationManagerInternal; import com.android.server.uri.NeededUriGrants; @@ -70,7 +69,6 @@ final class ServiceRecord extends Binder implements ComponentName.WithComponentN static final int MAX_DONE_EXECUTING_COUNT = 6; final ActivityManagerService ams; - final BatteryStatsImpl.Uid.Pkg.Serv stats; final ComponentName name; // service component. final ComponentName instanceName; // service component's per-instance name. final String shortInstanceName; // instanceName.flattenToShortString(). @@ -518,13 +516,11 @@ final class ServiceRecord extends Binder implements ComponentName.WithComponentN } } - ServiceRecord(ActivityManagerService ams, - BatteryStatsImpl.Uid.Pkg.Serv servStats, ComponentName name, + ServiceRecord(ActivityManagerService ams, ComponentName name, ComponentName instanceName, String definingPackageName, int definingUid, Intent.FilterComparison intent, ServiceInfo sInfo, boolean callerIsFg, Runnable restarter) { this.ams = ams; - this.stats = servStats; this.name = name; this.instanceName = instanceName; shortInstanceName = instanceName.flattenToShortString(); diff --git a/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java b/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java index d032dbd5f47f7..8011ec2c8fa4a 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java @@ -1655,7 +1655,7 @@ public class MockingOomAdjusterTests { sService.mConstants.KEEP_WARMING_SERVICES.clear(); final ServiceInfo si = mock(ServiceInfo.class); si.applicationInfo = mock(ApplicationInfo.class); - ServiceRecord s = spy(new ServiceRecord(sService, null, cn, cn, null, 0, null, + ServiceRecord s = spy(new ServiceRecord(sService, cn, cn, null, 0, null, si, false, null)); doReturn(new ArrayMap>()).when(s).getConnections(); s.startRequested = true; @@ -1668,7 +1668,7 @@ public class MockingOomAdjusterTests { final ServiceInfo si2 = mock(ServiceInfo.class); si2.applicationInfo = mock(ApplicationInfo.class); si2.applicationInfo.uid = MOCKAPP2_UID_OTHER; - ServiceRecord s2 = spy(new ServiceRecord(sService, null, cn2, cn2, null, 0, null, + ServiceRecord s2 = spy(new ServiceRecord(sService, cn2, cn2, null, 0, null, si2, false, null)); doReturn(new ArrayMap>()).when(s2).getConnections(); s2.startRequested = true; @@ -1708,7 +1708,7 @@ public class MockingOomAdjusterTests { app.hasShownUi = true; sService.mConstants.KEEP_WARMING_SERVICES.add(cn); sService.mConstants.KEEP_WARMING_SERVICES.add(cn2); - s = spy(new ServiceRecord(sService, null, cn, cn, null, 0, null, + s = spy(new ServiceRecord(sService, cn, cn, null, 0, null, si, false, null)); doReturn(new ArrayMap>()).when(s).getConnections(); s.startRequested = true;