
Native Android apps outperform React Native and Flutter on raw execution speed, and the gap is structural — native code runs directly on the platform runtime while cross-platform apps route work through an extra JavaScript-to-native layer. Google’s AGP 9.2 R8 compiler now makes atomic operations 2-4x faster and coroutine launches up to 2x faster, and cross-platform apps don’t inherit those wins automatically. For most products, though, that gap is invisible to users.
That’s the honest short answer to a question founders ask constantly: does the performance difference between native Android and React Native actually matter for the app you’re about to fund? Sometimes it decides everything. Usually it decides nothing. The trick is knowing which situation you’re in before you commit a budget and a team to one path. Here’s where the gap comes from, when it’s real, and how to choose.
Why did native Android just get faster while cross-platform apps didn’t?
Google’s Android team, in a report from engineers Andrei Shikov and Jonathan Starup, shipped a compiler optimization in AGP 9.2.0 — the Android Gradle Plugin, the build tool that turns your Kotlin code into a shippable app — that rewrites a low-level concurrency primitive into a faster variant. In their benchmarks on a Pixel 5, the slow path (kotlinx.atomicfu) measured 135 nanoseconds versus 50.7 nanoseconds for the optimized version, roughly 2.7x slower before the fix. Once R8 applies the optimization, the two match, and launching and cancelling coroutines in Jetpack Compose’s LaunchedEffect ran 2x faster.
This matters to a founder, not just a compiler engineer: the speedup lives entirely inside the native Android toolchain. It applies to Kotlin, to Jetpack Compose, to apps built with Google’s own build pipeline. A React Native or Flutter app doesn’t run through that pipeline for its business logic — it runs your app code in a JavaScript engine (React Native) or the Dart runtime (Flutter) and talks to the platform through a translation layer. So when Google squeezes 2x out of native coroutines, native apps get it on the next build. Cross-platform apps get nothing.
The people building the operating system optimize the native path first and hardest, and they never stop. Cross-platform frameworks are always integrating those wins a step behind, if they can reach them at all.
Where does the React Native performance gap actually come from?
The gap is not sloppy code — it’s architecture. React Native runs your app logic in JavaScript and communicates with native UI and device features across a boundary. Every time your app crosses that boundary — animating a list, responding to a gesture, reading a sensor — there’s a serialization cost. Flutter avoids the JavaScript bridge by compiling to native code and drawing its own UI, which is why it generally benchmarks closer to native, but it still ships its own rendering engine rather than using the platform’s.
AGP 9.2 shows how deep native optimization goes. The Android team found that 80% of the time spent creating and updating a Modifier.clickable — just making something tappable in Compose — was consumed by launching and cancelling internal coroutines. They didn’t paper over it. They traced it to reflective safety checks inside atomic field updaters and rewrote the compiler to skip them. That’s the kind of surgical, platform-level work a cross-platform framework cannot do to your app, because your app isn’t running on the platform’s runtime in the first place.
So when someone asks whether React Native is “slow,” the accurate answer is: it carries fixed overhead that native doesn’t, the overhead compounds in interaction-heavy and animation-heavy screens, and native platforms keep lowering their own floor. For a form-based CRUD app, none of that is noticeable. For a real-time drawing tool or a 120fps game, it’s the whole ballgame.
When is performance actually the deciding factor for your app?
Most of the time, it isn’t. If your app is screens, forms, lists, API calls, payments, and notifications — the shape of the vast majority of business apps — users will never feel the difference between native and cross-platform, and choosing native to chase nanoseconds is a waste of money. A full breakdown of what each path costs you in time and maintenance is in our native vs cross-platform comparison, and for most teams the answer leans cross-platform.
Performance becomes the deciding factor in a narrower set of cases. If you’re building a game, a camera or video-editing app, an AR experience, or anything with continuous high-frame-rate animation and heavy per-frame computation, the bridge overhead and the loss of platform-level optimizations like AGP 9.2’s coroutine speedup will show up as jank your users feel. Same if you depend on brand-new OS features the day they ship, or on tight integration with device hardware.
A concrete way to sort yourself: if you’re a fintech startup shipping a dashboard, transaction history, and a payment flow, go cross-platform and ship in half the time — the performance gap is a rounding error against your time-to-market. If you’re building a real-time collaborative canvas or a live-video product, the extra layer is a tax you’ll pay on every frame, and native is the defensible choice. We expect the platforms to keep widening this gap on the demanding end: Google is already implementing these same coroutine optimizations natively at the ART runtime level, with roughly 15% additional improvement observed on API 37, so native’s ceiling keeps rising for the apps that need it.
Native vs React Native vs Flutter: cost, timeline, and team tradeoffs
The real decision is rarely about milliseconds — it’s about your team, your budget, and your roadmap. Native Android (Kotlin) plus native iOS (Swift) gives you peak performance and same-day access to new OS features, but you’re maintaining two codebases and hiring or contracting two specialties. That roughly doubles engineering cost and timeline compared to a single shared codebase.
React Native lets a JavaScript or TypeScript team ship both platforms from one codebase, and it supports over-the-air updates — pushing fixes without waiting for app store review — which matters when you’re iterating fast. Flutter also ships one codebase for both platforms and tends to perform closer to native because it skips the JavaScript bridge, at the cost of adopting Dart, a language your existing web team probably doesn’t know. If you’re weighing those two, our side-by-side on React Native and Flutter walks through which fits which kind of team.
Don’t build native unless a specific, demonstrable performance or platform-integration requirement forces it. If your product is standard business functionality, a cross-platform build gets you to market faster and cheaper, and you can always rewrite a single hot screen in native later if profiling proves you need to. The teams that regret their stack aren’t the ones who picked cross-platform for a normal app — they’re the ones who went native “to be safe” and burned months they didn’t have.
How to choose your mobile stack without guessing
The decision framework is four questions. First, is continuous high-frame-rate rendering or heavy on-device computation core to the product? If yes, lean native. Second, do you need new OS features on day one? If yes, lean native. Third, is your existing team JavaScript/TypeScript, and is speed-to-market the priority? If yes, React Native. Fourth, do you want near-native performance from one codebase and can you adopt Dart? Consider Flutter.
What we do before anyone writes code is profile the actual requirements against these questions, then scope an architecture that matches — including the increasingly common hybrid where the shell is cross-platform and one or two performance-critical modules are native. That scoping is the cheapest insurance you can buy, because reversing a platform decision after six months of development is the most expensive mistake in mobile. If you’re at this fork, our mobile team can pressure-test your requirements and recommend the stack that actually fits — book a mobile architecture consultation before you commit a budget to the wrong path.
FAQ
Q: Is native Android faster than React Native? A: Yes, native Android is faster on raw execution because it runs directly on the platform runtime, while React Native routes app logic through a JavaScript-to-native layer that adds overhead. Google’s AGP 9.2 R8 optimizations made native coroutine operations up to 2x faster and atomic operations 2-4x faster, per the Android team — gains cross-platform apps don’t inherit. For typical business apps, though, the difference is imperceptible to users.
Q: Does the React Native performance gap matter for my app? A: Only if your app depends on continuous high-frame-rate animation, heavy on-device computation, real-time interaction, or day-one access to new OS features. For form-based, list-driven, API-backed apps — most business apps — the gap is a rounding error against the time and cost you save by shipping one cross-platform codebase.
Q: Is Flutter faster than React Native? A: Generally yes, because Flutter compiles to native code and renders its own UI rather than crossing a JavaScript bridge for every interaction, which is where much of React Native’s overhead lives. Flutter still ships its own rendering engine rather than using the platform’s, so it doesn’t match fully native performance, but it usually benchmarks closer to it.
Key Takeaways
- Native platforms optimize their own runtime first and continuously — AGP 9.2’s 2x coroutine speedup is native-only, so expect the raw-performance gap over cross-platform to keep widening on demanding apps.
- Choose native only when a specific performance or platform-integration requirement forces it; for standard business apps, cross-platform ships faster and cheaper with no user-visible penalty.
- The React Native gap comes from the JavaScript-to-native bridge, which taxes every interaction — it compounds on animation- and gesture-heavy screens and disappears on form- and list-heavy ones.
- Hybrid architectures let you keep a cross-platform shell and rewrite only the one or two hot screens in native, once profiling proves you need to — not before.
- Scope the architecture against real requirements before writing code; reversing a platform decision mid-build is the most expensive mistake in mobile development.








