From d8b441150ef35c1518203a465c0b622d23d60cbd Mon Sep 17 00:00:00 2001 From: Ahmed ElArabawy Date: Tue, 23 May 2017 21:25:02 +0000 Subject: Revert "Revert "power hal: Use power HAL API 1.1"" This reverts commit 48b908bd77abe10880747ebc10659027adc772f4. and brings back commit 0a4e11480b277108234f4dcab980d7c7bd6e49f5 This commit directs framework to use Power HAL 1.1 The commit has been tested not to cause application startup time regression which was the reason of reverting the original commit Bug: 62040325 Test: Performance Tests along with other tests Change-Id: I84fdff3136c85e62223e2ae2f66b5bcad4e491b8 Signed-off-by: Ahmed ElArabawy --- core/java/android/os/BatteryStats.java | 12 +++ .../com/android/internal/os/BatteryStatsImpl.java | 7 ++ .../com/android/server/am/BatteryStatsService.java | 23 +++++ services/core/jni/Android.mk | 1 + .../com_android_server_am_BatteryStatsService.cpp | 99 ++++++++++++++++++++++ 5 files changed, 142 insertions(+) diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index 499d6bbdf535..f821f59ff9f9 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -1206,6 +1206,7 @@ public abstract class BatteryStats implements Parcelable { // Platform-level low power state stats public String statPlatformIdleState; + public String statSubsystemPowerState; public HistoryStepDetails() { clear(); @@ -1237,6 +1238,7 @@ public abstract class BatteryStats implements Parcelable { out.writeInt(statSoftIrqTime); out.writeInt(statIdlTime); out.writeString(statPlatformIdleState); + out.writeString(statSubsystemPowerState); } public void readFromParcel(Parcel in) { @@ -1258,6 +1260,7 @@ public abstract class BatteryStats implements Parcelable { statSoftIrqTime = in.readInt(); statIdlTime = in.readInt(); statPlatformIdleState = in.readString(); + statSubsystemPowerState = in.readString(); } } @@ -5445,6 +5448,10 @@ public abstract class BatteryStats implements Parcelable { pw.print(", PlatformIdleStat "); pw.print(rec.stepDetails.statPlatformIdleState); pw.println(); + + pw.print(", SubsystemPowerState "); + pw.print(rec.stepDetails.statSubsystemPowerState); + pw.println(); } else { pw.print(BATTERY_STATS_CHECKIN_VERSION); pw.print(','); pw.print(HISTORY_DATA); pw.print(",0,Dcpu="); @@ -5482,6 +5489,11 @@ public abstract class BatteryStats implements Parcelable { pw.print(rec.stepDetails.statPlatformIdleState); } pw.println(); + + if (rec.stepDetails.statSubsystemPowerState != null) { + pw.print(rec.stepDetails.statSubsystemPowerState); + } + pw.println(); } } oldState = rec.states; diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 31064ac73dff..517c326e3b6c 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -169,6 +169,7 @@ public class BatteryStatsImpl extends BatteryStats { public interface PlatformIdleStateCallback { public String getPlatformLowPowerStats(); + public String getSubsystemLowPowerStats(); } private final PlatformIdleStateCallback mPlatformIdleStateCallback; @@ -2882,6 +2883,12 @@ public class BatteryStatsImpl extends BatteryStats { mPlatformIdleStateCallback.getPlatformLowPowerStats(); if (DEBUG) Slog.i(TAG, "WRITE PlatformIdleState:" + mCurHistoryStepDetails.statPlatformIdleState); + + mCurHistoryStepDetails.statSubsystemPowerState = + mPlatformIdleStateCallback.getSubsystemLowPowerStats(); + if (DEBUG) Slog.i(TAG, "WRITE SubsystemPowerState:" + + mCurHistoryStepDetails.statSubsystemPowerState); + } computeHistoryStepDetails(mCurHistoryStepDetails, mLastHistoryStepDetails); if (includeStepDetails != 0) { diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index e15b13527c3e..d617b05a5778 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -186,6 +186,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub } private native int getPlatformLowPowerStats(ByteBuffer outBuffer); + private native int getSubsystemLowPowerStats(ByteBuffer outBuffer); private CharsetDecoder mDecoderStat = StandardCharsets.UTF_8 .newDecoder() .onMalformedInput(CodingErrorAction.REPLACE) @@ -217,6 +218,28 @@ public final class BatteryStatsService extends IBatteryStats.Stub } } + @Override + public String getSubsystemLowPowerStats() { + Slog.d(TAG, "begin getSubsystemLowPowerStats"); + try { + mUtf8BufferStat.clear(); + mUtf16BufferStat.clear(); + mDecoderStat.reset(); + int bytesWritten = getSubsystemLowPowerStats(mUtf8BufferStat); + if (bytesWritten < 0) { + return null; + } else if (bytesWritten == 0) { + return "Empty"; + } + mUtf8BufferStat.limit(bytesWritten); + mDecoderStat.decode(mUtf8BufferStat, mUtf16BufferStat, true); + mUtf16BufferStat.flip(); + return mUtf16BufferStat.toString(); + } finally { + Slog.d(TAG, "end getSubsystemLowPowerStats"); + } + } + BatteryStatsService(File systemDir, Handler handler) { // Our handler here will be accessing the disk, use a different thread than // what the ActivityManagerService gave us (no I/O on that one!). diff --git a/services/core/jni/Android.mk b/services/core/jni/Android.mk index e6c2b1d36856..84ab48de147c 100644 --- a/services/core/jni/Android.mk +++ b/services/core/jni/Android.mk @@ -95,6 +95,7 @@ LOCAL_SHARED_LIBRARIES += \ android.hardware.ir@1.0 \ android.hardware.light@2.0 \ android.hardware.power@1.0 \ + android.hardware.power@1.1 \ android.hardware.tetheroffload.config@1.0 \ android.hardware.thermal@1.0 \ android.hardware.tv.cec@1.0 \ diff --git a/services/core/jni/com_android_server_am_BatteryStatsService.cpp b/services/core/jni/com_android_server_am_BatteryStatsService.cpp index 57bb9fedc135..37ae78254ce2 100644 --- a/services/core/jni/com_android_server_am_BatteryStatsService.cpp +++ b/services/core/jni/com_android_server_am_BatteryStatsService.cpp @@ -29,6 +29,7 @@ #include #include +#include #include #include @@ -46,6 +47,8 @@ using android::hardware::power::V1_0::IPower; using android::hardware::power::V1_0::PowerStatePlatformSleepState; using android::hardware::power::V1_0::PowerStateVoter; using android::hardware::power::V1_0::Status; +using android::hardware::power::V1_1::PowerStateSubsystem; +using android::hardware::power::V1_1::PowerStateSubsystemSleepState; using android::hardware::hidl_vec; namespace android @@ -263,9 +266,105 @@ static jint getPlatformLowPowerStats(JNIEnv* env, jobject /* clazz */, jobject o return total_added; } +static jint getSubsystemLowPowerStats(JNIEnv* env, jobject /* clazz */, jobject outBuf) { + char *output = (char*)env->GetDirectBufferAddress(outBuf); + char *offset = output; + int remaining = (int)env->GetDirectBufferCapacity(outBuf); + int total_added = -1; + + //This is a IPower 1.1 API + sp gPowerHal_1_1 = nullptr; + + if (outBuf == NULL) { + jniThrowException(env, "java/lang/NullPointerException", "null argument"); + return -1; + } + + { + std::lock_guard lock(gPowerHalMutex); + if (!getPowerHal()) { + ALOGE("Power Hal not loaded"); + return -1; + } + + //Trying to cast to 1.1, this will succeed only for devices supporting 1.1 + gPowerHal_1_1 = android::hardware::power::V1_1::IPower::castFrom(gPowerHal); + if (gPowerHal_1_1 == nullptr) { + //This device does not support IPower@1.1, exiting gracefully + return 0; + } + + Return ret = gPowerHal_1_1->getSubsystemLowPowerStats( + [&offset, &remaining, &total_added](hidl_vec subsystems, + Status status) { + + if (status != Status::SUCCESS) + return; + + for (size_t i = 0; i < subsystems.size(); i++) { + int added; + const PowerStateSubsystem &subsystem = subsystems[i]; + + added = snprintf(offset, remaining, + "subsystem_%zu name=%s ", i + 1, subsystem.name.c_str()); + if (added < 0) { + break; + } + + if (added > remaining) { + added = remaining; + } + + offset += added; + remaining -= added; + total_added += added; + + for (size_t j = 0; j < subsystem.states.size(); j++) { + const PowerStateSubsystemSleepState& state = subsystem.states[j]; + added = snprintf(offset, remaining, + "state_%zu name=%s time=%" PRIu64 " count=%" PRIu64 " last entry TS(ms)=%" PRIu64 " ", + j + 1, state.name.c_str(), state.residencyInMsecSinceBoot, + state.totalTransitions, state.lastEntryTimestampMs); + if (added < 0) { + break; + } + + if (added > remaining) { + added = remaining; + } + + offset += added; + remaining -= added; + total_added += added; + } + + if (remaining <= 0) { + /* rewrite NULL character*/ + offset--; + total_added--; + ALOGE("PowerHal: buffer not enough"); + break; + } + } + } + ); + + if (!ret.isOk()) { + ALOGE("getSubsystemLowPowerStats() failed: power HAL service not available"); + gPowerHal = nullptr; + return -1; + } + } + + *offset = 0; + total_added += 1; + return total_added; +} + static const JNINativeMethod method_table[] = { { "nativeWaitWakeup", "(Ljava/nio/ByteBuffer;)I", (void*)nativeWaitWakeup }, { "getPlatformLowPowerStats", "(Ljava/nio/ByteBuffer;)I", (void*)getPlatformLowPowerStats }, + { "getSubsystemLowPowerStats", "(Ljava/nio/ByteBuffer;)I", (void*)getSubsystemLowPowerStats }, }; int register_android_server_BatteryStatsService(JNIEnv *env) -- cgit v1.2.3-59-g8ed1b