Test On Budget Devices

Budget-device testing is not optional for Android-first apps targeting Kenya or similar markets. Emulator success does not prove real-world usability.

Minimum Matrix

Device ClassTarget
Physical low-end phone2-4GB RAM, older Android version still in target range
Current midrange phoneCommon daily-driver performance baseline
EmulatorCurrent API for fast iteration and permission flag resets
Constrained emulatorLow RAM/storage profile if no physical low-end phone exists

Smoke Script

Record this for every release candidate:

Device:
Android version:
RAM/storage notes:
Network state:
Battery saver:
Build installed:
Cold start result:
Long list scroll result:
Permission denial result:
Room write/read result:
Export result:
WorkManager job observation:
Crashes/ANRs:

What To Test

ScenarioCheck
Cold startApp opens quickly enough and does not block on database or parsing
Long listLazy list keeps scroll position and avoids obvious jank
RotationState survives configuration changes where expected
Low networkLocal screens remain useful and errors are clear
Low storageWrites and exports fail gracefully
Battery saverWorkManager promises remain honest
Permission denialManual mode remains usable
SMS importParser handles realistic sender names, duplicate messages, and malformed messages

Performance Signals

Watch for:

  • slow cold start
  • dropped frames while scrolling
  • memory growth after repeated navigation
  • Room queries on main thread
  • WorkManager jobs stuck because constraints never match
  • large exports blocking UI
  • excessive battery use from repeated scans

Practical Low-End Rules

  • Use stable keys in LazyColumn.
  • Do not parse thousands of SMS messages on the main thread.
  • Page or chunk long import/export operations.
  • Keep Material 3 surfaces clean and low-overdraw.
  • Prefer explicit user-triggered imports to invisible background scans.
  • Test with real message volume, not three fake rows.

Tip: If you cannot get a budget phone immediately, ship only after documenting that blocker. A constrained emulator is a fallback, not equivalent evidence.