diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index ab9c7e81a88ee..18aa0d06d6dcd 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -121,8 +121,7 @@ message Atom { ANROccurred anr_occurred = 79; WTFOccurred wtf_occurred = 80; LowMemReported low_mem_reported = 81; - - + ThermalThrottlingStateChanged thermal_throttling = 86; } // Pulled events will start at field 10000. @@ -197,6 +196,26 @@ message AttributionNode { * ***************************************************************************** */ +/** + * Logs when the Thermal service HAL notifies the throttling start/stop events. + * + * Logged from: + * frameworks/base/services/core/java/com/android/server/stats/StatsCompanionService.java + */ +message ThermalThrottlingStateChanged { + optional android.os.TemperatureTypeEnum sensor_type = 1; + + enum State { + UNKNOWN = 0; + START = 1; + STOP = 2; + } + + optional State state = 2; + + optional float temperature = 3; +} + /** * Logs when the screen state changes. * diff --git a/services/core/java/com/android/server/stats/StatsCompanionService.java b/services/core/java/com/android/server/stats/StatsCompanionService.java index 37984163e4a95..d683dbd9a675e 100644 --- a/services/core/java/com/android/server/stats/StatsCompanionService.java +++ b/services/core/java/com/android/server/stats/StatsCompanionService.java @@ -43,6 +43,8 @@ import android.os.FileUtils; import android.os.IBinder; import android.os.IStatsCompanionService; import android.os.IStatsManager; +import android.os.IThermalEventListener; +import android.os.IThermalService; import android.os.Parcelable; import android.os.Process; import android.os.RemoteException; @@ -52,6 +54,7 @@ import android.os.StatsDimensionsValue; import android.os.StatsLogEventWrapper; import android.os.SynchronousResultReceiver; import android.os.SystemClock; +import android.os.Temperature; import android.os.UserHandle; import android.os.UserManager; import android.telephony.ModemActivityInfo; @@ -153,6 +156,8 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { private KernelUidCpuClusterTimeReader mKernelUidCpuClusterTimeReader = new KernelUidCpuClusterTimeReader(); + private static IThermalService sThermalService; + public StatsCompanionService(Context context) { super(); mContext = context; @@ -203,6 +208,24 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { long[] freqs = mKernelUidCpuFreqTimeReader.readFreqs(powerProfile); mKernelUidCpuClusterTimeReader.setThrottleInterval(0); mKernelUidCpuActiveTimeReader.setThrottleInterval(0); + + // Enable push notifications of throttling from vendor thermal + // management subsystem via thermalservice. + IBinder b = ServiceManager.getService("thermalservice"); + + if (b != null) { + sThermalService = IThermalService.Stub.asInterface(b); + try { + sThermalService.registerThermalEventListener( + new ThermalEventListener()); + Slog.i(TAG, "register thermal listener successfully"); + } catch (RemoteException e) { + // Should never happen. + Slog.e(TAG, "register thermal listener error"); + } + } else { + Slog.e(TAG, "cannot find thermalservice, no throttling push notifications"); + } } @Override @@ -1181,4 +1204,11 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { } } + // Thermal event received from vendor thermal management subsystem + private static final class ThermalEventListener extends IThermalEventListener.Stub { + @Override public void notifyThrottling(boolean isThrottling, Temperature temp) { + StatsLog.write(StatsLog.THERMAL_THROTTLING, temp.getType(), + isThrottling ? 1 : 0, temp.getValue()); + } + } }