Merge "Remove BatteryStatsService.mStats lock dependancy from ActiveService"

This commit is contained in:
Michael Wachenschwanz
2021-01-20 18:11:16 +00:00
committed by Android (Google) Code Review
4 changed files with 52 additions and 39 deletions

View File

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

View File

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

View File

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

View File

@@ -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<IBinder, ArrayList<ConnectionRecord>>()).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<IBinder, ArrayList<ConnectionRecord>>()).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<IBinder, ArrayList<ConnectionRecord>>()).when(s).getConnections();
s.startRequested = true;