docs / testing & shipping

Performance and APK size

A bundled site skips the network entirely, so it should open faster than your website. When it does not, the reasons are few and fixable — and most of them also make the APK smaller.

6 min read·5 sections·updated Sep 2026
TL;DR

Images and video are the size; JavaScript is the speed. Convert images to WebP at display size, remove source maps and unused fonts, ship only the JavaScript the first screen needs, reserve space for images, and test on a cheap phone rather than your own.

Where the time goes on launch

  1. App start and splash — the Android process starts and the WebView initialises. Fixed cost, a few hundred milliseconds on a mid-range phone.
  2. Reading your files — fast; they are local. Size matters less here than on the web.
  3. Parsing and running JavaScript — the dominant cost for framework apps. A 1.5 MB bundle can take a second or more to parse on a budget phone, network or not.
  4. Layout and images — decoding large images and reflowing when they arrive.

So for speed, the lever is JavaScript. For download size, it is media.

Size: what to cut first

ZIP Size TreemapSee what fills your ZIP as a treemap, by file and by type, against the upload limits Open tool
OffenderTypical savingFix
Photos at camera resolution70–90%Resize to ≤ 1920 px and convert to WebP
Background / hero video5–40 MB720p re-encode, or stream from a URL
Source maps≈ size of your JSDelete *.map
Fonts in TTF/OTF/EOT + WOFF + WOFF250–75% of font weightKeep WOFF2 only; subset to the languages you use
WAV audio≈ 90%OGG or MP3 at 96–128 kbps
Whole icon libraries100s of KBImport only the icons you use, or inline SVG

Speed: first screen first

  • Split the bundle. Route-level code splitting (React.lazy, Vue async components, dynamic import()) means the first screen parses only its own code. Chunks load from local files, so there is no network penalty for splitting.
  • Defer the rest. Analytics, chat widgets and anything below the fold: defer, or load after the first paint with requestIdleCallback.
  • Render something immediately. A static skeleton in index.html — even just the header and background colour — makes the hand-off from splash to page feel instant while the framework boots.
  • Match the splash. Set the builder's splash and theme colour to your page's background so the transition is seamless instead of flashing white.

Smoothness

  • Give every image width and height attributes (or aspect-ratio in CSS) so the page does not jump as they decode.
  • Animate transform and opacity, not top, height or box-shadow.
  • Use loading="lazy" on off-screen images in long lists.
  • Keep scroll handlers passive: addEventListener('scroll', fn, { passive: true }).

Test on the phone your users have

Your phone is probably faster than your median user's. A three-year-old budget Android device with 3–4 GB of RAM is a far more honest benchmark; if the app feels fine there, it feels fine everywhere. In desktop Chrome, DevTools' Performance panel with 4× CPU throttling is a rough stand-in.

FAQ

Does a bigger APK make the app slower?

Mostly not — files are read locally on demand. Size costs download time, storage and install conversions on slow connections. Speed is dominated by how much JavaScript the first screen runs.

Should I minify my HTML and CSS?

Your build tool already does for framework projects. For hand-written sites the gain is small once the ZIP compresses the text; images and JavaScript matter far more.

Is WebP safe for every Android version the app supports?

Yes. The Android WebView has decoded WebP, including transparency, on every version the app can install on.

Tools for this step

Unzip it on a phone today

Upload the ZIP, name the app, pick an icon — and download a signed APK a few minutes later. Free builds, no watermark, no Android Studio.

Convert a ZIP — free site.zip → app-release.apk