# How to Disable Ads, Recommendations and Push Notifications on Chinese Android Phones Without Root

> AI Release · @ai_release1 · https://ai-release.org/guides/kak-otklyuchit-reklamu-rekomendatsii-i-novostnye-podska_en.html

## TL;DR
- Time: 30–45 minutes (first run on a single device)
- Difficulty: Basic (you need a PC, a USB cable, and one terminal)
- You need: a Windows/macOS/Linux PC, Android platform-tools (ADB) from the official SDK, a USB data cable, a Chinese-ROM Android phone (Xiaomi/HyperOS, OPPO/realme/OnePlus ColorOS, vivo/iQOO OriginOS), ~50 MB free space for logs
- Result: system ad services, recommendation feeds, and news cards are disabled per user with `pm disable-user` — no root, no custom recovery, no warranty loss

## Requirements and setup
![Illustration: Requirements and setup](https://ai-release.org/guides/img/kak-otklyuchit-reklamu-rekomendatsii-i-novostnye-podska-en-1.jpg?v=1792874721)

- **OS:** Windows 10/11, macOS 12+, or any Linux with `adb` in `PATH`.
- **platform-tools:** download the official archive for your OS, unpack it, and add the folder to `PATH` (Windows: *System properties → Environment Variables → Path*). Check the exact version in the release notes — **сверьтесь с документацией** for the current build number.
- **Phone:** Developer options enabled (*Settings → About phone → tap “Build number” 7 times*), then *Settings → System → Developer options → USB debugging* ON.
- **Cable:** a data cable, not a charge-only one. Charge-only cables are the #1 cause of the “no devices” error below.
- **Backup:** export your app list before touching anything (Step 1) so you can restore packages later.
- **Parallel task:** if you also debloat Windows, the same logic applies to telemetry — see [How to disable ads, telemetry and AI features in Windows 11](https://ai-release.org/guides/otklyuchit-telemetriyu-i-reklamu-windows-11.html?utm_source=tg&utm_medium=channel&utm_campaign=guide_inline&utm_content=guide_to_guide).

**What to do:** install platform-tools and verify that ADB sees the phone.

```bash
adb version
adb devices
```

**Why:** `adb` (Android Debug Bridge) is the client that talks to the `adbd` daemon on the phone over USB. Everything in this guide is executed as the `shell` user, which is allowed to change package state for user 0 without root.

**How to check:** the first command prints the client version line; the second prints:

```
List of devices attached
4C7A1B2C3D      device
```

If the state column says `unauthorized` or the list is empty, jump to *Troubleshooting* before continuing.

## Step 1. Inventory the packages before you disable anything
**What to do:** dump the full package list and the list of already-disabled packages into two files, then grep for the ad/recommendation candidates.

```bash
adb shell getprop ro.product.model
adb shell getprop ro.build.version.release

adb shell pm list packages            > packages-before.txt
adb shell pm list packages -d         > packages-disabled-before.txt
adb shell pm list packages | grep -iE "msa|mipicks|adsolution|analytics|hiboard|heytap|browser"
```

**Why:** `pm` (Package Manager) is the Android service that owns install/uninstall/enable state. Saving the “before” snapshot is your undo file: if something breaks, you re-enable exactly those packages instead of guessing.

**How to check:** `packages-before.txt` contains several hundred lines starting with `package:`; the grep prints only the candidates. Example output on a Xiaomi build:

```
package:com.miui.msa.global
package:com.miui.systemAdSolution
package:com.miui.analytics
package:com.xiaomi.mipicks
package:com.mi.globalbrowser
```

Package names differ between ROM builds and regions — always confirm with `pm list packages` on **your** device. If a name from the table in Step 2 does not appear, that component does not exist on your build and there is nothing to disable.

Checklist before you proceed:

- [ ] `adb devices` shows your serial with state `device`
- [ ] `packages-before.txt` exists and is non-empty
- [ ] `packages-disabled-before.txt` exists (may be empty on a fresh phone)
- [ ] you have written down the model name printed by `getprop`

**Example:** on a HyperOS device the inventory contains `package:com.miui.msa.global`, which is the MIUI System Ads service; on a ColorOS device the same role is played by a `com.heytap.*` or `com.coloros.*` package, and the exact name must be read from your own dump.

## Step 2. Disable ad, recommendation, and news components
![Illustration: Step 2. Disable ad, recommendation, and news components](https://ai-release.org/guides/img/kak-otklyuchit-reklamu-rekomendatsii-i-novostnye-podska-en-2.jpg?v=1792874728)

**What to do:** put the confirmed package names into a text file, one per line, then loop over it with `pm disable-user`.

```bash
cat > packages-to-disable.txt <<'EOF'
com.miui.msa.global
com.miui.systemAdSolution
com.miui.analytics
com.xiaomi.mipicks
com.mi.globalbrowser
com.miui.android.fashiongallery
EOF

while read -r pkg; do
  [ -z "$pkg" ] && continue
  echo "== $pkg"
  adb shell pm disable-user --user 0 "$pkg"
done < packages-to-disable.txt
```

**Why:** `pm disable-user --user 0` flips the component to the `disabled-user` state for the primary user only. The APK stays in `/system`, so OTA updates still validate, and a single `pm enable` brings it back. This is the non-root equivalent of “freeze” in Titanium Backup.

Typical targets and what they control:

| Target | Typical package (verify with `pm list packages`) | What it does | Risk |
|---|---|---|---|
| System ads service | `com.miui.msa.global` | Serves “recommended” cards inside system apps | Low |
| Shared ad container | `com.miui.systemAdSolution` | Ad SDK used by several system apps | Low |
| Telemetry | `com.miui.analytics` | Usage/event reporting | Low |
| App store feed | `com.xiaomi.mipicks` | GetApps suggestions and notifications | Low, if you don’t use GetApps |
| Browser news cards | `com.mi.globalbrowser` | Mi Browser with article feed | Low, if you use another browser |
| Lock-screen ads | `com.miui.android.fashiongallery` | Wallpaper carousel with promoted content | Low |
| Negative screen | `com.miui.personalassistant` | Left-swipe news/App Vault page | Medium — the screen disappears |
| System player feeds | `com.miui.videoplayer`, `com.miui.player` | Online content inside the local player | Medium — replaces your player |

Do **not** disable `com.android.*` packages, `com.miui.home` (launcher), or `com.android.systemui` — those are core UI, and a wrong hit gives you a boot loop.

**How to check:** each line of the loop prints a state confirmation:

```
== com.miui.msa.global
Package com.miui.msa.global new state: disabled-user
```

Then verify the state directly:

```bash
adb shell pm list packages -d | grep -i msa
adb shell dumpsys package com.miui.msa.global | grep -i "enabled"
```

Expected: the first command echoes the package name; `dumpsys` prints `enabled=2` (disabled) or `enabled=3` (disabled-user) instead of `enabled=0`/`enabled=1`.

**Second lever — Private DNS.** Ads and news cards are fetched from remote hosts, so a filtering resolver kills the remaining requests even inside apps you keep.

```bash
adb shell settings put global private_dns_mode hostname
adb shell settings put global private_dns_specifier <filtering-dns-host>
```

Replace `<filtering-dns-host>` with the hostname published by your DNS filtering provider (the value is provider-specific — **сверьтесь с документацией** of that provider). This works because Android 9+ resolves all lookups over DNS-over-TLS to that host, so blocked domains fail at the resolver instead of inside the app.

**Third lever — notification channels.** For apps you want to keep, silence their promo channel instead of uninstalling:

```bash
adb shell cmd appops set com.miui.videoplayer POST_NOTIFICATION ignore
```

`POST_NOTIFICATION` is available on Android 13+; on older builds use *Settings → Apps → <app> → Notifications* and turn the “Recommendations” channel off manually.

## Step 3. Verify the result and reboot
![Illustration: Step 3. Verify the result and reboot](https://ai-release.org/guides/img/kak-otklyuchit-reklamu-rekomendatsii-i-novostnye-podska-en-3.jpg?v=1792874734)

**What to do:** reboot the phone, then re-check state and behaviour.

```bash
adb reboot
adb wait-for-device
adb shell pm list packages -d
adb shell settings get global private_dns_mode
adb shell settings get global private_dns_specifier
```

**Why:** some OEM services re-spawn their ad component on first boot after a change; a reboot proves the state survived and that nothing crashed at startup.

**How to check:** the expected screen output is a list containing each package you disabled, plus:

```
hostname
<filtering-dns-host>
```

Then inspect the device by hand — the acceptance criteria are visual:

- The left-swipe page (App Vault / Smart Scene) is gone or empty of articles.
- The lock screen shows no promoted wallpaper after unlocking twice.
- The notification shade contains no “Recommended for you” cards after 10 minutes of normal use.
- The system browser app is missing from the app drawer (if you disabled it).

If a package reappears in `pm list packages -d` output as enabled, the ROM restored it — repeat the `pm disable-user` command once; a second failure means the component is protected and you should stop there.

**Example:** after disabling `com.miui.msa.global` and setting a filtering resolver, the folder that previously showed three promoted game tiles shows only the apps you installed.

## Troubleshooting

**Problem. ADB sees no phone at all.**
- Error: `adb: no devices/emulators found`
- Cause: charge-only cable, USB debugging off, or a missing OEM driver on Windows.
- Solution: reconnect with the original cable, set the USB mode to *File transfer (MTP)*, then restart the server and retry:
```bash
adb kill-server
adb start-server
adb devices
```

**Problem. The phone is listed but commands are refused.**
- Error: `error: device unauthorized. Please check the confirmation dialog on your device.`
- Cause: the RSA fingerprint prompt was dismissed, or an old key is cached.
- Solution: unplug, on the phone open *Developer options → Revoke USB debugging authorizations*, replug, and tap **Allow** on the dialog. Verify with `adb devices` — the state must read `device`, not `unauthorized`.

**Problem. Disabling a package fails.**
- Error: `Failure [DELETE_FAILED_INTERNAL_ERROR]` or `Failure [DELETE_FAILED_USER_RESTRICTED]`
- Cause: the package is protected (declared in the system partition manifest as non-removable) or the device has a work profile/device-policy restriction. `DELETE_FAILED_*` applies to `pm uninstall`; `pm disable-user` returns `Exception occurred while executing 'disable-user': java.lang.SecurityException: ...` for the same protected set.
- Solution: drop the uninstall route and keep the package enabled; instead silence its notifications via `appops` (Step 2) and block its hosts with Private DNS. Do not chase it further — a protected component is usually wired into the launcher or settings app.

## Summary and next steps
You now have a repeatable, root-free procedure: snapshot the package list, disable ad/recommendation components with `pm disable-user --user 0`, and cut the remaining traffic with Private DNS. Keep `packages-before.txt` and `packages-to-disable.txt` in version control so you can reproduce the same state after a factory reset, and replace the preinstalled junk with tools you actually chose — see [Best AI apps for Android in 2026](https://ai-release.org/guides/luchshie-ii-prilozheniya-dlya-android-v-2026-godu.html?utm_source=tg&utm_medium=channel&utm_campaign=guide_inline&utm_content=guide_to_guide) and, if you want a desktop-class terminal on the phone itself, [How to Run Linux on Android Without Root: Termux, PRoot, and AI Tools](https://ai-release.org/guides/kak-zapustit-linux-na-android-bez-root-termux-proot-i-i.html?utm_source=tg&utm_medium=channel&utm_campaign=guide_inline&utm_content=guide_to_guide).

## FAQ

**Do I need root to disable system ads on a Chinese Android phone?**
No. `pm disable-user --user 0` runs as the `shell` user over ADB, which is granted permission to change package state for the primary user. Root is only required for editing files inside `/system` or removing an APK physically.

**Will disabling system packages break OTA updates?**
The APK stays in the system partition, only its state changes, so OTA validation is unaffected. A major update may reset some states — after each update, re-run `adb shell pm list packages -d` and re-apply the loop from `packages-to-disable.txt`.

**How do I undo everything?**
Run `adb shell pm enable <package>` for each entry, or restore the whole list at once:
```bash
while read -r pkg; do adb shell pm enable "$pkg"; done < packages-to-disable.txt
```
Expected output per line: `Package com.miui.msa.global new state: enabled`.

**Why do ads come back after a factory reset?**
A factory reset wipes `/data`, including the disabled state, while the APKs in `/system` remain. Re-run Step 1 to rebuild the inventory (package names may differ on the new build) and re-apply the disable loop.
