Turn off the apps your phone won't let you uninstall.
Thor freezes them: they stop running, stop starting at boot, and leave the launcher. Unfreeze whenever you want. It works through root — or through Shizuku or Dhizuku, neither of which needs root. You will need one of the three.
Source: github.com/trinadhthatakula/Thor

Freeze it, and it stops.
A frozen app doesn't run in the background, doesn't start at boot, and doesn't appear in your launcher. It isn't hidden, and wherever the platform lets Thor disable it, it isn't uninstalled either — it is switched off, and you can switch it back on.
Freeze one app, or select forty and freeze them together. Save a group as a profile and put the whole thing behind one tap. Thor keeps a watchlist of what you've frozen, so nothing quietly stays off without your knowing.
And a home-screen shortcut Thor pinned for an app doesn't vanish when you freeze it — the icon turns grey, and tapping it unfreezes the app and opens it.
Your data stays where it is. Freezing switches an app off; it doesn't take anything away. On the handful of devices that refuse to let a preinstalled app be switched off, Shizuku mode removes it for your Android user instead, with the keep-data flag — the app's files and settings stay, so unfreezing brings it back with its data attached. Permissions are the part I can only tell you about narrowly: one runtime permission was measured across that round trip and came back granted, on one platform build, and app-ops were never measured, so I won't promise more than that. Root has no such fallback: a refusal is reported as a failure and the app is left installed. Dhizuku is the exception, and the one to avoid for preinstalled apps — it freezes them by removing them for your user in every case, and without that flag. Where nothing the platform allows will switch an app off, Thor tells you it couldn't, rather than doing something else.

The ones that would break your phone, it refuses.
Thor ships the Universal Android Debloater safety data: 5,364 packages, each rated Recommended, Advanced, Expert or Unsafe. Freezing a system app rated Unsafe is blocked outright — not warned about, blocked, with no confirm button on the dialog. Expert-rated ones warn first. If the list fails to load at all, every system app is blocked until it does.
Thor does not make debloating safe. It makes the dangerous cases visible before you touch them.

Grant nothing, and look around first.
With no root, no Shizuku and no Dhizuku, Thor still lists every app on your device, searches and sorts it, filters by declared permission group using Android's own localised labels, shows you which store installed what, and exports an installed app's APK.
You can decide whether you want Thor before you give it anything.

You may not need root.
Thor runs on three privilege engines, and you pick which one is active:
- Root — everything, including the operations below.
- Shizuku — no root. Runs Thor's commands through Shizuku's service, which holds the shell user's privilege when you start it over ADB.
- Dhizuku — no root. Uses Android's Device Owner API.
The honest part: Shizuku and Dhizuku don't need root, but they aren't zero-setup either. Each is a separate app with its own setup, from developer options and an ADB or wireless-debugging step, and Shizuku has to be started again after a reboot unless it was started with root.
Root-only work is named rather than faked. Rebooting the device returns an explicit failure without root; per-app cache size simply reads zero.
Batch uninstalls, reinstalls, cache and data clears print a line per app as they run, so a failure names the app and the reason; a batch freeze reports a running count of how many were done and how many failed. Android 9 or newer.

What you're trusting.
Thor is free software under GPL-3.0-or-later, written in the open and almost entirely by one developer.
There is no analytics, no crash reporter, and no advertising — not disabled, not present. Exactly one file in Thor's own code opens a network connection,data/repository/StoreRepositoryImpl.kt, so a grep for openConnectionover app/src finds it and nothing else. It runs when you open the Extension Store, and again when you install an extension from it — nowhere else. Thor declaresINTERNET, and the manifest comment directly above it says why.
The Play Store build additionally bundles Google's billing library for the in-app support option, and declares com.android.vending.BILLING. It connects to Play when the app opens, not when you go looking for the support option, so that build talks to Google before you have touched anything. The foss build has neither — its billing class is a no-op.
The foss build is reproducible, and IzzyOnDroid publishes it with their own reproducible-build badge — their check, not my claim.