你有没有遇到过这种情况:设备用得好好的,某天打开设置,突然发现“系统更新”旁边多了一个刺眼的红点;没过两天,OTA 更新弹窗准时跳出来,你点了“暂不”,它明天再来。很多人一开始觉得无所谓,直到某次手滑点了“立即更新”,升级完成后才发现:系统变卡了、广告变多了、原本能装的 App 装不了了,而厂商早就关闭了降级通道。
这个问题的关键,其实不是“你不想升级”,而是“厂商把‘暂时不更新’做成了一场没完没了的骚扰”。对于电视盒子、备用手机、老人机、车机这类设备来说,OTA 更新往往不是体验提升,反而是负优化。与其每天跟弹窗斗智斗勇,不如一次性把系统更新服务在本地禁用掉。
这篇文章就做一件事:给你一套一键脚本,通过 ADB 禁用系统更新组件、关闭更新通知权限,从根源上消灭“设置小红点”和“OTA 更新弹窗”。整个过程不需要 root、不需要刷机、不需要逐条敲命令,并且提供一键恢复方案。文章会讲清楚原理、适用场景、脚本实现、验证方法和常见坑,方便你收藏后照着操作。
1. 为什么越来越多人想彻底关掉 OTA 更新
1.1 小红点和弹窗是怎么来的
绝大多数安卓设备的“设置小红点”,并不是设置 App 自己画出来的,而是系统更新服务通过通知渠道发了一条高优先级通知,桌面启动器检测到未读通知后,在设置图标右上角叠加了一个角标。也就是说,红点只是“系统更新应用还在活跃”的视觉信号。
OTA 升级弹窗的逻辑也类似:系统更新应用会定期访问厂商的更新服务器,一旦发现新版本,就通过系统级弹窗把结果推给你。部分 ROM 甚至会把弹窗做成“每次开机/解锁都检查一次”的频率。于是你点了“暂不”,第二天它还会来。
1.2 OTA 更新对部分设备就是负优化
如果这是你的主力手机,我完全理解厂商推送安全补丁的价值。但问题是,很多设备并不适合频繁升级:
- 旧手机:新系统往往更吃内存,省电策略改变,功能被砍,升级后明显变卡。
- 电视盒子:有些厂商会借 OTA 更新推送新的广告桌面、限制第三方应用安装、甚至替换预装软件。
- 老人机/学习机/专用设备:稳定性比新功能更重要,一次失败的系统升级可能让设备直接变砖。
- 车机/工控设备:供应商停止维护后,一次“顺手”的 OTA 更新可能引入新的不兼容问题。
更麻烦的是,大部分设备升级后无法回退。即使你找得到旧版本固件,厂商也可能通过签名校验和防降级机制阻止刷入。所以,“拒绝更新”不是矫情,而是对设备控制权的坚持。
2. 核心原理:ADB、pm disable-user 与通知角标
2.1 什么是 ADB
ADB 全称 Android Debug Bridge,是 Google 官方提供的安卓调试工具。它通过 USB 或网络与设备通信,可以让你在电脑上执行设备端的 shell 命令。我们今天的脚本,核心就是借助 ADB 向设备发送“禁用某个应用”的指令。
使用 ADB 不需要 root,也不需要刷入第三方 Recovery,只需要在设备上打开“开发者选项”里的 USB 调试。这个门槛非常低,几乎所有安卓设备都支持。
2.2 pm disable-user 和 pm uninstall 的区别
很多教程会告诉你“卸载系统更新应用”,但更稳妥的做法是用 pm disable-user。
pm disable-user --user 0 <包名>这个命令的意思是:只对当前用户(用户 0)停用这个应用。它有几个好处:
- 不需要 root,系统应用也能禁用。
- 不是真正的删除,系统分区不受影响。
- 随时可以用 pm enable <包名> 恢复。
- 应用数据还在,恢复后不需要重新配置。
而 pm uninstall -k --user 0 <包名> 虽然也可以移除系统应用,但效果更接近“删除”,有些 ROM 重启后会重新安装,有些 ROM 在恢复时需要额外处理。所以本文统一采用 disable-user,安全性和可恢复性都更好。
2.3 为什么禁用更新应用后,红点会消失
前面说过,红点本质是更新应用的通知。当你用 pm disable-user 停用更新应用后,它就无法再向系统发送通知,Launcher 自然检测不到未读消息,设置图标上的红点就会消失。
如果个别 ROM 在禁用后仍然显示红点,通常是因为“设置”App 自己也订阅了更新状态。这时候需要再补一步:关闭“设置”App 的通知角标权限,或者到桌面长按“设置”图标,进入“应用信息 - 通知 - 角标”,手动关闭。这部分无法在脚本里完全自动化,因为不同桌面启动器的角标控制方式不同。
2.4 为什么选择一键脚本
手动操作其实只有几步:
adb shell pm disable-user --user 0 com.android.updater adb shell appops set com.android.updater POST_NOTIFICATION ignore但问题在于:不同品牌的更新应用包名不一样,不同系统版本对通知权限的处理也不一样。你很可能需要先查包名、再逐条执行、最后还要验证效果。一个一键脚本可以帮你把这些动作封装成“双击运行”和“双击恢复”两个入口,既降低操作门槛,也避免误删其他系统组件。
3. 适用场景与使用边界
3.1 适合这样做的设备
下面这些场景,强烈建议使用本文的屏蔽方案:
- 电视盒子/投影盒子:主界面广告越来越多,系统更新频繁推送新桌面。
- 备用旧手机:不承担日常通讯,只用来做监控、闹钟、遥控器、下载机。
- 老人机/学习机:避免误触升级导致界面变化、应用无法使用。
- 车机/工控屏/收银机:稳定大于一切,不允许后台自动下载更新包。
- 被厂商负优化“伤过”的设备:升级后卡顿、发热、广告增多,想回到旧版又回不去。
3.2 不建议这样做的设备
- 主力手机:尤其你在意安全补丁、银行 App 兼容性、新功能体验的情况。
- 在保设备:虽然 disable-user 不涉及刷机,但部分厂商对“系统组件被停用”仍可能影响售后判断。
- 银行/支付/门禁类专用终端:系统更新往往包含安全修复,不能因小失大。
- 完全不理解“恢复”是什么的小白用户:请务必把恢复脚本一起保存好。
3.3 安全边界
本文所有操作仅限本人自持设备。执行前建议先备份重要数据,尤其是通讯录、照片和微信记录。虽然 disable-user 基本不会影响数据,但任何系统级操作都应该有“后悔药”。不要在他人设备上执行本脚本,也不要对不了解用途的系统应用随意禁用。
4. 环境准备:从零到能跑 ADB
4.1 电脑端安装 platform-tools
ADB 是 Google 官方工具,包含在 Android SDK Platform-Tools 里。你不需要安装完整的 Android Studio,只需要下载 platform-tools。
下载解压后,建议把 adb 所在目录加入系统 PATH,这样在任何目录下都能直接执行 adb 命令。如果你不想配置 PATH,也可以把后面脚本里的 adb 换成绝对路径。
验证是否安装成功:
adb version正常会输出类似:
Android Debug Bridge version 1.0.41 Version 33.0.3-136823624.2 手机/盒子开启开发者选项
以手机为例:
- 打开“设置 - 关于手机”。
- 连续点击“版本号”7 次,直到出现“您已进入开发者模式”提示。
- 返回设置,进入“开发者选项”。
- 打开“USB 调试”。
电视盒子的入口不太一样。很多盒子在“设置 - 关于”里没有“版本号”,而是直接提供“ADB 调试”开关,或者在“网络设置”里提供“远程调试”模式。如果找不到,可以尝试在“设置”里搜索 “ADB” 或“调试”。
4.3 连接与授权
用数据线连接手机和电脑后,设备上会弹出“是否允许 USB 调试”的授权窗口,勾选“始终允许”并确认。
然后执行:
adb devices如果输出类似:
List of devices attached abcdef123456 device说明设备已成功连接。如果显示 offline,通常是驱动问题或授权被拒绝;如果显示 unauthorized,说明设备上还没点允许。
5. 一键脚本:下载到运行
5.1 脚本干了什么
整个脚本分为两步:
- 扫描并禁用常见系统更新包。
- 关闭“设置”和更新应用的通知角标权限。
脚本不会动 GMS、下载管理器、SystemUI 等关键组件,也不会删除任何文件。它只执行 pm disable-user 和 appops 两类指令,所有操作都可以通过恢复脚本还原。
5.2 Windows 一键脚本 disable_ota.bat
在 Windows 上,新建一个文本文件,命名为 disable_ota.bat,内容如下:
@echo off chcp 65001 >nul setlocal enabledelayedexpansion echo ============================================== echo OTA Update And Settings Badge Cleaner echo For personal devices only echo ============================================== echo. REM ---------- 1. check adb ---------- where adb >nul 2>nul if errorlevel 1 ( echo [ERROR] adb not found in PATH. echo Please install platform-tools first. echo Download: https://developer.android.com/tools/releases/platform-tools pause exit /b 1 ) REM ---------- 2. check device ---------- echo [INFO] Waiting for ADB device ... adb wait-for-device adb shell echo ok >nul 2>nul if errorlevel 1 ( echo [ERROR] Cannot connect to device. echo Please enable USB debugging and authorize this computer. pause exit /b 1 ) REM ---------- 3. show device info ---------- set MFG= for /f "delims=" %%a in ('adb shell getprop ro.product.manufacturer') do set MFG=%%a set MODEL= for /f "delims=" %%a in ('adb shell getprop ro.product.model') do set MODEL=%%a echo [INFO] Device : !MFG! !MODEL! echo. REM ---------- 4. disable known OTA packages ---------- set CANDIDATES=com.android.updater com.android.ota com.oplus.sau com.coloros.sau com.vivo.smartupdate com.huawei.android.hwouc com.wssyncmldm echo [STEP 1/2] Disabling known OTA packages ... for %%p in (%CANDIDATES%) do ( call :try_disable %%p ) echo. REM ---------- 5. turn off notification badge ---------- echo [STEP 2/2] Disabling notification badge ... adb shell appops set com.android.settings POST_NOTIFICATION ignore >nul 2>nul for %%p in (%CANDIDATES%) do ( adb shell appops set %%p POST_NOTIFICATION ignore >nul 2>nul ) echo [INFO] Notification badge disabled. echo. echo [DONE] Please restart your device and check Settings icon. echo [UNDO] Run restore_ota.bat to re-enable update service. pause exit /b 0 :try_disable adb shell pm disable-user --user 0 %1 >nul 2>nul if not errorlevel 1 ( echo [OK] %1 disabled ) else ( echo [--] %1 not present or failed ) exit /b 0使用方法:把手机/盒子通过 ADB 连上电脑,双击运行 disable_ota.bat,等到输出 DONE 后重启设备。
这个脚本里有一个细节需要注意:chcp 65001把命令窗口切到 UTF-8 编码,避免中文乱码。如果你的系统控制台字体不支持 UTF-8,可以把脚本里的中文提示改成英文,并不影响功能。
5.3 macOS/Linux 一键脚本 disable_ota.sh
如果你在 macOS 或 Linux 环境,新建 disable_ota.sh,内容如下:
#!/usr/bin/env bash echo "==============================================" echo " OTA Update And Settings Badge Cleaner" echo " For personal devices only" echo "==============================================" echo # 1. check adb if ! command -v adb >/dev/null 2>&1; then echo "[ERROR] adb not found. Install platform-tools first." exit 1 fi # 2. wait device adb wait-for-device if ! adb shell echo ok >/dev/null 2>&1; then echo "[ERROR] Cannot connect to device." exit 1 fi MFG=$(adb shell getprop ro.product.manufacturer | tr -d '\r') MODEL=$(adb shell getprop ro.product.model | tr -d '\r') echo "[INFO] Device : ${MFG} ${MODEL}" echo CANDIDATES="com.android.updater com.android.ota com.oplus.sau com.coloros.sau com.vivo.smartupdate com.huawei.android.hwouc com.wssyncmldm" echo "[STEP 1/2] Disabling known OTA packages..." for pkg in $CANDIDATES; do if adb shell pm disable-user --user 0 "$pkg" >/dev/null 2>&1; then echo " [OK] $pkg disabled" else echo " [--] $pkg not present or failed" fi done echo echo "[STEP 2/2] Disabling notification badge..." adb shell appops set com.android.settings POST_NOTIFICATION ignore >/dev/null 2>&1 || true for pkg in $CANDIDATES; do adb shell appops set "$pkg" POST_NOTIFICATION ignore >/dev/null 2>&1 || true done echo echo "[DONE] Restart your device and check Settings icon." echo "[UNDO] Run restore_ota.sh to re-enable update service."运行前赋予执行权限:
chmod +x disable_ota.sh ./disable_ota.sh5.4 一键恢复脚本 restore_ota.bat
无论禁用后效果如何,你都需要一个“后悔药”。新建 restore_ota.bat,内容如下:
@echo off chcp 65001 >nul setlocal enabledelayedexpansion set CANDIDATES=com.android.updater com.android.ota com.oplus.sau com.coloros.sau com.vivo.smartupdate com.huawei.android.hwouc com.wssyncmldm echo [INFO] Re-enabling OTA packages ... for %%p in (%CANDIDATES%) do ( call :try_enable %%p ) echo [INFO] Restoring notification badge ... adb shell appops set com.android.settings POST_NOTIFICATION default >nul 2>nul for %%p in (%CANDIDATES%) do ( adb shell appops set %%p POST_NOTIFICATION default >nul 2>nul ) echo [DONE] System update service restored. pause exit /b 0 :try_enable adb shell pm enable %1 >nul 2>nul if not errorlevel 1 ( echo [OK] %1 enabled ) else ( echo [--] %1 not present or not enabled ) exit /b 0恢复脚本的原理很简单:把之前禁用的更新包通过 pm enable 重新启用,再把通知权限恢复为 default。注意,pm enable 只对“之前被 pm disable-user 停用”的应用有效。如果你是通过 adb shell pm uninstall 方式移除的,需要用 pm install-existing 恢复。
5.5 不使用脚本的手工方案
如果你想先观察一下到底哪些包与更新有关,可以先手工执行:
# 列出所有包名,过滤出更新相关关键词 adb shell pm list packages | grep -Ei 'update|ota|upgrade|sysupdater' # 对筛选出的包执行禁用 adb shell pm disable-user --user 0 <包名> # 关闭通知角标权限 adb shell appops set <包名> POST_NOTIFICATION ignore # 恢复 adb shell pm enable <包名>不同设备的包名差异很大。脚本里的候选列表覆盖的是常见品牌,如果你的设备不在列表里,建议先用 grep 命令扫描,再手工禁用。扫描出来的包不一定全部要禁,优先观察名字里包含 update、ota、upgrade 且属于系统预装应用的包。不要禁用 Google Play 服务(com.google.android.gms)和下载管理器(com.android.providers.downloads),否则会影响很多依赖功能。
6. 运行结果与效果验证
6.1 预期输出
脚本运行过程中,你会看到类似下面的输出:
[INFO] Device : Xiaomi MIBOX4 [STEP 1/2] Disabling known OTA packages ... [OK] com.android.updater disabled [--] com.android.ota not present or failed [--] com.oplus.sau not present or failed只要出现至少一个[OK],就说明成功禁用了当前设备上的更新包。如果全是[--],说明该设备的更新应用不在候选列表里,需要走手工扫描方案。
禁用完成后重启设备。重启后进入“设置”,正常情况下“系统更新”入口可能会显示“已停用”或直接无法进入,原来的小红点消失,OTA 弹窗不再出现。
6.2 命令行验证
重启后,可以通过命令确认包被正确禁用:
# Windows 使用 findstr,Linux/macOS 使用 grep adb shell pm list packages -d | findstr /i "update" adb shell pm list packages -d | grep -i update如果输出中包含刚才禁用的包名,说明禁用状态生效。
6.3 验证清单
| 验证项 | 预期结果 | 操作方式 |
|---|---|---|
| 设置图标红点 | 消失 | 回到桌面看图标 |
| OTA 弹窗 | 不再出现 | 重启设备观察一两天 |
| 系统更新入口 | 显示已停用或无法连接 | 打开设置-系统更新 |
| 禁用状态 | 包名出现在停用列表 | adb shell pm list packages -d |
| 恢复正常 | 恢复脚本执行成功 | 运行 restore_ota.bat 后重启 |
如果红点仍然存在,优先检查两件事:一是设备上是否还有另一个跟更新相关的应用在发通知,二是桌面启动器的角标设置是否独立于通知权限。部分 ROM 的桌面角标是启动器自己维护的,即使没有通知也会显示,这时候只能手动关闭桌面角标。
7. 常见问题与排查思路
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| adb devices 找不到设备 | 未打开 USB 调试或驱动异常 | 重新拔插数据线,检查设备授权弹窗 | 更换数据线/接口,重装驱动 |
| 设备显示 offline | 驱动不兼容或 adb 版本过旧 | adb kill-server 后重试 | 升级 platform-tools,重启 adb |
| 设备显示 unauthorized | 没有在设备上点“允许调试” | 查看手机屏幕确认授权弹窗 | 重新插拔并勾选允许 |
| 脚本全部输出 [--] | 当前设备的更新包不在候选列表 | 执行 pm list packages grep 扫描 | 手工禁用识别出的包 |
| 禁用了更新包后设置闪退 | 误禁了与设置关联的组件 | 查看脚本中禁用的包名 | 运行恢复脚本,重启设备 |
| 重启后红点又出现 | 桌面角标独立于通知,或另一个应用在发通知 | 长按设置图标排查通知来源 | 手动关闭桌面角标 |
| 系统更新弹窗仍出现 | 更新逻辑内置在设置/系统组件中 | 抓取日志确认来源 | 考虑 root 后彻底移除更新 APK |
| 恢复脚本没有恢复成功 | 原来是通过 pm uninstall 删除的 | 检查 pm list packages 是否还包含该包 | 使用 pm install-existing 恢复 |
这里特别强调一个容易踩的坑:不要为了“更彻底”顺手禁用 com.google.android.gms。这个包是 Google Play 服务,很多应用依赖它,禁掉之后会导致大量应用报错、后台同步异常。另外,系统下载管理器 com.android.providers.downloads 也不要禁,它会影响到包括 OTA 包下载在内的大部分下载功能。
8. 最佳实践与工程建议
8.1 安全优先的几条原则
- 优先 disable-user,不要轻易 uninstall。前者的恢复粒度更细,风险更小。
- 禁用前先导出当前包列表。执行
adb shell pm list packages > packages_before.txt,一旦出现问题可以对照排查。 - 一次只禁一个包,重启验证,再禁下一个。如果一次禁太多,出现问题时很难定位。
- 不要碰不理解的系统组件。脚本里的候选列表已经很克制,手工操作时请保持同样的克制。
- 恢复脚本和禁用脚本放在同一个文件夹里,标注设备型号和日期,方便以后再次使用。
8.2 root 后的更彻底方案
如果你愿意承担 root 带来的风险和保修影响,可以考虑把更新应用从系统分区直接移走。这个操作的原理是让系统启动时根本找不到更新组件,比 pm disable-user 更彻底。
adb root adb shell mount -o rw,remount /system adb shell mv /system/priv-app/Updater/Updater.apk /system/priv-app/Updater/Updater.apk.bak需要注意:不同设备/系统版本的挂载路径不同,很多新设备是 /system_root,有些还需要先解锁 bootloader。这个操作比 ADB 禁用危险得多,一旦误删关键组件可能导致开机卡 LOGO。不建议新手直接尝试。如果你没有把握,用 disable-user 已经完全够用。
8.3 路由器/DNS 层屏蔽 OTA 域名
禁用更新应用后,设备不会主动请求更新服务器,但如果你希望更彻底,可以在路由器层面把更新域名屏蔽掉。具体方法是抓包看设备启动后访问了哪些域名,然后在路由器的域名过滤/自定义 hosts 里屏蔽这些域名。
这个方案适合电视盒子这种固定网络环境。需要注意,不要盲目屏蔽整个厂商域名,否则可能连应用商店、语音搜索等正常功能也一起失效。更稳妥的方法是先禁用更新应用,再观察设备是否还会访问更新服务器,确认域名后再做路由器层屏蔽。
8.4 脚本的长期维护
厂商的系统更新包名不是固定不变的。一次升级、一次恢复出厂设置,都可能让更新包重新出现,或者让包名发生变化。建议每隔一段时间重新执行一次禁用脚本,并用pm list packages -d确认状态。
另外,如果你在处理多台设备,建议每台设备都保留一份独立的脚本记录。因为不同批次的电视盒子,系统版本和包名可能完全不同。记录下当前设备成功禁用了哪些包,等于给自己留了一份“已知可用配置”。
9. 总结
这篇文章从“设置小红点”和“OTA 更新弹窗”的骚扰场景出发,讲清楚了它们产生的机制:系统更新应用发送通知,桌面启动器展示角标,更新服务定期检查并弹窗。然后给出了一个不需要 root、不需要刷机的解法:通过 ADB 执行 pm disable-user 禁用更新应用,再用 appops 关闭通知角标权限,最终用一键脚本封装整个过程。
脚本不是万能的,因为不同品牌的更新包名差异很大。如果你的设备不在脚本候选列表里,文章中已经给出手工扫描和禁用方案。整件事最核心的原则是:可恢复、可排查、不误伤。每次操作前想清楚“如果出问题,我能不能恢复”,是比“能不能成功”更重要的问题。
建议你先在自己手头最不重要的设备上跑一次脚本,验证红点和弹窗是否消失,熟悉恢复流程后,再决定要不要在主力设备上使用。把 disable_ota.bat 和 restore_ota.bat 放在同一个目录保存好,下次遇到一台被 OTA 弹窗骚扰的设备,你五分钟就能搞定。