# Galaxy Watch 4 (SM-R870) Debloat

Session: 2026-11-02. Device: Galaxy Watch 4 44mm Bluetooth, Exynos W920 (2 cores),
1.4 GB RAM, Android 16 / SDK 36, build `R870XXS2JZG3`.

Goal: fix sluggishness, especially the ~5 minute cold boot.

## Outcome

Honest summary: the watch is cleaner, but the root cause was not fixed.

| Metric | Before | After |
|---|---|---|
| Packages | 270 | 197 |
| Watch faces | 60 | 2 (`dynamicfont` active, `emergency` kept) |
| Storage used | 2.9 G | 2.5 G |
| `/data/log` | 265 MB | 2.2 MB |
| Swap (ZRAM) | 42% | 40% |
| Animation scale | 1.0 | 0.5 |

## What the investigation actually found

`MemAvailable` turned out to be the wrong metric — it swings +/-30 MB within a
minute on an idle device, so single snapshots prove nothing. Two readings were
misread during the session before this was understood.

The real signal is swap:

    200%cpu  9%user  12%sys  176%idle     <- CPU is 88% idle, not the bottleneck
    Swap: 986900K total, 417056K used     <- 417 MB swapped out

High load average (7-10) on a 2-core chip looked like CPU saturation, but Linux
load counts processes blocked in uninterruptible sleep. Those processes are
waiting on ZRAM decompression, not on CPU. Lag = swap-in stalls.

Swap is spread evenly across ~18 processes at 28-50 MB each. Nine of the top ten
are `gms`, `system_server`, `sysui`, `systemui`, `wear.services`, settings, and
the active watch face — none removable. This is Android 16 not fitting in
1.4 GB, not a misbehaving app.

One genuine find: `com.samsung.android.watch.watchface.healthmodular` was running
as a foreground service at `oom_score_adj=0` with 252 MB RSS while not being the
active watch face. At priority 0 the system cannot reclaim it under pressure.
It is gone now.

## Files

- `packages-before.txt` — all 270 packages, captured before any change
- `packages-after.txt` — 197 packages (derived: before minus removed)
- `removed.txt` — the 73 removed packages
- `watchstat.sh` — RAM / swap / load / disk / battery over adb. `-w` for live refresh
- `restore.sh` — restore all or specific packages

## Kept deliberately

`com.android.vending` (Play Store), `com.wssyncmldm` (firmware OTA),
`com.samsung.android.wear.shealth`, `com.google.android.wearable.assistant`,
`com.samsung.android.watch.watchface.emergency` (emergency mode display),
`com.samsung.android.watch.watchface.tickingsound`, and the watch face
infrastructure (`complicationhelper`, `companionhelper`, `runtime`).

Play Store and the FOTA updater were removed mid-session and restored. Without
the FOTA agent the watch receives no firmware updates; without Play Store on the
watch, apps cannot be installed or updated — including from the phone, since the
phone only sends the request and the watch-side installer executes it.

## Reconnecting

Wireless debugging turns itself off after every reboot.

1. Watch: Settings > Developer options > Wireless debugging > on
2. `adb pair <ip>:<pairing-port> <6-digit-code>` (pairing persists; the port changes)
3. `adb connect <ip>:<connect-port>`, or let mDNS find it

Pairing from this session is already stored, so step 2 is usually unnecessary.

## Still open

Nothing further is worth removing. The remaining levers:

1. Factory reset — not for the apps, but to drop 4-5 years of accumulated app
   data and profiles that `pm clear` cannot reach. The only option with real odds.
2. Accept it, and never let the watch power off: enable Battery Protection
   (85% limit), charge regularly, never hit 0%. No cold boot, no 5 minute wait.

Option 2 was the user's own instinct at the start of the session, and it remains
the correct answer to the original complaint.
