diff options
3 files changed, 45 insertions, 12 deletions
diff --git a/core/java/android/os/health/SystemHealthManager.java b/core/java/android/os/health/SystemHealthManager.java index 9d0e221bd9e7..a8a22f675e08 100644 --- a/core/java/android/os/health/SystemHealthManager.java +++ b/core/java/android/os/health/SystemHealthManager.java @@ -473,17 +473,31 @@ public class SystemHealthManager { } } - final HealthStats[] results = new HealthStats[uids.length]; - if (result.bundle != null) { - HealthStatsParceler[] parcelers = result.bundle.getParcelableArray( - IBatteryStats.KEY_UID_SNAPSHOTS, HealthStatsParceler.class); - if (parcelers != null && parcelers.length == uids.length) { - for (int i = 0; i < parcelers.length; i++) { - results[i] = parcelers[i].getHealthStats(); + switch (result.resultCode) { + case IBatteryStats.RESULT_OK: { + final HealthStats[] results = new HealthStats[uids.length]; + if (result.bundle != null) { + HealthStatsParceler[] parcelers = result.bundle.getParcelableArray( + IBatteryStats.KEY_UID_SNAPSHOTS, HealthStatsParceler.class); + if (parcelers != null && parcelers.length == uids.length) { + for (int i = 0; i < parcelers.length; i++) { + results[i] = parcelers[i].getHealthStats(); + } + } } + return results; + } + case IBatteryStats.RESULT_SECURITY_EXCEPTION: { + throw new SecurityException(result.bundle != null + ? result.bundle.getString(IBatteryStats.KEY_EXCEPTION_MESSAGE) : null); + } + case IBatteryStats.RESULT_RUNTIME_EXCEPTION: { + throw new RuntimeException(result.bundle != null + ? result.bundle.getString(IBatteryStats.KEY_EXCEPTION_MESSAGE) : null); } + default: + throw new RuntimeException("Error code: " + result.resultCode); } - return results; } /** diff --git a/core/java/com/android/internal/app/IBatteryStats.aidl b/core/java/com/android/internal/app/IBatteryStats.aidl index a5e166b95177..5f1a641945e8 100644 --- a/core/java/com/android/internal/app/IBatteryStats.aidl +++ b/core/java/com/android/internal/app/IBatteryStats.aidl @@ -35,8 +35,20 @@ import android.telephony.SignalStrength; interface IBatteryStats { /** @hide */ + const int RESULT_OK = 0; + + /** @hide */ + const int RESULT_RUNTIME_EXCEPTION = 1; + + /** @hide */ + const int RESULT_SECURITY_EXCEPTION = 2; + + /** @hide */ const String KEY_UID_SNAPSHOTS = "uid_snapshots"; + /** @hide */ + const String KEY_EXCEPTION_MESSAGE = "exception"; + // These first methods are also called by native code, so must // be kept in sync with frameworks/native/libs/binder/include_batterystats/batterystats/IBatteryStats.h @EnforcePermission("UPDATE_DEVICE_STATS") diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index c8b0a57fe9f0..5ff6999e40b3 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -3705,8 +3705,14 @@ public final class BatteryStatsService extends IBatteryStats.Stub @Override public void takeUidSnapshotsAsync(int[] requestUids, ResultReceiver resultReceiver) { if (!onlyCaller(requestUids)) { - mContext.enforceCallingOrSelfPermission( - android.Manifest.permission.BATTERY_STATS, null); + try { + mContext.enforceCallingOrSelfPermission( + android.Manifest.permission.BATTERY_STATS, null); + } catch (SecurityException ex) { + resultReceiver.send(IBatteryStats.RESULT_SECURITY_EXCEPTION, + Bundle.forPair(IBatteryStats.KEY_EXCEPTION_MESSAGE, ex.getMessage())); + return; + } } if (shouldCollectExternalStats()) { @@ -3727,13 +3733,14 @@ public final class BatteryStatsService extends IBatteryStats.Stub } Bundle resultData = new Bundle(1); resultData.putParcelableArray(IBatteryStats.KEY_UID_SNAPSHOTS, results); - resultReceiver.send(0, resultData); + resultReceiver.send(IBatteryStats.RESULT_OK, resultData); } catch (Exception ex) { if (DBG) { Slog.d(TAG, "Crashed while returning results for takeUidSnapshots(" + Arrays.toString(requestUids) + ") i=" + i, ex); } - throw ex; + resultReceiver.send(IBatteryStats.RESULT_RUNTIME_EXCEPTION, + Bundle.forPair(IBatteryStats.KEY_EXCEPTION_MESSAGE, ex.getMessage())); } finally { Binder.restoreCallingIdentity(ident); } |