Benchmarks

Real measurements of Cefrium against the three other ways to put web content in an Android app -- the system WebView, Mozilla GeckoView, and Chrome Custom Tabs. Honest numbers, the same page on every engine, with the harness and scripts published so you can reproduce them.

The honest summary: Cefrium uses the most RAM of the four (~2x a WebView, ~1.3x GeckoView) -- the cost of carrying its own pinned Chromium and a real multi-process model. In return it is the only one that is embeddable AND its own Chromium AND offers off-screen rendering AND full request interception. You are not buying lower memory; you are buying capability and a consistent engine, at a predictable memory price.

Method

RAM, same page (lower is lighter)

EngineW90 (PSS MB)Redmi / HyperOS (PSS MB)EmbeddableOwn engineOSR
System WebView119144YesNo (OS WebView)No
Tauri 2.11138173No (app framework)No (OS WebView)No
GeckoView 132180206YesYes (Gecko)No
Custom Tabs (Chrome)178224No--No
Cefrium 0.5.2242263YesYes (Chromium)Yes

Median PSS (6 samples), modern-web page, both devices, zero crashes during sampling. Cefrium is the heaviest; it is also the only embeddable Chromium with off-screen rendering. The W90 shares one renderer (~1-2 processes); the Redmi runs process-per-browser (3-4) -- which is why its numbers are higher across the board.

Tauri on Android ships no engine of its own: it renders in the device's system WebView -- the same engine and version as the System WebView row above. Its extra RAM over that row (~+19 MB W90, ~+29 MB Redmi) is the Rust/wry native runtime, measured on a release build (Tauri 2.11.2). It is an app framework, not a view you embed in an existing native app, and like any WebView it has no off-screen-rendering path.

Alternatives without a standard Android embedding path

Two engines often raised as lighter alternatives have no measured row here, for an honest reason rather than an omission:

Cefrium flagships & samples (per-app RAM)

RAM of the actual Cefrium apps loading their own content, for reference (PSS MB):

AppW90Redmi / HyperOS
modern-web showcase281--
java-sample (browser)278317
Compose browser269--
Exam app260308
Kiosk POS228230
Kiosk automotive224241

The dominant component is the engine binary (libcef.so, ~50-140 MB) -- memory-mapped from the file (shared, reclaimable under pressure), not runtime heap growth. Java heap stays small (7-20 MB).

Crash stability (OEM matrix)

Launch-cycle the same app N times and count app crashes, renderer-level crash events, and out-of-memory / lowmemorykiller kills. A single launch hides intermittent OEM behavior; HyperOS in particular is aggressive.

DeviceLaunchesApp crashesRenderer eventsLMK kills
TABWEE W90100 (0%)00
Redmi / HyperOS100 (0%)3 (30%)2
HyperOS killed a renderer in 30% of launches under its aggressive memory management -- but the app never crashed (0 user-facing crashes on both devices). A renderer dies, Cefrium's multi-process model recovers, the user sees nothing. That resilience is the multi-process model earning its RAM.

Memory is bounded, not leaking

A long-lived embedder opens and closes many pages. The risk is that each closed page leaks its renderer. We drive a 30-navigation loop through a pool that keeps at most 2 browsers alive (each new page evicts the least-recently-used one) and read the engine's exact counters afterwards.

DeviceNavigationsBrowsers closedLive browsersRender framesVerdict
TABWEE W90302922bounded
Redmi / HyperOS302922bounded
After 30 page loads, only the 2 pooled browsers and their 2 renderer frames remain -- every evicted page closed and freed its renderer. PSS confirms it: it oscillates around a ~300 MB plateau (GC noise), it does not climb. This deterministic counter check now gates every release: a build that leaks closed renderers cannot ship.

Renderers die gracefully (your app does not)

On aggressive OEM skins the system can kill a background renderer to reclaim memory. Cefrium surfaces that to the app through a public onRenderProcessTerminated callback, so the embedder can show a reload affordance instead of a blank page. We validated it end-to-end: kill the live renderer, the callback fires with an out-of-memory status, the app stays up. (This needed an engine fix -- the upstream handler only mapped desktop termination reasons and silently dropped Android's low-memory-kill status.)

Off-screen rendering (the capability the others lack)

Cefrium can render a page to a raw pixel buffer in your process (OnPaint) -- for screenshots, PDF, headless capture, custom compositing, or surfaces no View can reach. System WebView, GeckoView and Custom Tabs expose no pixel-buffer / off-screen API at all -- a category Cefrium owns outright.

Measured off-screen cold first-paint (loadUrl -> first content frame): ~1.7-2.0 s (Redmi 1690 ms, W90 2012 ms; cold start -- includes spawning the engine and the renderer). The other three engines have no number here because they cannot render off-screen at all.

Cefrium OnPaint output shown in a plain ImageView

Verified on device: Cefrium rendering a page into a raw BGRA buffer via OnPaint and drawing it into an ordinary Android ImageView (no SurfaceView, no WebView) -- the on-screen stats show the first frame and its non-white pixel count. The other three engines cannot do this.

Reproduce it yourself (traceability)

The whole harness is open in the cefrium-sample repo under benchmark-suite/: the external profiler, the matched per-engine apps (Cefrium / WebView / GeckoView / Custom Tabs), the crash matrix, and every result CSV. One CSV schema across all engines, so head-to-head and per-release trends are plain diffs.

# RAM, any installed app, any engine, into results/<ver>/<device>-<engine>.csv
benchmark-suite/profile.sh -s <serial> -p com.cefrium.bench.cef  -l modern-web -e cefrium
benchmark-suite/profile.sh -s <serial> -p com.cefrium.bench.webview -l modern-web -e webview

# Readable per-app table from a result CSV
benchmark-suite/summarize.sh results/0.5.2/w90-cefrium.csv

# OEM crash matrix: N launch cycles, crash rate + tombstones/ANR/LMK
benchmark-suite/crash-matrix.sh -s <serial> -p com.cefrium.bench.cef -n 20

Measured on Cefrium 0.5.2 (Chromium 149.0.7827). Numbers are PSS medians and will shift with the page, the device, and the Chromium version; the scripts are the source of truth, not these snapshots.