Skip to content

About

Offline, ad-free battery statistics for Android. Estimates battery health by coulomb counting over partial charges, so a phone held at an 80% charge limit is measured rather than extrapolated.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

HonestBattery

A battery statistics app for Android that tells you what it actually measured, and says so when it didn't measure enough.

Ad-free, offline, no telemetry, no accounts. It declares no INTERNET permission, so it cannot transmit anything, and the build fails if that ever changes.

Why another one

Existing battery apps have two habits this one avoids.

They need a full charge to estimate battery health. If your phone is set to stop charging at 80% (as most modern Android phones can be), they either report nothing or quietly extrapolate. HonestBattery estimates capacity by coulomb counting over whatever range you actually charged. A 30% → 80% session is a first-class measurement, not a degraded one.

They report one average drain figure. On the reference device, active drain measured 6.2%/h on Wi-Fi indoors versus 9.1%/h on weak 5G outdoors, a ~50% swing that a single average hides completely. HonestBattery groups drain by the conditions it happened under, so the question it answers is "why was drain high?", not just "how high was it?".

What it does

  • Charge sessions: start/end level, mAh delivered, average current, duration, temperature range, and why the session ended (unplugged, full, or held at your charge limit).
  • Battery health: effective capacity in mAh against design capacity, via coulomb counting, with a confidence badge that stays honest about how few sessions it has seen. Outlier estimates are shown and excluded, not deleted.
  • Discharge analytics: screen-on time per charge, screen-on and screen-off drain in %/h and mA, projected screen-on time per charge.
  • What drains you: drain grouped by network transport, signal strength and screen brightness. Buckets with under 20 minutes of data say "collecting data" instead of showing a number.
  • Per-app breakdown: estimated from foreground screen time, and labelled as such. Android exposes no per-app power API; this app does not pretend otherwise.
  • Live dashboard: current, voltage, temperature, level, and time to your charge limit.
  • Home screen widgets: five of them. Battery gauge shows the level as a gauge; Battery live adds current and temperature; Since last charge shows screen-on time and drain; Charging shows charge speed while charging and falls back to screen-on time otherwise; Battery board plots the level over 12 hours alongside drain and measured capacity. Each one applies the same gates the app does, and marks itself stale rather than keep showing a number that stopped updating.
  • Charging alarms: when the battery reaches your charge limit, when it reaches full, when it gets too hot (42 °C by default), and when it drops low. The limit alarm follows the detected ceiling by default rather than a number you typed once, so it still fires correctly under an adaptive charging scheme. Each alarm is toggled on its own.

Requirements

  • Android 12 (API 31) or newer
  • No root

Building

./gradlew :app:assembleDebug
adb install -r app/build/outputs/apk/debug/app-debug.apk

For a signed release build, copy keystore.properties.example to keystore.properties and fill it in. Without that file, release builds are unsigned and debug builds are unaffected.

Permissions, and what each is for

Permission Why
FOREGROUND_SERVICE + _SPECIAL_USE Continuous sampling. Deferrable schedulers would shred the cadence health estimation depends on.
POST_NOTIFICATIONS The service notification, which doubles as a live readout. Silent, low priority.
RECEIVE_BOOT_COMPLETED Resume recording after a reboot.
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS Without the exemption, aggressive OEM power management eventually kills the recorder.
PACKAGE_USAGE_STATS Per-app foreground time. Granted in Settings, not a runtime prompt. Optional.
ACCESS_NETWORK_STATE Which transport is active (Wi-Fi / cellular / none). Not internet access.
READ_BASIC_PHONE_STATE Optional, opt-in from Settings, only to tell 5G from LTE in drain buckets. Never requested at first launch.

Notably absent: INTERNET.

Data

Everything stays on the device. Raw samples are pruned after 30 days; sessions and health estimates are kept indefinitely (they are tiny). The whole database can be exported to a JSON file and imported again from Settings.

Licence

Copyright (C) 2026 BasilSkyWalk

GNU General Public License v3.0. See LICENSE.

This is copyleft. You may use, modify and redistribute this app, including commercially, but any version you distribute has to be released under the GPL too, with its source available to the people you distribute it to.

About

Offline, ad-free battery statistics for Android. Estimates battery health by coulomb counting over partial charges, so a phone held at an 80% charge limit is measured rather than extrapolated.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages