What we build on Android
Android work splits into two broad worlds. Consumer apps compete for attention on personal phones and need polish, speed and a small install size. Enterprise and field apps run on managed hardware, often all day, and need reliability, offline behavior and predictable updates. We build for both, and the engineering priorities differ more than people expect.
Consumer apps
Marketplaces, subscriptions, social and media apps where startup time, smooth scrolling and Play Store ratings drive growth.
Field and logistics apps
Driver, inspection and warehouse apps with barcode scanning, offline queues and GPS. See our logistics app work for more on field scenarios.
Enterprise and internal tools
Apps distributed through managed Google Play to company-owned or work-profile devices.
Regulated and payments apps
Banking and payments apps where device integrity checks and secure storage are non-negotiable.
Kotlin, Jetpack Compose and Material 3
New Android projects are written in Kotlin, with Jetpack Compose for the UI. Compose replaces XML layouts with Kotlin functions, which cuts boilerplate and makes UI state explicit. For existing apps built on Views, Compose can be introduced screen by screen through ComposeView, so there's no need to stop feature work for a rewrite.
- Architecture: unidirectional data flow with ViewModels, Kotlin coroutines and Flow, following Google's recommended app architecture guidance.
- Dependency injection: Hilt in most projects, which keeps components testable and lifecycles clear.
- Persistence and networking: Room for local data, Retrofit or Ktor for APIs, and DataStore in place of SharedPreferences.
- Material 3: dynamic color on supported devices, a token-based theme that maps your brand onto Material components, and adaptive layouts for tablets and foldables.
- Build setup: Gradle with version catalogs and modularized features to keep build times under control as the app grows.
A device fragmentation strategy that fits your users
Testing on every Android device is impossible, and testing only on the latest Pixel is a common mistake. We build a test matrix from your own analytics, or from market data for your target countries if you're pre-launch, and cover the combinations most likely to break.
| Dimension | Why it matters | How we cover it |
|---|---|---|
| Manufacturer skins | OEM software changes battery management, notifications and permissions behavior. | At least one device from each major manufacturer in your audience. |
| Low-end hardware | Limited RAM and slower storage expose memory leaks and jank. | A budget device representative of your lower-tier users. |
| Android versions | Permission models and background limits differ by version. | Your minimum SDK, the most common version in your audience, and the latest release. |
| Form factors | Tablets, foldables and Chromebooks change layout assumptions. | Adaptive layout checks on emulators plus a physical tablet or foldable where relevant. |
We pair physical devices with cloud device farms for broad automated runs, and use Baseline Profiles to improve startup and scroll performance on the lower-end hardware where it is most noticeable.
Background work, battery limits and target API levels
Android has steadily tightened what apps can do when they're not on screen. Doze mode, App Standby Buckets and restrictions on starting foreground services all exist to protect battery life, and they shape how sync, location tracking and notifications have to be designed.
- WorkManager for deferrable, guaranteed work such as uploading queued forms or syncing data when connectivity returns.
- Foreground services only when the user is clearly aware of ongoing work, such as navigation or an active delivery, with the correct declared service type.
- Push via Firebase Cloud Messaging to wake the app for time-sensitive updates instead of polling.
- Exact alarms avoided unless the use case genuinely requires them, since they need special permission on recent Android versions.
Keeping up with target API level requirements
Google Play requires new apps and updates to target a recent Android API level, and the bar moves up roughly once a year. Apps that fall behind can't publish updates and may become less visible to users on newer devices. Raising the target isn't just a version bump: each new level can change permission, background and privacy behavior, so we plan and test the upgrade as a piece of work in its own right.
Releasing through Play Console tracks
Play Console gives you several testing tracks before production, and we use them deliberately rather than pushing straight to everyone.
- 1
Internal testing
A small group of your team and ours gets each sprint build within minutes of upload. Fast feedback, no review wait.
- 2
Closed testing
Invited testers, such as pilot customers or field staff, try release candidates. Newer personal developer accounts must complete a closed test with a minimum number of testers before production access, so we plan for it early.
- 3
Open testing
Optional public beta for consumer apps that want broader feedback before launch.
- 4
Staged production rollout
Release to a small percentage of users, watch Android vitals and crash rates, then increase. A bad build can be halted before most users see it.
We publish Android App Bundles, set up Play App Signing in your account, and complete the Data safety form from an inventory of what the app and its SDKs actually collect.
Enterprise devices, MDM and Play Integrity
Company-owned devices bring their own requirements. We build apps that work cleanly under Android Enterprise, whether devices are fully managed or use a work profile on a personal phone.
- Managed configurations so IT can set server URLs, feature flags or tenant IDs from the MDM console instead of asking staff to type them in.
- Private app distribution through managed Google Play, so internal apps never appear in the public store.
- Kiosk and dedicated-device modes for shared tablets, scanners and point-of-sale hardware.
- Rugged device SDKs for hardware scanners and printers, wrapped behind interfaces so the app still runs on ordinary phones during development.
For apps that handle money or sensitive data, the Play Integrity API lets your backend check that requests come from your genuine app on a device that passes integrity checks. It replaced the older SafetyNet Attestation API. We combine it with server-side verification, certificate pinning where appropriate and encrypted local storage. Our fintech app delivery and enterprise mobile work pages go deeper on those environments.
How Android fits with the rest of your product
Most clients need iOS as well. Running native Android alongside a native Swift team for iPhone gives each platform the best fit, at the cost of building features twice. We reduce that cost with a shared API contract, shared design tokens and aligned sprint goals, so both apps ship the same features in the same release.
If one native codebase per platform isn't realistic for your budget, our guide to planning an offshore mobile project explains when Flutter or React Native is the better route.