From a Software Update to a Windows Tool

The previous post was about setting up a new e-reader. This one is about losing an old one.

I had been using a Boox Leaf3 for several years. It was the device that finally got me reading again after a long stretch of pretending I was too busy to finish a book. The e-ink panel was honest. The form factor was right. I kept it in the same pocket every day for years.

Then an OTA update arrived and everything slowed down.

The update that broke it

I don't know exactly what changed. Vendors don't publish meaningful release notes for e-reader firmware, and I didn't keep a before/after video. What I can tell you is the subjective experience: page turns lagged, the launcher stuttered, wake-from-sleep took long enough that I started dreading it, and a device I used to forget was "running Android" suddenly reminded me constantly.

I tried the obvious things. Clearing caches. Uninstalling the third-party apps I had added. Re-flashing the same firmware from scratch. None of it helped meaningfully, because the slowdown wasn't coming from user data - it was coming from what Boox ships alongside the reader.

What actually lives on a Boox

If you look inside a stock Boox device with adb shell pm list packages, you find a long catalogue of things that have nothing to do with reading a book. Some of it is Google Mobile Services and its many satellites. Some of it is Boox's own ecosystem plumbing - sync services, push, account services, telemetry, feedback uploaders. Some of it is generic Android utilities that nobody on an e-ink device will ever touch.

Each of those packages costs something. RAM, background CPU, wake-ups, storage. On a device whose CPU and refresh rate are already compromised by the display technology, those costs are disproportionate. The same bloat that is invisible on a modern phone is measurable on a Leaf3.

My first instinct was to remove the obvious offenders by hand. I got maybe three commands in before I realized this was going to happen again on the next device I bought, and probably every time I factory reset. A terminal session full of pm uninstall --user 0 ... lines is not a process. I wanted something I could re-run.

Why a GUI instead of a script

I almost wrote a bash script. Two things stopped me.

First, the package list is not a static blob. Some apps need to be uninstalled; others should only be disabled, because the system rebinds to them at boot. Some tweaks require settings put instead of package management. Some steps need to happen in a specific order. Wrapping all of that in one script was possible, but the result would be fragile and none of it would be reviewable at a glance.

Second - and this is the real reason - I didn't want to have to remember any of it. Six months from now I will not recall which package handles Boox's feedback uploader. I want to open a window, read checkboxes, click Apply, and move on. A GUI is the artifact I can hand my future self and expect future-me to actually use.

So I built one.

The Leaf3 Cleaner

The first version was Leaf3-specific. Python for the logic, CustomTkinter for the window, ADB for everything that touched the device. The whole thing ships as a single Windows executable built with PyInstaller, with Android platform-tools bundled alongside so there is nothing to install on a fresh machine.

The tool has three tabs:

  • App removal - a curated list of packages I am willing to lose, each a checkbox. The tool filters the list against what is actually installed on the connected device, so you only see packages you can really act on.
  • Service disable - a smaller list of services that should stay installed but shouldn't run. Things that rebind after a plain uninstall.
  • Performance tuning - a handful of settings put calls that reduce animation scales, disable launch animations, and nudge the system toward lower latency.

The hardest part wasn't the code. It was getting USB debugging enabled in the first place.

The Activity Launcher trick

Boox's launcher hides Android's normal developer settings. You cannot reach About device the way you would on a normal Android phone, which means you cannot tap the build number seven times, which means you cannot turn on developer mode, which means you cannot turn on USB debugging, which means you cannot use ADB at all.

The workaround is to install Activity Launcher from the Play Store, find the Android system settings activity in its list, launch it directly, and walk into About tablet from there. Seven taps on the build number, back out, and USB debugging appears in the now-visible developer options menu. From there ADB behaves exactly like it does on any other Android device.

I wrote all of this into the documentation because I knew I would forget it myself.

What it fixed

Running the Leaf3 Cleaner on my device took under a minute. The slowdown didn't disappear - the firmware was still the firmware - but it shrank to something I could live with. The device stopped feeling like it was fighting me. I got another eight or nine months out of it before the crack on the screen made it a two-and-a-half-handed object instead of a one-handed one.

I never posted the Leaf3 Cleaner to a forum. It was personal tooling, not a product. It sat on my drive, and I ran it whenever I reset the device, and that was the entire lifecycle I expected.

Then I bought a Palma 2 Pro. And the package list did not match.

That is, of course, the next post.