Built in Kotlin and Compose.
The interface written in Compose and previewed as it is built, on the stack Google ships its own apps on
an app that behaves as Android rather than as a wrapped page
Android app development · UAE
Kotlin and Jetpack Compose is the easy half. The skins decide whether a notification arrives and whether overnight work is still running in the morning.
Scope the Android side before you commitWhat Android app development is
Android is roughly 78% of the handsets here. The useful fact is the shape of that share, because it decides the test matrix before it decides the code.
The stack Google ships its own apps on, with Material 3 and right to left settled at the manifest. Arabic is a build flag and a resource set, decided at the start, not a translation pass at the end.
Samsung, then Xiaomi, vivo, OPPO and realme, with no Android vendor above a fifth of the market. The four behind Samsung together carry more than Samsung does, and their skins are the ones that change behaviour.
An organisation account whose legal name and address Google checks against Dun and Bradstreet, a listing in both languages, and a staged rollout with a rollback. The listing is pinned to the trade licence.
The scope
Six outputs from an Android engagement. Two are the app, two are the release, and two exist only because Android is a set of manufacturers rather than a platform.
The interface written in Compose and previewed as it is built, on the stack Google ships its own apps on
an app that behaves as Android rather than as a wrapped page
A release that reaches 1% before it reaches everyone, with a halt you can pull
a bad build caught by a hundred users rather than by all of them
Samsung, Xiaomi, vivo, OPPO and realme, with a share against each and the strictest skin marked
a written test matrix, agreed before sprint one
Components, motion and dynamic colour to Material 3, with layouts written in start and end so a mirrored build is a resource set rather than a rewrite
an interface that holds in both directions
The app extended to the watch, the screen or the car only where a user genuinely opens it there
a surface roster you approved rather than a feature list
Scheduled work, sync and notifications measured against Doze and against a strict manufacturer power manager
an overnight job that is still running at 07:00
What the skins change
The documentation describes stock Android. Most of this market is not running stock Android, and the difference shows up in the two things a business app depends on.
| Stock AndroidWhat the documentation describes | A strict OEM skinWhat a lot of this market runs | What we build againstThe strictest one in the matrix | |
|---|---|---|---|
| An overnight sync | Runs in a maintenance window, roughly when the platform says it will. | The app is frozen after a few idle days and the job never fires. | Scheduled work proved on the strictest skin, with the exemption prompt in the flow. |
| Push with app closed | Delivered, usually within seconds of the send. | Delayed, batched or dropped once the app has been swiped away. | Delivery measured per skin on a real handset, never inferred from an emulator. |
| Seeing another app | Hidden since Android 11 unless the manifest names what it needs. | The same rule, plus permission screens of the manufacturer’s own. | The queries list written in the scope, so an app-switch works on first install. |
| Reproducing a report | An emulator reproduces the framework, not the manufacturer. | Reproducible only on that skin, which nobody on the team carries. | The handsets on the matrix are the handsets on the ticket, so it reproduces. |
The size of the build, more than the feature list does. A matrix of five skins is more test time than a matrix of two, and a managed fleet on one handset is less than either, so it is agreed in writing before sprint one rather than discovered in support. The pillar sets out the decisions that sit above this one. If iOS is in scope too, the shared and per-platform split is here.
What we find on Android here
Webzenia has worked with Gulf clients since 2018. Four things about an Android build here that the platform documentation will not tell you.
Samsung is 17.82%, then Xiaomi 16.59%, vivo 8.14%, OPPO 7.46% and realme 6.05%. A JLT commodities trader under DMCC whose warehouse staff carry their own handsets is testing against four skins, not one, and it is the skins that decide whether the dispatch notification arrives.
Package visibility means the manifest has to declare each application the build needs to reach, so a national identity app-switch is a scoping decision taken before sprint one. Asking to see everything is a separate Play approval rather than a shortcut around it.
A Play organisation account is verified against a Dun and Bradstreet record. An Al Quoz logistics operator on a mainland DET licence that moves premises, or whose listing was opened under a former developer, finds this at renewal rather than at launch, which is the expensive time to find it.
It needs the right-to-left flag, layouts written in start and end rather than left and right, and a mirrored resource qualifier. A Musaffah contractor on an Abu Dhabi mainland licence adding Arabic to a finished workforce app is not translating it, it is revisiting every layout in it.
What the engagement covers
The engagement in six stages. The matrix and the manifest are settled in the first, because both of them price everything after.
The feature list, then the handsets and skins the build has to survive. A Sharjah SAIF Zone manufacturer whose distributors carry whatever their own market sells has a wider matrix than a company issuing its own devices.
Screens built to Material 3 with the right-to-left flag set and layouts written in start and end, so the Arabic build is a mirrored resource set rather than a second pass over every screen.
Your APIs, the payment sheet, push and the identity app-switch. Each application the build has to reach is named in the manifest before it is reached in code.
The matrix run on physical handsets, with the strictest power manager treated as the reference rather than the exception. An emulator is honest about layout and dishonest about delivery.
Store copy, screenshots and release notes in English and Arabic, on an organisation account checked against the licence, released to a percentage rather than to everyone.
Code, documentation, the agreed device matrix and the list of every application the manifest declares. The next team inherits both decisions instead of re-deriving them from a bug report.
Our stack
The language, the manifest, the delivery path, the listing and the crash log. Select one to see what it tells you and what it does not.
Kotlin is the language Google builds Android in, so a platform behaviour that changes in a release arrives with Kotlin support rather than behind a binding somebody else has to write.
We keep the platform-behaviour code in one place rather than scattered through screens, because background limits and permission prompts are the parts most likely to change under you between releases.
How the build runs
Two artefacts come out of week two and price everything after them. The device matrix, and the list of applications the manifest has to declare.
We agree the device matrix in writing, from vendor share and from what your own users carry, and mark which skin is the reference for background work. In the same fortnight we list every application the manifest has to declare, and check the Play organisation record against the trade licence. All three price the build, and none of them is code.
The app is built in Kotlin and Jetpack Compose to Material 3, with the right-to-left flag and start and end layouts from the first screen rather than after them. Push and scheduled work are instrumented so arrival is measured on a handset rather than inferred from an accepted send, and the strictest skin in the matrix is the one they are proved against.
The release goes to a percentage before it goes to everyone, and the crash and delivery numbers are read grouped by manufacturer rather than as one total. A fault that affects a single skin is a rounding error in an average and obvious the moment the average is split, which is the difference between halting a rollout and finding out from a review.
Reported per manufacturer, so a fault on one skin is visible before it is an average.
Our commitment
An Android build goes wrong on a handset nobody on the project owns. These four exist because that is where the damage is done.
We agree the phone list first.
Named handsets and named skins, in writing, with the reference for background work marked. A test plan that says real devices and nothing else is a plan nobody can hold us to.
Notifications proved on the strictest phone.
Arrival is confirmed on a physical handset from each manufacturer in the matrix. An accepted send tells you the message left, which is not the claim anyone is actually making when they say push works.
Your Play account matched to your licence.
The legal name and address on the account are matched to the trade licence before the listing opens, and re-checked when either changes. An unresolved mismatch can take every app you have published down with it.
Every release can be rolled back.
A percentage first, the numbers read per manufacturer, and the halt is yours to pull. Shipping to everyone at once means the only correction available is another release.
Common questions
Keep exploring
Native Swift, and the entity Apple publishes as seller.
One codebase, and the parts written per platform.
One widget tree, and an Arabic screen that mirrors itself.
For teams that already write React and have to hold it.
A shopping app costed against the repeat order.
Two-sided products where the fleet is the harder half.
Internal apps for staff who are not at a desk.
Subscription products whose customer is a licensed company.
A component system engineering builds from, in both directions.
Next step
Send what the app has to do and which handsets your users carry. We will come back with the build shape and the test matrix it runs against.
Tell us what you need.