Loading services/core/java/android/power/PowerStatsInternal.java +11 −5 Original line number Diff line number Diff line Loading @@ -50,7 +50,8 @@ public abstract class PowerStatsInternal { * requested. * * @return A Future containing a list of {@link EnergyConsumerResult} objects containing energy * consumer results for all listed {@link EnergyConsumerId}. * consumer results for all listed {@link EnergyConsumerId}. null if * {@link EnergyConsumer} not supported */ @NonNull public abstract CompletableFuture<EnergyConsumerResult[]> getEnergyConsumedAsync( Loading @@ -59,8 +60,10 @@ public abstract class PowerStatsInternal { /** * Returns the power entity info for all available {@link PowerEntity} * * @return List of available {@link PowerEntity} * @return List of available {@link PowerEntity} or null if {@link PowerEntity} not * supported */ @Nullable public abstract PowerEntity[] getPowerEntityInfo(); /** Loading @@ -71,7 +74,8 @@ public abstract class PowerStatsInternal { * requested. * * @return A Future containing a list of {@link StateResidencyResult} objects containing state * residency results for all listed {@link PowerEntity.id}. * residency results for all listed {@link PowerEntity.id}. null if {@link PowerEntity} * not supported */ @NonNull public abstract CompletableFuture<StateResidencyResult[]> getStateResidencyAsync( Loading @@ -80,8 +84,9 @@ public abstract class PowerStatsInternal { /** * Returns the channel info for all available {@link Channel} * * @return List of available {@link Channel} * @return List of available {@link Channel} or null if {@link Channel} not supported */ @Nullable public abstract Channel[] getEnergyMeterInfo(); /** Loading @@ -91,7 +96,8 @@ public abstract class PowerStatsInternal { * @param channelIds Array of {@link Channel.id} for accumulated energy is being requested. * * @return A Future containing a list of {@link EnergyMeasurement} objects containing * accumulated energy measurements for all listed {@link Channel.id}. * accumulated energy measurements for all listed {@link Channel.id}. null if * {@link Channel} not supported */ @NonNull public abstract CompletableFuture<EnergyMeasurement[]> readEnergyMeterAsync( Loading services/core/java/com/android/server/am/BatteryStatsService.java +3 −1 Original line number Diff line number Diff line Loading @@ -216,6 +216,8 @@ public final class BatteryStatsService extends IBatteryStats.Stub return; } if (results == null) return; for (int i = 0; i < results.length; i++) { final StateResidencyResult result = results[i]; RpmStats.PowerStateSubsystem subsystem = Loading Loading @@ -257,7 +259,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub return EMPTY; } if (results.length == 0) return EMPTY; if (results == null || results.length == 0) return EMPTY; int charsLeft = MAX_LOW_POWER_STATS_SIZE; StringBuilder builder = new StringBuilder("SubsystemPowerState"); Loading services/core/java/com/android/server/powerstats/PowerStatsHALWrapper.java +7 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.server.powerstats; import android.annotation.Nullable; import android.hardware.power.stats.Channel; import android.hardware.power.stats.EnergyMeasurement; import android.hardware.power.stats.IPowerStats; Loading Loading @@ -51,6 +52,7 @@ public final class PowerStatsHALWrapper { * * @return List of information on each PowerEntity. */ @Nullable android.hardware.power.stats.PowerEntity[] getPowerEntityInfo(); /** Loading @@ -70,6 +72,7 @@ public final class PowerStatsHALWrapper { * * @return StateResidency since boot for each requested PowerEntity */ @Nullable android.hardware.power.stats.StateResidencyResult[] getStateResidency(int[] powerEntityIds); /** Loading @@ -81,6 +84,7 @@ public final class PowerStatsHALWrapper { * * @return List of EnergyConsumers all available energy consumers. */ @Nullable android.hardware.power.stats.EnergyConsumer[] getEnergyConsumerInfo(); /** Loading @@ -96,6 +100,7 @@ public final class PowerStatsHALWrapper { * @return List of EnergyConsumerResult objects containing energy consumer results for all * available energy consumers (power models). */ @Nullable android.hardware.power.stats.EnergyConsumerResult[] getEnergyConsumed( int[] energyConsumerIds); Loading @@ -105,6 +110,7 @@ public final class PowerStatsHALWrapper { * @return List of Channel objects containing channel info for all available energy * meters. */ @Nullable android.hardware.power.stats.Channel[] getEnergyMeterInfo(); /** Loading @@ -120,6 +126,7 @@ public final class PowerStatsHALWrapper { * @return List of EnergyMeasurement objects containing energy measurements for all * available energy meters. */ @Nullable android.hardware.power.stats.EnergyMeasurement[] readEnergyMeter(int[] channelIds); /** Loading services/core/java/com/android/server/powerstats/StatsPullAtomCallbackImpl.java +4 −0 Original line number Diff line number Diff line Loading @@ -87,6 +87,8 @@ public class StatsPullAtomCallbackImpl implements StatsManager.StatsPullAtomCall return StatsManager.PULL_SKIP; } if (energyMeasurements == null) return StatsManager.PULL_SKIP; for (int i = 0; i < energyMeasurements.length; i++) { // Only report energy measurements that have been accumulated since boot final EnergyMeasurement energyMeasurement = energyMeasurements[i]; Loading Loading @@ -135,6 +137,8 @@ public class StatsPullAtomCallbackImpl implements StatsManager.StatsPullAtomCall return StatsManager.PULL_SKIP; } if (results == null) return StatsManager.PULL_SKIP; for (int i = 0; i < results.length; i++) { final StateResidencyResult result = results[i]; for (int j = 0; j < result.stateResidencyData.length; j++) { Loading services/core/jni/com_android_server_powerstats_PowerStatsService.cpp +42 −58 Original line number Diff line number Diff line Loading @@ -217,11 +217,7 @@ static jobjectArray nativeGetStateResidency(JNIEnv *env, jclass clazz, jintArray jobjectArray stateResidencyResultArray = nullptr; Return<void> ret = gPowerStatsHalV1_0_ptr->getPowerEntityStateResidencyData( powerEntityIdVector, [&env, &stateResidencyResultArray](auto results, auto status) { if (status != Status::SUCCESS) { ALOGE("Error getting power entity state residency data"); } else { stateResidencyResultArray = env->NewObjectArray(results.size(), class_SRR, nullptr); stateResidencyResultArray = env->NewObjectArray(results.size(), class_SRR, nullptr); for (int i = 0; i < results.size(); i++) { jobjectArray stateResidencyArray = env->NewObjectArray(results[i].stateResidencyData.size(), class_SR, Loading @@ -233,26 +229,19 @@ static jobjectArray nativeGetStateResidency(JNIEnv *env, jclass clazz, jintArray env->SetLongField(stateResidency, field_SR_totalTimeInStateMs, results[i].stateResidencyData[j].totalTimeInStateMs); env->SetLongField(stateResidency, field_SR_totalStateEntryCount, results[i] .stateResidencyData[j] .totalStateEntryCount); results[i].stateResidencyData[j].totalStateEntryCount); env->SetLongField(stateResidency, field_SR_lastEntryTimestampMs, results[i] .stateResidencyData[j] .lastEntryTimestampMs); results[i].stateResidencyData[j].lastEntryTimestampMs); env->SetObjectArrayElement(stateResidencyArray, j, stateResidency); env->DeleteLocalRef(stateResidency); } jobject stateResidencyResult = env->NewObject(class_SRR, method_SRR_init); env->SetIntField(stateResidencyResult, field_SRR_id, results[i].powerEntityId); env->SetIntField(stateResidencyResult, field_SRR_id, results[i].powerEntityId); env->SetObjectField(stateResidencyResult, field_SRR_stateResidencyData, stateResidencyArray); env->SetObjectArrayElement(stateResidencyResultArray, i, stateResidencyResult); env->SetObjectArrayElement(stateResidencyResultArray, i, stateResidencyResult); env->DeleteLocalRef(stateResidencyResult); } } }); if (!checkResult(ret, __func__)) { return nullptr; Loading Loading @@ -320,9 +309,6 @@ static jobjectArray nativeReadEnergyMeters(JNIEnv *env, jclass clazz, jintArray gPowerStatsHalV1_0_ptr ->getEnergyData(channelIdVector, [&env, &energyMeasurementArray](auto energyData, auto status) { if (status != Status::SUCCESS) { ALOGW("Error getting energy data"); } else { energyMeasurementArray = env->NewObjectArray(energyData.size(), class_EM, nullptr); Loading @@ -337,14 +323,12 @@ static jobjectArray nativeReadEnergyMeters(JNIEnv *env, jclass clazz, jintArray env->SetLongField(energyMeasurement, field_EM_durationMs, energyData[i].timestamp); env->SetLongField(energyMeasurement, field_EM_energyUWs, env->SetLongField(energyMeasurement, field_EM_energyUWs, energyData[i].energy); env->SetObjectArrayElement(energyMeasurementArray, i, energyMeasurement); env->SetObjectArrayElement(energyMeasurementArray, i, energyMeasurement); env->DeleteLocalRef(energyMeasurement); } } }); if (!checkResult(ret, __func__)) { Loading Loading
services/core/java/android/power/PowerStatsInternal.java +11 −5 Original line number Diff line number Diff line Loading @@ -50,7 +50,8 @@ public abstract class PowerStatsInternal { * requested. * * @return A Future containing a list of {@link EnergyConsumerResult} objects containing energy * consumer results for all listed {@link EnergyConsumerId}. * consumer results for all listed {@link EnergyConsumerId}. null if * {@link EnergyConsumer} not supported */ @NonNull public abstract CompletableFuture<EnergyConsumerResult[]> getEnergyConsumedAsync( Loading @@ -59,8 +60,10 @@ public abstract class PowerStatsInternal { /** * Returns the power entity info for all available {@link PowerEntity} * * @return List of available {@link PowerEntity} * @return List of available {@link PowerEntity} or null if {@link PowerEntity} not * supported */ @Nullable public abstract PowerEntity[] getPowerEntityInfo(); /** Loading @@ -71,7 +74,8 @@ public abstract class PowerStatsInternal { * requested. * * @return A Future containing a list of {@link StateResidencyResult} objects containing state * residency results for all listed {@link PowerEntity.id}. * residency results for all listed {@link PowerEntity.id}. null if {@link PowerEntity} * not supported */ @NonNull public abstract CompletableFuture<StateResidencyResult[]> getStateResidencyAsync( Loading @@ -80,8 +84,9 @@ public abstract class PowerStatsInternal { /** * Returns the channel info for all available {@link Channel} * * @return List of available {@link Channel} * @return List of available {@link Channel} or null if {@link Channel} not supported */ @Nullable public abstract Channel[] getEnergyMeterInfo(); /** Loading @@ -91,7 +96,8 @@ public abstract class PowerStatsInternal { * @param channelIds Array of {@link Channel.id} for accumulated energy is being requested. * * @return A Future containing a list of {@link EnergyMeasurement} objects containing * accumulated energy measurements for all listed {@link Channel.id}. * accumulated energy measurements for all listed {@link Channel.id}. null if * {@link Channel} not supported */ @NonNull public abstract CompletableFuture<EnergyMeasurement[]> readEnergyMeterAsync( Loading
services/core/java/com/android/server/am/BatteryStatsService.java +3 −1 Original line number Diff line number Diff line Loading @@ -216,6 +216,8 @@ public final class BatteryStatsService extends IBatteryStats.Stub return; } if (results == null) return; for (int i = 0; i < results.length; i++) { final StateResidencyResult result = results[i]; RpmStats.PowerStateSubsystem subsystem = Loading Loading @@ -257,7 +259,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub return EMPTY; } if (results.length == 0) return EMPTY; if (results == null || results.length == 0) return EMPTY; int charsLeft = MAX_LOW_POWER_STATS_SIZE; StringBuilder builder = new StringBuilder("SubsystemPowerState"); Loading
services/core/java/com/android/server/powerstats/PowerStatsHALWrapper.java +7 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.server.powerstats; import android.annotation.Nullable; import android.hardware.power.stats.Channel; import android.hardware.power.stats.EnergyMeasurement; import android.hardware.power.stats.IPowerStats; Loading Loading @@ -51,6 +52,7 @@ public final class PowerStatsHALWrapper { * * @return List of information on each PowerEntity. */ @Nullable android.hardware.power.stats.PowerEntity[] getPowerEntityInfo(); /** Loading @@ -70,6 +72,7 @@ public final class PowerStatsHALWrapper { * * @return StateResidency since boot for each requested PowerEntity */ @Nullable android.hardware.power.stats.StateResidencyResult[] getStateResidency(int[] powerEntityIds); /** Loading @@ -81,6 +84,7 @@ public final class PowerStatsHALWrapper { * * @return List of EnergyConsumers all available energy consumers. */ @Nullable android.hardware.power.stats.EnergyConsumer[] getEnergyConsumerInfo(); /** Loading @@ -96,6 +100,7 @@ public final class PowerStatsHALWrapper { * @return List of EnergyConsumerResult objects containing energy consumer results for all * available energy consumers (power models). */ @Nullable android.hardware.power.stats.EnergyConsumerResult[] getEnergyConsumed( int[] energyConsumerIds); Loading @@ -105,6 +110,7 @@ public final class PowerStatsHALWrapper { * @return List of Channel objects containing channel info for all available energy * meters. */ @Nullable android.hardware.power.stats.Channel[] getEnergyMeterInfo(); /** Loading @@ -120,6 +126,7 @@ public final class PowerStatsHALWrapper { * @return List of EnergyMeasurement objects containing energy measurements for all * available energy meters. */ @Nullable android.hardware.power.stats.EnergyMeasurement[] readEnergyMeter(int[] channelIds); /** Loading
services/core/java/com/android/server/powerstats/StatsPullAtomCallbackImpl.java +4 −0 Original line number Diff line number Diff line Loading @@ -87,6 +87,8 @@ public class StatsPullAtomCallbackImpl implements StatsManager.StatsPullAtomCall return StatsManager.PULL_SKIP; } if (energyMeasurements == null) return StatsManager.PULL_SKIP; for (int i = 0; i < energyMeasurements.length; i++) { // Only report energy measurements that have been accumulated since boot final EnergyMeasurement energyMeasurement = energyMeasurements[i]; Loading Loading @@ -135,6 +137,8 @@ public class StatsPullAtomCallbackImpl implements StatsManager.StatsPullAtomCall return StatsManager.PULL_SKIP; } if (results == null) return StatsManager.PULL_SKIP; for (int i = 0; i < results.length; i++) { final StateResidencyResult result = results[i]; for (int j = 0; j < result.stateResidencyData.length; j++) { Loading
services/core/jni/com_android_server_powerstats_PowerStatsService.cpp +42 −58 Original line number Diff line number Diff line Loading @@ -217,11 +217,7 @@ static jobjectArray nativeGetStateResidency(JNIEnv *env, jclass clazz, jintArray jobjectArray stateResidencyResultArray = nullptr; Return<void> ret = gPowerStatsHalV1_0_ptr->getPowerEntityStateResidencyData( powerEntityIdVector, [&env, &stateResidencyResultArray](auto results, auto status) { if (status != Status::SUCCESS) { ALOGE("Error getting power entity state residency data"); } else { stateResidencyResultArray = env->NewObjectArray(results.size(), class_SRR, nullptr); stateResidencyResultArray = env->NewObjectArray(results.size(), class_SRR, nullptr); for (int i = 0; i < results.size(); i++) { jobjectArray stateResidencyArray = env->NewObjectArray(results[i].stateResidencyData.size(), class_SR, Loading @@ -233,26 +229,19 @@ static jobjectArray nativeGetStateResidency(JNIEnv *env, jclass clazz, jintArray env->SetLongField(stateResidency, field_SR_totalTimeInStateMs, results[i].stateResidencyData[j].totalTimeInStateMs); env->SetLongField(stateResidency, field_SR_totalStateEntryCount, results[i] .stateResidencyData[j] .totalStateEntryCount); results[i].stateResidencyData[j].totalStateEntryCount); env->SetLongField(stateResidency, field_SR_lastEntryTimestampMs, results[i] .stateResidencyData[j] .lastEntryTimestampMs); results[i].stateResidencyData[j].lastEntryTimestampMs); env->SetObjectArrayElement(stateResidencyArray, j, stateResidency); env->DeleteLocalRef(stateResidency); } jobject stateResidencyResult = env->NewObject(class_SRR, method_SRR_init); env->SetIntField(stateResidencyResult, field_SRR_id, results[i].powerEntityId); env->SetIntField(stateResidencyResult, field_SRR_id, results[i].powerEntityId); env->SetObjectField(stateResidencyResult, field_SRR_stateResidencyData, stateResidencyArray); env->SetObjectArrayElement(stateResidencyResultArray, i, stateResidencyResult); env->SetObjectArrayElement(stateResidencyResultArray, i, stateResidencyResult); env->DeleteLocalRef(stateResidencyResult); } } }); if (!checkResult(ret, __func__)) { return nullptr; Loading Loading @@ -320,9 +309,6 @@ static jobjectArray nativeReadEnergyMeters(JNIEnv *env, jclass clazz, jintArray gPowerStatsHalV1_0_ptr ->getEnergyData(channelIdVector, [&env, &energyMeasurementArray](auto energyData, auto status) { if (status != Status::SUCCESS) { ALOGW("Error getting energy data"); } else { energyMeasurementArray = env->NewObjectArray(energyData.size(), class_EM, nullptr); Loading @@ -337,14 +323,12 @@ static jobjectArray nativeReadEnergyMeters(JNIEnv *env, jclass clazz, jintArray env->SetLongField(energyMeasurement, field_EM_durationMs, energyData[i].timestamp); env->SetLongField(energyMeasurement, field_EM_energyUWs, env->SetLongField(energyMeasurement, field_EM_energyUWs, energyData[i].energy); env->SetObjectArrayElement(energyMeasurementArray, i, energyMeasurement); env->SetObjectArrayElement(energyMeasurementArray, i, energyMeasurement); env->DeleteLocalRef(energyMeasurement); } } }); if (!checkResult(ret, __func__)) { Loading