Mobile Engineering
12 articles in this topic.
Your spare Android phone is a payment gateway: an offline-first SMS relay for M-Pesa
M-Pesa till confirmations arrive as an SMS, and Daraja is not open to every merchant. So we turned a spare Android phone into a self-hosted SMS-to-HTTP gateway: encrypted on-device, HMAC-signed on the wire, and built so that it never loses a message.
Six ways Android will eat your background service, and what actually worked
A broadcast receiver is a lie, WAL journalling wedged openDatabase on OxygenOS, and one polite database close in a WorkManager teardown silently stopped the whole gateway. Six real failure modes from a production Android SMS gateway, and the fix for each.
Shipping an Android app that can never be on the Play Store
Play forbids READ_SMS for anything that is not the default SMS handler, so this app was never going to be listed. Then a silent fallback to the debug keystore and a versionCode stuck at 1 turned every update into an uninstall. Two traps, one incident.
The OEM autostart rabbit hole: deep-linking into a dozen undocumented settings screens
Android has no API for the autostart allowlist your phone's manufacturer invented. So you keep a list of undocumented component names, try them in order, and design the failure case properly, because Transsion, which is enormous in Africa, exposes nothing at all.
App Store Guideline 2.3.1 Rejections: It's Rarely Your Text
Guideline 2.3.1 is a hidden functionality rule, not a description rule. Here is what actually triggers it in React Native and Flutter apps, and the checklist that clears it.
React Native Version Mismatch: Rebuilding Is Only Half the Fix
The redbox compares two build artefacts, not two package.json entries, and only major.minor. How to find which side is stale, pin react correctly, and stop it recurring.
Flutter 'Execution failed for task :app:processDebugResources': Find the Real Error
This Flutter build error is a wrapper hiding the real AAPT2 failure underneath. Here is how to surface the actual resource-linking error and fix the cause, not the symptom.
Flutter iOS 'CocoaPods Did Not Set the Base Configuration': The Fix That Survives Xcode Upgrades
Flutter iOS builds break after an Xcode upgrade with a CocoaPods base-configuration warning. The real cause is one missing include line, and old fixes point at the wrong path.
Flutter Over-the-Air Updates Without App Store Review: What's Actually Possible
Flutter has no first-party CodePush. Here is why, what commercial OTA services really do, the App Store policy risk, and the DIY config approach that covers most emergencies.
'Keystore file not set for signing config release' in CI But Not Locally
The Android build works on your machine and fails in CI with a keystore error that names no variable. The cause is eager signingConfig evaluation. Here is the fix.
React Native Android 'Duplicate Class': Finding Which Two Dependencies Conflict
The Duplicate class error names a class, not the package causing it. Read the dependency tree, force one AndroidX version, and stop excluding libraries at random.
Why Last-Write-Wins Sync Silently Destroys User Data (and What to Use Instead)
Last-write-wins on a client clock is data loss disguised as conflict resolution. Here is the mechanism, and the version numbers, per-field counters and CRDTs that fix it.