Merge "Move PowerStatsLogger off of the main thread."
This commit is contained in:
@@ -35,7 +35,6 @@ import android.util.proto.ProtoInputStream;
|
|||||||
import android.util.proto.ProtoOutputStream;
|
import android.util.proto.ProtoOutputStream;
|
||||||
|
|
||||||
import com.android.internal.annotations.VisibleForTesting;
|
import com.android.internal.annotations.VisibleForTesting;
|
||||||
|
|
||||||
import com.android.server.powerstats.PowerStatsHALWrapper.IPowerStatsHALWrapper;
|
import com.android.server.powerstats.PowerStatsHALWrapper.IPowerStatsHALWrapper;
|
||||||
import com.android.server.powerstats.ProtoStreamUtils.ChannelUtils;
|
import com.android.server.powerstats.ProtoStreamUtils.ChannelUtils;
|
||||||
import com.android.server.powerstats.ProtoStreamUtils.EnergyConsumerResultUtils;
|
import com.android.server.powerstats.ProtoStreamUtils.EnergyConsumerResultUtils;
|
||||||
@@ -313,12 +312,12 @@ public final class PowerStatsLogger extends Handler {
|
|||||||
return mStartWallTime;
|
return mStartWallTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
public PowerStatsLogger(Context context, File dataStoragePath,
|
public PowerStatsLogger(Context context, Looper looper, File dataStoragePath,
|
||||||
String meterFilename, String meterCacheFilename,
|
String meterFilename, String meterCacheFilename,
|
||||||
String modelFilename, String modelCacheFilename,
|
String modelFilename, String modelCacheFilename,
|
||||||
String residencyFilename, String residencyCacheFilename,
|
String residencyFilename, String residencyCacheFilename,
|
||||||
IPowerStatsHALWrapper powerStatsHALWrapper) {
|
IPowerStatsHALWrapper powerStatsHALWrapper) {
|
||||||
super(Looper.getMainLooper());
|
super(looper);
|
||||||
mStartWallTime = currentTimeMillis() - SystemClock.elapsedRealtime();
|
mStartWallTime = currentTimeMillis() - SystemClock.elapsedRealtime();
|
||||||
if (DEBUG) Slog.d(TAG, "mStartWallTime: " + mStartWallTime);
|
if (DEBUG) Slog.d(TAG, "mStartWallTime: " + mStartWallTime);
|
||||||
mPowerStatsHALWrapper = powerStatsHALWrapper;
|
mPowerStatsHALWrapper = powerStatsHALWrapper;
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ import android.os.Binder;
|
|||||||
import android.os.Environment;
|
import android.os.Environment;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.HandlerThread;
|
import android.os.HandlerThread;
|
||||||
|
import android.os.Looper;
|
||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
import android.power.PowerStatsInternal;
|
import android.power.PowerStatsInternal;
|
||||||
import android.util.Slog;
|
import android.util.Slog;
|
||||||
@@ -79,6 +80,9 @@ public class PowerStatsService extends SystemService {
|
|||||||
private StatsPullAtomCallbackImpl mPullAtomCallback;
|
private StatsPullAtomCallbackImpl mPullAtomCallback;
|
||||||
@Nullable
|
@Nullable
|
||||||
private PowerStatsInternal mPowerStatsInternal;
|
private PowerStatsInternal mPowerStatsInternal;
|
||||||
|
@Nullable
|
||||||
|
@GuardedBy("this")
|
||||||
|
private Looper mLooper;
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
static class Injector {
|
static class Injector {
|
||||||
@@ -127,12 +131,12 @@ public class PowerStatsService extends SystemService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PowerStatsLogger createPowerStatsLogger(Context context, File dataStoragePath,
|
PowerStatsLogger createPowerStatsLogger(Context context, Looper looper,
|
||||||
String meterFilename, String meterCacheFilename,
|
File dataStoragePath, String meterFilename, String meterCacheFilename,
|
||||||
String modelFilename, String modelCacheFilename,
|
String modelFilename, String modelCacheFilename,
|
||||||
String residencyFilename, String residencyCacheFilename,
|
String residencyFilename, String residencyCacheFilename,
|
||||||
IPowerStatsHALWrapper powerStatsHALWrapper) {
|
IPowerStatsHALWrapper powerStatsHALWrapper) {
|
||||||
return new PowerStatsLogger(context, dataStoragePath,
|
return new PowerStatsLogger(context, looper, dataStoragePath,
|
||||||
meterFilename, meterCacheFilename,
|
meterFilename, meterCacheFilename,
|
||||||
modelFilename, modelCacheFilename,
|
modelFilename, modelCacheFilename,
|
||||||
residencyFilename, residencyCacheFilename,
|
residencyFilename, residencyCacheFilename,
|
||||||
@@ -229,11 +233,11 @@ public class PowerStatsService extends SystemService {
|
|||||||
mDataStoragePath = mInjector.createDataStoragePath();
|
mDataStoragePath = mInjector.createDataStoragePath();
|
||||||
|
|
||||||
// Only start logger and triggers if initialization is successful.
|
// Only start logger and triggers if initialization is successful.
|
||||||
mPowerStatsLogger = mInjector.createPowerStatsLogger(mContext, mDataStoragePath,
|
mPowerStatsLogger = mInjector.createPowerStatsLogger(mContext, getLooper(),
|
||||||
mInjector.createMeterFilename(), mInjector.createMeterCacheFilename(),
|
mDataStoragePath, mInjector.createMeterFilename(),
|
||||||
mInjector.createModelFilename(), mInjector.createModelCacheFilename(),
|
mInjector.createMeterCacheFilename(), mInjector.createModelFilename(),
|
||||||
mInjector.createResidencyFilename(), mInjector.createResidencyCacheFilename(),
|
mInjector.createModelCacheFilename(), mInjector.createResidencyFilename(),
|
||||||
getPowerStatsHal());
|
mInjector.createResidencyCacheFilename(), getPowerStatsHal());
|
||||||
mBatteryTrigger = mInjector.createBatteryTrigger(mContext, mPowerStatsLogger);
|
mBatteryTrigger = mInjector.createBatteryTrigger(mContext, mPowerStatsLogger);
|
||||||
mTimerTrigger = mInjector.createTimerTrigger(mContext, mPowerStatsLogger);
|
mTimerTrigger = mInjector.createTimerTrigger(mContext, mPowerStatsLogger);
|
||||||
} else {
|
} else {
|
||||||
@@ -245,6 +249,17 @@ public class PowerStatsService extends SystemService {
|
|||||||
return mInjector.getPowerStatsHALWrapperImpl();
|
return mInjector.getPowerStatsHALWrapperImpl();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Looper getLooper() {
|
||||||
|
synchronized (this) {
|
||||||
|
if (mLooper == null) {
|
||||||
|
HandlerThread thread = new HandlerThread(TAG);
|
||||||
|
thread.start();
|
||||||
|
return thread.getLooper();
|
||||||
|
}
|
||||||
|
return mLooper;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public PowerStatsService(Context context) {
|
public PowerStatsService(Context context) {
|
||||||
this(context, new Injector());
|
this(context, new Injector());
|
||||||
}
|
}
|
||||||
@@ -260,9 +275,7 @@ public class PowerStatsService extends SystemService {
|
|||||||
private final Handler mHandler;
|
private final Handler mHandler;
|
||||||
|
|
||||||
LocalService() {
|
LocalService() {
|
||||||
HandlerThread thread = new HandlerThread(TAG);
|
mHandler = new Handler(getLooper());
|
||||||
thread.start();
|
|
||||||
mHandler = new Handler(thread.getLooper());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ import android.hardware.power.stats.PowerEntity;
|
|||||||
import android.hardware.power.stats.State;
|
import android.hardware.power.stats.State;
|
||||||
import android.hardware.power.stats.StateResidency;
|
import android.hardware.power.stats.StateResidency;
|
||||||
import android.hardware.power.stats.StateResidencyResult;
|
import android.hardware.power.stats.StateResidencyResult;
|
||||||
|
import android.os.Looper;
|
||||||
|
|
||||||
import androidx.test.InstrumentationRegistry;
|
import androidx.test.InstrumentationRegistry;
|
||||||
|
|
||||||
@@ -145,12 +146,12 @@ public class PowerStatsServiceTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
PowerStatsLogger createPowerStatsLogger(Context context, File dataStoragePath,
|
PowerStatsLogger createPowerStatsLogger(Context context, Looper looper,
|
||||||
String meterFilename, String meterCacheFilename,
|
File dataStoragePath, String meterFilename, String meterCacheFilename,
|
||||||
String modelFilename, String modelCacheFilename,
|
String modelFilename, String modelCacheFilename,
|
||||||
String residencyFilename, String residencyCacheFilename,
|
String residencyFilename, String residencyCacheFilename,
|
||||||
IPowerStatsHALWrapper powerStatsHALWrapper) {
|
IPowerStatsHALWrapper powerStatsHALWrapper) {
|
||||||
mPowerStatsLogger = new PowerStatsLogger(context, dataStoragePath,
|
mPowerStatsLogger = new PowerStatsLogger(context, looper, dataStoragePath,
|
||||||
meterFilename, meterCacheFilename,
|
meterFilename, meterCacheFilename,
|
||||||
modelFilename, modelCacheFilename,
|
modelFilename, modelCacheFilename,
|
||||||
residencyFilename, residencyCacheFilename,
|
residencyFilename, residencyCacheFilename,
|
||||||
|
|||||||
Reference in New Issue
Block a user