It's a Toshiba 50LF621U19, a Fire TV Edition set: Fire OS 6.7.1.1 (Android 7.1.2 underneath) with 1.5 GB of RAM. It had gotten slow, and every press of Home opened a wall of ads.
It also has no physical remote. The only remote is the Fire TV app on my phone, which turned out to matter a lot.
The work came in two parts. First I switched off Amazon's ad, tracking and extra services, without uninstalling anything. Then I built a small Android app to replace the home screen, because Amazon draws the banner ads itself and won't let you turn that off.
Turning off 37 services didn't remove a single ad
I pulled the screenshot straight off the TV with adb exec-out screencap -p and found each region's pixel edges in a script rather than eyeballing them. The ad banner runs from row 0 to row 1032 at full width. Amazon's picks start at row 1351. My six app tiles are 290 by 162 pixels each, which is how six whole apps add up to 3.4%.
I took that screenshot after the debloat below, and that's the point: the home screen app draws the ads itself, so switching off services doesn't touch them. Getting rid of them took Part 2.
Switching things off, without uninstalling anything
Every change in this part is reversible with one command, and nothing was deleted from the TV.
Fire TV is Android underneath, so it speaks ADB (Android Debug Bridge), the same tool developers use to talk to phones. You turn on Settings > Device & Software > Developer Options > ADB debugging, then connect from a laptop on the same Wi-Fi:
adb connect <tv-ip>:5555
The command that does the work is:
adb shell pm disable-user --user 0 <package>
That tells Android's package manager to switch an app off for the TV's one user. The app stays installed; it just can't run, start at boot or show up. pm enable <package> brings it back. No root, no unlocked bootloader.
Before touching anything I saved a snapshot: every installed package and its state, every system setting, and the memory numbers. Then I went in small batches, grouped by what the services do, and checked after each one that the phone remote, the Xbox input and Netflix still worked. A small script disabled each package and logged it, so a matching restore.sh could put any batch back. After the first batch the TV already felt much faster.
The 37 things I turned off
11 were for ads, tracking and telemetry. The other 26 were Amazon extras nobody in the house used. Where a package only has a codename, I describe it the way it identified itself on the TV and say so.
- Ads, tracking, telemetry 11
- Extras I never used 26
Ads and tracking
7- com.amazon.hybridadidserviceThe advertising ID: the identifier ad networks use to recognize the device
- com.amazon.kso.blackbirdSpecial Offers, Amazon's sponsored-content service
- com.amazon.sneakpeekSneak Peek
- com.amazon.cevicheAn event tracker (codename)
- com.amazon.shoptv.clientAmazon Shopping on the TV
- com.amazon.shoptv.firetv.clientAmazon Shopping, the Fire TV half
- com.amazon.tv.democontent.providerStore demo content, meant for TVs on a store shelf
Telemetry
4- com.amazon.perfcollectionPerformance data collection
- com.amazon.tv.fw.metricsFire TV framework metrics
- com.amazon.wirelessmetrics.serviceWi-Fi metrics
- com.amazon.dp.loggerA device logger
Amazon apps and extras
11- com.amazon.imdb.tv.android.appFreevee (formerly IMDb TV)
- com.imdb.livingroom.firetvIMDb's TV app
- com.amazon.minitv.android.appAmazon miniTV
- com.amazon.bueller.musicAmazon Music
- com.amazon.bueller.photosAmazon Photos
- com.amazon.bueller.notificationA notification service (codename; disabled by name, see below)
- com.amazon.gamehubGameHub
- com.amazon.cloud9Silk, Amazon's web browser
- com.amazon.tahoeAmazon Kids
- com.amazon.tmm.tutorialA setup tutorial
- com.amazon.tv.releasenotesThe "what's new" release notes tutorial
Alexa extras
9The Alexa core (com.amazon.vizzini) stayed on, so voice search from the phone app still works. These are the pieces around it.
- com.amazon.alexamediaplayer.runtime.ftvAlexa's media player
- com.amazon.alexa.externalmediaplayer.fireosAlexa's external media player
- com.amazon.tv.alexaalertsAlexa alerts
- com.amazon.tv.alexanotificationsAlexa notifications
- com.amazon.cardinalAlexa cards (codename)
- com.amazon.aiondecAlexa skills (codename)
- com.amazon.wha.mediabrowserserviceA media-browser hook for Alexa audio
- com.amazon.spotify.mediabrowserserviceA media-browser hook for Spotify through Alexa
- com.amazon.audiohomeAlexa's audio home (disabled by name, see below)
Screensaver
1- com.amazon.ftv.screensaverAmazon's screensaver. Swapped for Android's built-in color screensaver
Leftovers found in round 2
5- com.snei.vue.firetvPlayStation Vue, a TV service that shut down in 2020
- com.amazon.hedwigFire TV Channels
- com.amazon.ariaAmazon's pop-up surveys
- com.amazon.tv.localgalleryThe USB photo viewer
- com.android.printspoolerThe print spooler, on a TV with no printer
Two of these, the notification service and audio home, I disabled by name without first checking what they contained. If system pop-ups ever stop appearing, the notification service is the first thing to turn back on; if anything audio breaks, audio home.
Background limits, settings, and what Amazon wouldn't let me touch
Background limits, 11 apps. Several streaming apps loaded themselves at power-on and sat in memory whether anyone used them or not. This command stops that without breaking the app:
adb shell cmd appops set <package> RUN_IN_BACKGROUND ignore
The app still opens and plays normally; it just can't run while nobody is using it. I applied it to Paramount+, Hulu, Max, Peacock, Disney+, YouTube, Apple TV, TNT, Adult Swim, ABC and Fox Sports. Netflix and Prime Video, the two we use most, were left alone. Android also logs when each app last played audio, which showed some of these hadn't been opened in over a year and a few never.
Settings, 5.
| Setting | Was | Now |
|---|---|---|
screensaver_components | Amazon's screensaver | Android's Colors screensaver |
screensaver_default_component | Amazon's screensaver | Android's Colors screensaver |
window_animation_scale | 1.0 | 0.5 |
transition_animation_scale | 1.0 | 0.5 |
animator_duration_scale | 1.0 | 0.5 |
Halving the animation scales makes every menu transition take half as long, which makes a 1.5 GB TV feel noticeably snappier.
Refused, 6. Amazon marks these as protected, and pm disable-user simply fails on them: the ad deep-linker com.amazon.ftvads.deeplinking, two metrics services com.amazon.client.metrics and com.amazon.device.metrics, the crash and log managers com.amazon.device.crashmanager and com.amazon.device.logmanager, and an analytics service, com.amazon.diode.
Amazon's home screen app (com.amazon.tv.launcher) is protected the same way, which is why the ads survived everything above. Without root, Fire OS also refuses finer-grained switches, like turning off just one app's start-at-boot hook.
What I left alone, on purpose
The most important list in this project is the one I never touched, because one wrong disable here leaves a TV with no remote.
| Kept | Why |
|---|---|
| storm.lightning.services, whisperlink.core.android, whisperplay.*, tcomm*, dialservice, ssdpservice, communication.discovery, firerestapiframework, tv.turnstile | The phone app is my only remote. These find the TV on the network, pair it (turnstile shows the pairing PIN) and carry the button presses. Break them and the TV can't be controlled at all. |
| com.mstar.*, franktvinput, tifobserver, tv.inputpreference.service, tv.livetv, tv.channelscan, providers.tv, tv.devicecontrol* | The HDMI inputs. My Xbox is on HDMI 1. |
| com.amazon.vizzini | Alexa's core, which voice search from the phone app needs. |
| com.amazon.venezia | The Appstore, which keeps the streaming apps updated. |
| firebat, avod | Prime Video. |
| imp | Amazon account sign-in. |
| prism, aca, adep | Profile linking, account sync, and device security. |
| tv.launcher, tv.ime | Amazon's home screen and the on-screen keyboard. |
After the final restart I checked the phone app, the Xbox input, Netflix and Disney+ (one of the background-limited apps). All four worked.
Writing my own home screen
Since Amazon draws the ads itself and won't let its home screen be disabled, I wrote a replacement: a small sideloaded Android app I call TV Home. The hard part wasn't the screen. It was getting Fire OS to show it.
On a normal Android TV you install a launcher and pick it as the default. Fire OS blocks that and every other clean way in. Here's everything I tried, all tested on this TV:
| Tried | Result | |
|---|---|---|
Set the default home app (cmd package set-home-activity) | Says "Success", then keeps Amazon's home anyway | Refused |
| Amazon's "Home pressed" broadcast | Locked to Amazon-signed apps | Refused |
| An accessibility service that watches which window is open | Fire OS erases the setting the instant it's written | Refused |
| Android's standard "home key" broadcast | Never sent on this build | Refused |
| Amazon's input switcher, for an Xbox tile | Every permission it needs is Amazon-only | Refused |
| Usage events, Android's log of which app came to the front | Sees Amazon's home appear | Works |
| An overlay window, the kind chat bubbles use | Covers Amazon's home about a quarter second after Home | Works |
| Android's TV input API, pointed at HDMI 1 | The Xbox tile switches to the Xbox itself | Works |
So TV Home works like this. A small background service reads the usage events every 100 ms while the screen is on. The moment Amazon's home comes to the front, it reveals an overlay with my home screen, already built and waiting, so you never see Amazon's. Android holds new apps back for about 5 seconds after Home is pressed (only system apps are exempt), so the overlay covers until the real home screen takes over.
Both permissions it needs are granted once over ADB:
adb shell cmd appops set work.clendenin.tvhome GET_USAGE_STATS allow
adb shell cmd appops set work.clendenin.tvhome SYSTEM_ALERT_WINDOW allow
What's on it, each piece picked from rendered mockups:
- Most watched: four big tiles, ranked from the TV's own usage history over the past months
- More: the next apps, plus All apps and Settings
- An Xbox tile with a small On / Off pill read from the HDMI input's state
- The clock, the date and the weather from Open-Meteo, a free API with no key, at town-level location
- A background tint that shifts with the time of day, and nothing bright at night
- Auto-tidy: coming home closes background apps except the one you just used and the top two
- A calm screensaver, Aurora: slow color drifting, with no clock or data on it
I built it without Android Studio or Gradle, just the command-line tools: javac to compile, d8 to convert for Android, aapt2 to package and apksigner to sign, then adb install.
No ads, and Netflix opens just as fast
I set one rule before building it: a version that makes Netflix open slower doesn't ship. So I timed Netflix cold starts with a script, five runs each, with and without TV Home.
| Run | Netflix cold start, median of 5 | Idle CPU on home |
|---|---|---|
| Amazon's home, first measurement | 1,768 ms | 8.7% |
| TV Home, first try (failed the rule) | 1,887 ms | 3.1% |
| TV Home, fixed | 1,842 ms | 3.0% |
| Amazon's home, measured again right after | 1,822 ms | 8.5% |
The first version broke the rule: its watcher kept polling while Netflix was starting up and slowed it by about 120 ms. The fix was to have it back off for a few seconds after any app opens. After that, Netflix was within about 20 ms of plain Fire TV, while plain Fire TV itself drifted 54 ms between two runs, so the difference is noise.
Idle CPU dropped from about 8.6% to 3%, because Amazon's home is always animating its banner and mine sits still. TV Home costs about 45 MB of memory. It doesn't save memory overall, because Amazon's protected home keeps running behind mine: this was a win for ads and looks, not for RAM.
Three bugs worth telling
The TV's clock ran ahead of itself
Pressing Home sometimes flashed Amazon's screen for a moment, and once it stayed up for 38 seconds. On this TV, the timestamps on usage events run 0.5 to 39 seconds ahead of the system clock. My app asked for "events up to now", so a fresh event stamped in the future was invisible until the clock caught up. The fix was one line: ask for events up to a time far in the future. Now about half of Home presses are covered within 50 to 100 ms, with no visible frame of Amazon's screen, and the rest in about half a second, which is Android itself recording the event late.
The screensaver used a quarter of the CPU
Aurora first drew a 640 x 360 picture and scaled it up to the 4K screen in software, 20 times a second: 25% CPU. Halving the size and dropping to 15 fps got it to 17%. The real fix was handing the scaling to the display hardware (a fixed-size SurfaceView buffer of 320 x 180, at 10 fps): about 8%, and it looks the same, because slow color drifts don't need detail.
"Most watched" put the wrong app first
Asking Android for 60 days of usage at once quietly returned coarse buckets and ranked Max first, which isn't what we watch most. Reading four weeks of weekly records, plus six months of monthly records counted at a tenth, gave the right order.
Undoing it, and what I'd tell you first
All of it comes back with two scripts: restore.sh re-enables every package, setting and background limit from the log, and revert-home.sh puts Amazon's home screen back (and can uninstall TV Home). Any single package is just adb shell pm enable <package>.
- Snapshot first. Save
pm list packagesand the threesettings listoutputs before you change anything, so you know what normal was. - Find out what your remote depends on. If a phone app is your remote, the services in my "left alone" table are off limits. Disabling the wrong one leaves you with no way to control the TV.
- Go in small batches and test between them. Remote, inputs, and the apps you actually watch, every time.
- Log every change, so undoing it is a script and not a memory test.
- Expect a Fire OS update to turn some of it back on. Compare
pm list packages -dagainst your log and re-run. - Turn ADB debugging off when you're done. Left on, anything on your Wi-Fi can try to connect to the TV.
I did this with Claude Code, an AI coding assistant: it ran the ADB commands and wrote the Android code, and I made the calls on what to cut, what the screen looked like, and tested everything on the TV.