Android is not one device. It is a range of screen sizes, manufacturers with their own battery policies, and users on OS versions four years apart. Building well for it is mostly about respecting that spread instead of testing on one flagship.
Compose as the default
Jetpack Compose for new UI, with the existing view system kept where a screen already works and rewriting it would buy nothing. State is hoisted, screens are previewable, and the same layout is checked at phone, foldable and tablet widths rather than assumed to scale.
Background work under real rules
Doze, app standby and vendor-specific killers mean a job you scheduled may not run when you expected. We use WorkManager with constraints that describe the actual requirement — needs network, needs charging, must be exact — and we design the feature to be correct when the job runs late.
Data layer
A single source of truth in the local database, network as a refresher rather than the origin of truth. That makes the app usable on a bad connection, which is the condition most of its users are actually in.
Shipping
Play Console staged rollouts, so a regression reaches one per cent of users instead of all of them. Crash and ANR rates are watched per release with a threshold that halts the rollout automatically. Builds and signing run in CI/CD, never on a developer machine.
The cross-platform question
If the app is mostly forms, lists and sync on both platforms, one codebase costs less to run — see Flutter and React Native. If it leans on the device, build both natively; the iOS half is Swift. Either way the argument belongs in the first week, and it is set out on mobile development.