Know your Android device. For real.
Offline-first device intelligence — every number straight from the Android SDK, nothing invented.
Most "device info" apps guess. They scrape model databases, extrapolate GPU names, and print a fake "Battery health: 98%" that nobody ever measured.
DroidSpec works the other way around. If Android exposes a value, you see it — clearly labeled and sourced. If it doesn't, you see "Not available". No estimates dressed as facts. No hardware fairy tales.
Plus: an internal, cancellable, time-boxed benchmark (clearly not Geekbench), English & Arabic with full RTL, Material 3 themes, and zero runtime permissions.
| What others do | What DroidSpec does |
|---|---|
| Hardcoded device databases | Public Android APIs first, database-free |
| Invented battery-health % | Shows what BatteryManager reports, nothing more |
| Guessed GPU models | Renderer string via EGL, or "Not available" |
| Fake per-core CPU temps | Kernel thermal zones only, labeled as such |
"Rooted: yes" from one check |
Clearly-labeled non-authoritative heuristic |
Rule #1: an honest "Not available" beats a confident lie.
┌─────────────────────────────────────────────────────────────┐
│ UI (Compose) │
│ Dashboard · Sections · Live Monitor · Benchmark · Reports │
└──────────────────────────┬──────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ ViewModel (StateFlow, lifecycle-aware) │
└──────────────────────────┬──────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ Use Cases (Observe* / Snapshot* / Search / Report) │
└──────────────────────────┬──────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ Data Sources (failure-safe wrappers, no fabrication) │
│ Build · BatteryManager · ActivityManager · StatFs │
│ Camera2 · SensorManager · ConnectivityManager · EGL · /proc│
└─────────────────────────────────────────────────────────────┘
- Manual DI via
core/di/AppContainer.kt— one testable composition root, no magic. - Settings persist with DataStore; theme, locale, refresh interval (1s/2s/5s/10s), export format.
- Polling is lifecycle-aware: flows collect only while the screen is visible, then cancel themselves.
app/src/main/java/com/droidspec/
├── core/ # DI container, calculation utils, flow helpers
├── data/ # battery · cpu · gpu · memory · storage · thermal
│ # display · camera · sensors · network · device
├── domain/ # models · policies · use cases · search · reports · benchmark
├── presentation/ # viewmodels · screens · settings · report writer
├── navigation/ # routes, adaptive nav (rail ↔ drawer + bottom bar)
└── ui/ # Material 3 theme · reusable components
git clone https://github.com/CLXV11/DroidSpec.git && cd DroidSpec
# Build the debug APK
gradle assembleDebug # or: ./gradlew assembleDebug (after generating the wrapper)
# Run the test suite (pure JVM, no emulator needed)
gradle testDebugUnitTestRequirements: JDK 17 · AGP 8.5 · minSdk 24 → targetSdk 34
New to the project? Run
gradle wrapper --gradle-version 8.7once to generategradlewscripts and commit them — the standard workflow for local development.
| Suite | What it guards |
|---|---|
CalcUtilsTest |
Percentages, used-bytes, MHz/Mpx/inch math |
BatteryMappersTest |
Health/status/plugged int→key mapping |
ThermalPolicyTest |
Severity threshold boundaries |
BenchmarkScoreTest |
Deterministic internal scoring (weighted sum, 0–1000) |
LocalizationTest |
EN ⇄ AR string-key parity |
CI runs all of them on every push, plus Android Lint, and uploads the debug
APK + reports as artifacts. See .github/workflows/build.yml.
- English & العربية — full RTL layouts via
AppCompatDelegate.setApplicationLocales - Every user-visible string lives in
res/values*/strings.xml— none hardcoded in composables - Dark / Light / System themes, dynamic-friendly Material 3 palette, screen-reader labels, 48dp+ touch targets
No runtime permissions No network calls No analytics
No accounts No trackers No personal-file access
Everything is computed on-device, in memory. The app never phones home — because it literally never phones anywhere.
PRs are welcome — especially around new Android API levels and thermal data sources. Please keep the golden rule intact:
If the OS doesn't expose it, it ships as "Not available".
- Fork → branch → commit → PR
./gradlew testDebugUnitTestmust stay green- New user-visible strings → add to both
values/andvalues-ar/
Apache License 2.0 — see LICENSE
Built with AndroidX, Jetpack Compose and Kotlin. Third-party components are distributed under the Apache License 2.0.