Skip to content
Innovialabs

How to Speed Up a Mobile App: Startup Time, Frames and Memory

Practice3 min

In short

Measure first, on a real device with a release build, then optimize. The usual wins are deferring work at startup, caching and resizing images, virtualizing lists and moving heavy work off the main thread.

Measure first, then optimize

Optimizing by feel often speeds up the wrong thing. The workflow:

  1. Pick a metric: startup time, smoothness or memory.
  2. Measure on a real mid-range device with a release (or profile) build — debug builds are much slower.
  3. Find the bottleneck with a profiler.
  4. Fix one thing and measure again.

What to measure

  • Cold start — launching when the app process isn't in memory. The slowest and most important case. Warm and hot starts are faster and worth tracking separately.
  • Smoothness (jank) — dropped frames. At 60 Hz each frame has about 16.7 ms, at 120 Hz about 8.3 ms. Miss the budget and scrolling and animations stutter.
  • Memory — peak usage and leaks. They cause the system to kill the app in the background or crash it.

Tools by platform

PlatformStartupSmoothnessMemory
AndroidMacrobenchmark, adb, Android Studio ProfilerProfiler, Perfetto, JankStatsMemory Profiler, LeakCanary
iOSInstruments: App Launch, Xcode OrganizerInstruments: Time Profiler, HitchesInstruments: Allocations, Leaks
FlutterDevTools (profile mode)DevTools: PerformanceDevTools: Memory
React NativeNative platform profilersPerf Monitor, Hermes profilerNative profilers

A quick cold start check on Android:

adb shell am force-stop com.example.app
adb shell am start -W -n com.example.app/.MainActivity

Look at TotalTime in the output. For stable numbers use Macrobenchmark with several runs. For production, real-user data helps: Android vitals in Google Play Console and metrics in Xcode Organizer.

Common fixes

Faster startup

  • Lazy initialization: analytics, ads, support chat and other SDKs aren't needed before the first frame. Start them after rendering or on demand.
  • Don't run network calls or heavy database work synchronously at launch. Show cached data or a skeleton.
  • On Android, use Baseline Profiles — they speed up code execution on first runs.
  • On iOS, watch the number of dynamically linked libraries: each adds work at load time.

Images and caching

  • Load images at display size, not original resolution.
  • Use libraries with disk and memory caching: Coil or Glide on Android, Kingfisher or SDWebImage on iOS, cached_network_image in Flutter.
  • Choose efficient formats (WebP, for example) and compress assets.

List virtualization

  • Render long lists lazily: RecyclerView or LazyColumn, UICollectionView or SwiftUI lazy containers, ListView.builder in Flutter, FlatList in React Native.
  • Give items stable keys so the whole list isn't re-rendered.
  • Simplify cell layouts: less nesting, fewer heavy effects.

Offload the main thread

  • JSON parsing, database work, image processing — on a background thread: coroutines on Android, Swift Concurrency on iOS, isolates in Flutter.
  • In React Native, avoid heavy computation on the JS thread during animations.
  • Don't recreate objects or recompute data on every render.

Memory

  • Unsubscribe listeners and timers when a screen closes.
  • Watch for long-lived objects holding references to screens — a classic leak.
  • Cap cache sizes.

Common mistakes

  • Measuring in a debug build or only on a flagship phone.
  • Initializing every SDK in the first milliseconds.
  • Loading full-size camera photos into list thumbnails.
  • Optimizing without re-measuring and never knowing if it helped.

FAQ

Developers usually test on powerful devices with fast internet. Users may have budget phones, little free memory and slow networks. Test on a mid-range device and check real-user metrics in the store consoles.

We can help with this

If you'd rather get the result than figure it all out yourself — this is what we do every day.

Discuss a project

Read next

Have an idea or a task? Tell us about it

We'll reply within one business day and propose a solution. The consultation is free.