ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

MIUI 免 root 精简预装软件:ADB 卸载与恢复实战

MIUI 免 root 精简预装软件:ADB 卸载与恢复实战 我手上这台 Redmi 用了两年多从开机第一天起桌面上就躺着二十来个这辈子不会点开的图标小米画报、小米视频、游戏中心、小米商城、用户反馈……占着存储不说后台还时不时蹦个推送出来。真正让我下决心动手的是某次清理存储发现这些预装软件加起来占了将近 6 个 G而我根本找不到一个体面的方式把它们请出去。常规做法无非两种要么刷第三方包要么 root 之后用系统级工具强删但前者折腾、后者直接让保修和支付类应用的安全性打折扣。后来我把目光放到了 MIUI 系统精简工具这条路上——核心就是免 root靠系统自带的调试接口把内置软件从当前用户空间里摘掉。这套方式不需要解锁 BL不需要动 system 分区出问题还能原样装回来。这篇就把我这段时间踩过的坑、验证过的命令、以及哪些东西绝对不能碰一次性摊开讲清楚给同样被预装软件困扰、但又不想把手机搞成砖的朋友做个参考。1. 免 root 精简到底动了什么手脚1.1 先把系统应用这层窗户纸捅破很多人一听删除系统应用就本能地紧张觉得一定要 root 才行。其实在 Android 的权限模型里系统应用和用户应用的差别本质上是安装位置和签名权限的差别而不是能不能删的差别。系统应用装在/system、/product、/system_ext这些只读分区里普通用户身份确实动不了它们但 Android 从 4.2 开始就引入了一套多用户机制每个应用对每个用户都是独立安装的。pm uninstall --user 0这条命令干的事情就是把某个应用从用户 0也就是默认的机主账号这个空间里卸载掉让它不再出现在你的桌面上、不再参与开机自启但系统分区里的原始文件一动没动。这就解释了为什么它不需要 root——你只是在动属于你自己的那份用户数据映射没有去改只读分区。打个比方这有点像公司给你配的电脑预装了一堆软件。你没有管理员权限去卸载它们但你可以把自己的用户配置文件删掉重新登录之后那些软件对你这个账号就不显示了。文件还在硬盘上只是你的账户看不见、也调用不了。--user 0干的就是这件事。1.2 为什么它比禁用更干净又比强删更安全MIUI 自己也提供过停用功能在应用信息页里能点停用。但停用有两个问题一是部分预装应用被系统标记为不可停用按钮是灰的二是停用只是把应用状态切成 disabled进程虽然不跑了包体和部分关联服务仍在某些情况下开机还是会拉起残留的广播接收器。相比之下--user 0卸载的效果更接近真删。卸载之后这个包在pm list packages里不再出现桌面上找不到入口随包声明的开机自启、定时任务、桌面小部件统统失效。但它又不像 root 强删那样直接把/system里的 apk 抹掉——原始文件完好地躺在系统分区里所以你随时可以用一条install-existing命令把它恢复回来不用重新刷机。这是我最终选这条路的核心原因可逆。手机这种东西谁都保不齐哪天某个功能突然要用留一条后路比省那点存储重要得多。1.3 那这台工具链的边界在哪说清楚它能干什么也得说清楚它不能干什么。第一它删不掉真正跟系统核心绑定的组件比如 SystemUI、Settings、电话、通讯录提供者这些即使你执行了卸载命令系统下一次开机或者关键服务重启时会因为签名依赖被重新拉起甚至直接导致开机卡 Logo。第二它管不了签名级别的权限你没法通过它给应用加权限也没法改系统行为。第三依赖系统签名的功能卸载相关组件后会连带失效。举个例子最近很多人讨论的 MIUI 国际版里小米钱包和 NFC 的关系——国际版 ROM 的交通卡、门卡模拟逻辑和国内版不一样如果你把com.miui.tsmclient这类近场支付组件一并精简掉NFC 刷卡、门禁模拟这一整块就直接哑火而且不是恢复一个包就能立刻回来的往往还要重新登录账号、重新激活卡片。所以涉及支付、NFC、云服务的包动手前务必想三遍。2. 动手前的准备工作与风险清单2.1 电脑端只要一个平台工具包整个流程对电脑的要求低到离谱一台能装驱动的 Windows、macOS 或 Linux 都行。你需要的是ADB 和 Fastboot 平台工具包Platform Tools它是 Android 官方提供的调试命令行集合包含adb.exe等可执行文件。下载之后我建议解压到一个纯英文、无空格的路径下比如D:\platform-tools。别小看这一条我见过太多人把工具包扔在我的文档\新建文件夹 (2)里然后adb一通报错找不到设备折腾半天才发现是路径里的中文和括号在作怪。解压完之后在文件夹里按住 Shift 右键选择在此处打开命令行或者直接在当前目录地址栏敲cmd回车就能在该目录下打开终端省去配置环境变量的步骤。验证是否可用很简单敲adb version能打印出版本号就说明工具本身没问题真正容易出问题的是下一步——手机端的授权。2.2 手机端那几步看着简单坑最多MIUI 打开 USB 调试的路径是设置 → 我的设备 → 全部参数 → 连点 MIUI 版本号七次激活开发者选项然后回到设置 → 更多设置 → 开发者选项打开USB 调试。这一步现在有个前置条件需要留意较新版本的 MIUI 要求登录小米账号并联网一段时间后才允许开启开发者选项纯离线的新机可能点不开这不是你操作错了是系统策略。插上数据线之后手机屏幕会弹一个允许 USB 调试吗的对话框一定要勾选一律允许使用这台计算机进行调试否则每次重连都要重新点。如果你在公司电脑或者网吧操作注意别在有他人使用的机器上勾这个选项调试授权等同于把设备的调试通道交给那台电脑。这里有个 MIUI 特有的坑MIUI 对调试授权做了额外限制有时候即使点了允许adb devices里显示的还是unauthorized。解决办法一般有两个——一是撤销授权重来在开发者选项里点撤销 USB 调试授权然后重新插拔数据线再点一次允许二是检查是不是被USB 调试安全设置之类的选项干扰了这个选项是用来模拟点击的跟卸载无关不用开。实测下来用原装或者质量好一点的数据线成功率明显比随手抓的那根充电线高尤其是那些只能充电不能传数据的线插上去设备根本认不出来。2.3 我列了一张别碰的黑名单这部分是全文最该被截图保存的地方。精简的收益是省空间和清爽代价可能是手机变成一块会发光的砖。下面这些包除非你非常清楚自己在做什么否则一个都别动类别典型包名动了的后果系统界面com.android.systemui状态栏、通知栏、锁屏全部消失系统设置com.android.settings无法进入任何设置页面安全中心com.miui.securitycenter权限管理、清理、拦截全部失效桌面com.miui.home桌面启动器崩溃卡在黑屏电话/短信提供者com.android.providers.telephony通信功能异常应用安装器com.android.packageinstaller无法安装任何 apk下载管理器com.android.providers.downloads系统下载任务全部失败云服务/查找设备com.miui.cloudservice丢失查找、云同步失效近场支付组件com.miui.tsmclientNFC 刷卡、门卡模拟失效我建议你在动手前先把这个表格和自己的包列表对一遍。另外一条经验分批操作一次只卸三到五个然后正常用半天。别一口气卸三十个然后发现某个功能坏了却不知道是哪个包惹的祸。删除前把要卸的包名记在备忘录里这是你唯一的后悔药处方。3. 从零开始的一次完整精简实操3.1 连接与设备确认手机插上电脑开发者选项里 USB 调试开着然后在电脑终端里执行adb devices正常应该输出类似这样的内容List of devices attached a1b2c3d4 device关键是后面那个状态必须是device。如果是unauthorized说明手机上的授权对话框没处理或者需要重新插拔如果是offline通常是驱动问题或者数据线只供电不传数据如果列表是空的那就是线或者 USB 口的问题换根线、换个口别在这上面硬耗。设备确认之后先看一眼当前这台机器上一共有多少包心里有个数adb shell pm list packages | wc -lWindows 下没有wc用adb shell pm list packages | find /c package也能数出来。我那台机器一上来是四百多个包属于 MIUI 的正常水平。3.2 把包名和图标对应起来这一步是新手最容易卡住的地方——pm list packages吐出来的是一堆com.xxx.yyy谁知道哪个是谁。我常用的几个方法从快到慢排一下。第一种按关键词过滤。小米系的应用包名很有规律找视频就是adb shell pm list packages | grep videoMac 和 Linux 直接用grepWindows 的 cmd 里换成findstradb shell pm list packages | findstr video第二种在网上搜应用名 包名这个最省事但要注意核对搜索结果里经常有同名的山寨包名。第三种也是我现在最常用的——在手机上装一个能显示包名的应用信息查看工具直接看图标对应的包名一目了然尤其适合那种包名和应用名八竿子打不着的应用。这里插一句关于免 root 虚拟 hook 相机类需求的事。这类玩法属于另一条技术路径它依赖的是应用层的运行时环境跟本文讲的卸载精简目标是两回事。卸载精简关注的是少装、少跑而相机增强类是改行为前者用命令行就能搞定后者往往需要更复杂的运行时支持。别把这两件事混在一起规划容易把自己绕进去。3.3 执行卸载与结果验证确认好包名就可以下手了。假设我要卸掉小米视频命令是adb shell pm uninstall --user 0 com.miui.video成功的话终端会回一个Success。注意这个 Success 只代表卸载指令执行成功不代表这个包一定被清干净了因为有些包被其他组件依赖系统会立刻把它重新拉起。卸完之后回到手机上应用列表里应该已经看不到它了。再回到终端验证一下adb shell pm list packages | grep com.miui.video如果什么都不输出说明当前用户空间里确实已经没有这个包了。想更彻底地确认可以看看它到底装在哪个分区adb shell pm path com.miui.video卸载成功之后这个命令通常也查不到路径了。如果你的目的是保留数据、只让它不再出现加一个参数就行adb shell pm uninstall -k --user 0 com.miui.video-k是 keep data 的意思数据目录留着恢复回来时登录状态、设置都还在。3.4 批量处理时怎么写脚本一个个敲命令太慢我后来把要卸的包名整理成一个文本文件一行一个然后用脚本批量跑。Linux/macOS 下可以这样while read pkg; do adb shell pm uninstall --user 0 $pkg done remove_list.txtWindows 下用 PowerShellGet-Content remove_list.txt | ForEach-Object { adb shell pm uninstall --user 0 $_ }但我要提醒一句批量脚本是把双刃剑。一旦列表里混进一个不该卸的包你会眼睁睁看着它一路 Success 下去中间没有停顿确认的余地。我的做法是第一次执行时先在脚本里加个echo打印当前正在处理哪个包确认整份列表没问题之后再撤掉打印全速跑。另外脚本执行过程中如果手机弹出任何授权或者系统提示一定要停下来处理别让脚本盲跑。如果哪天想恢复某个应用命令是adb shell cmd package install-existing com.miui.video这条命令会把系统分区里原本的那份重新挂回用户空间绝大多数情况下立刻就能用。少数应用恢复后需要重新登录或者重新下载资源属于正常现象。4. 不想敲命令图形化方案的选择逻辑4.1 Shizuku 这条路是给谁准备的命令行对熟悉技术的朋友不是问题但我身边更多人希望有个带界面的工具点几下就完事。这就要提到Shizuku这类方案。它的思路很巧妙Shizuku 本身是一个通过 ADB 或无线调试启动的后台服务启动之后它把 ADB 级别的权限转接给支持它的应用让这些应用在被授权后能以接近 ADB 的能力执行操作。换句话说你还是免 root还是走调试接口只是把敲命令这一步交给了图形界面。启动方式主要有两种。一种是用电脑配合通过adb shell sh /sdcard/Android/data/moe.shizuku.privileged.api/start.sh这样的方式拉起服务另一种是从 Android 11 开始利用系统自带的无线调试功能在手机上自己配对启动彻底摆脱电脑。后者对普通用户友好太多我个人更推荐但要注意无线调试的配对码每次重新配对都会变别用旧的。4.2 挑工具的几条判断标准支持 Shizuku 的卸载类工具不少选的时候我一般看三点。第一是否开源。系统精简工具拿到的是相当高的权限能列出你手机上所有应用、能执行卸载来源不明的闭源工具体验再好我也不会用。开源意味着代码可被审查社区也会盯着它有没有夹带别的东西。第二是否有明确的恢复入口。一个合格的精简工具必须能让你看到自己卸了哪些包并且一键恢复。只会卸不会装的应用删完就让你自己去想这种设计思路本身就不负责任。第三是否强制联网。纯粹依靠本地 ADB 权限干活的工具理论上不需要联网就能完成卸载。如果一个精简工具要求你必须登录、必须联网才能用那就得打个问号了。电脑端也有图形化方案思路是把 ADB 命令包装成勾选界面你勾选要卸的应用它帮你生成并执行命令。这类工具适合懒得写脚本、又想在电脑上批量处理的人。但无论用哪种工具底层的--user 0机制是一样的所以本文提到的所有风险和不可删除清单同样适用。5. 常见问题与排查实录5.1 卸载后系统出现异常怎么办这是最让人心跳加速的场景。表现一般是桌面反复崩溃、通知栏消失、某个功能点进去直接闪退。第一反应不要慌也不要急着重启先把之前记下来的包名找出来。恢复的顺序我总结成三步。第一步用install-existing把最近卸载的包先装回来尤其优先恢复安全中心、系统界面这类核心组件adb shell cmd package install-existing com.miui.securitycenter第二步如果恢复之后还是不正常重启一次手机。很多异常只是因为某个正在运行的进程还在引用已经卸载的包重启之后引用关系重建问题就消失了。第三步如果重启之后依然进不去桌面或者卡开机那就进 Recovery 双清或者线刷完整包。听起来吓人但因为我们的操作从来没动过系统分区线刷一个原版包就能彻底复原数据也不一定全丢——前提是你之前开了云同步或者本地备份。我自己的真实经历是有次把com.miui.systemAdSolution卸了结果某些系统页面的广告位是没了但同时连带影响了另一个页面的布局显示。恢复之后一切正常这个包现在被我列在可以卸但要接受副作用那一档里。5.2 系统更新之后应用复活了这是非常普遍的现象也是最容易被误解成工具失效的情况。MIUI 的 OTA 更新本质上是一次系统分区覆盖你之前从用户空间卸掉的包在更新过程中会被系统重新挂载回来所以更新完一看那二十个图标又齐刷刷回来了。这不是工具的问题是你需要知道的一个流程特点。应对办法很简单——更新完系统之后重新跑一遍你的卸载列表就行。所以我一直强调要把包名列成文件保存好那不是一次性的工作清单而是一份可以长期复用的配置。我现在手机上就留着这么一份文本每次大版本更新之后花五分钟重跑一遍比重新回忆当时卸了哪些高效太多。另外提醒一点大版本更新之后不要立刻跑批量脚本。新版本里有些包名可能发生变化有些应用的角色也可能被重新定义。稳妥的做法是更新后先正常用两三天观察系统行为再按老列表逐条核对包名是否仍然存在然后才动手。5.3 常见问题速查表现象可能原因处理方式adb devices列表为空数据线只供电 / 驱动缺失换原装线、换 USB 口、装官方驱动状态显示 unauthorized手机端授权未确认撤销调试授权后重新插拔确认命令报not found包名拼写错误或已卸载先用 list packages 确认包名卸载后应用自己回来了被核心组件依赖并重新拉起换用disable-user或接受现状系统更新后应用全部恢复OTA 覆盖系统分区更新后重跑既有的卸载列表桌面崩溃无法操作误删了桌面或系统界面通过 ADB 执行 install-existing 恢复恢复后功能仍异常关联账号或配置丢失重新登录账号、重新激活相关服务部分应用按钮点不动系统级保护无法停用改用 ADB 卸载方式处理5.4 几个只有踩过才知道的细节讲几个文档里不会写、但实际会遇到的细节。第一个卸载和应用商店的关系。如果你把应用商店本身卸了那么后续所有通过商店更新的应用都会停在旧版本只能手动去官网下 apk 安装。这不是坏事反而让更新更可控但你要接受应用不会自动更新这个结果。我自己是留着商店但关掉自动更新两头的好处都占上。第二个关于国际版 ROM 的特殊性。前面提到过 NFC 和钱包的联动这里再强调一次国际版和国内版的应用构成差异不小你在国内版上验证过的可删列表直接搬到国际版上可能翻车。跨版本 ROM 之间不要照抄卸载清单一定要在自己当前系统上重新列一遍包名。第三个别迷信一键精简脚本。网上流传的那种MIUI 一键去广告脚本往往是针对某个具体版本写的你的系统版本和机型稍有不同它可能就在删一些不该删的东西。我见过有人跑完脚本之后指纹识别直接没了因为脚本把一个和生物识别相关的组件也扫进去了。想省事可以理解但至少要把脚本打开读一遍看它到底在卸哪些包。6. 我的实际体会与操作建议折腾到现在我手机上长期保持在四百出头个包的水平比出厂少了三十来个存储空间多出来几个 G后台自启的条目肉眼可见地变少待机耗电也有改善。但说实话最大的收益不是省了那几个 G而是桌面终于清爽了——这东西对每天要解锁几十次手机的人来说情绪的正面影响比省电更明显。如果你打算动手我最后再给几条个人建议。先从最没有悬念的那几个开始比如小米画报、游戏中心、用户反馈这类卸完观察一周确认没有任何异常再继续下一个批次。每一批都要在备忘录里记下包名这不是形式主义是真的救过我好几次。涉及支付、NFC、云服务、账号相关的包默认不动除非你有明确的理由并且愿意承担恢复成本。最后如果某天你发现自己要恢复的应用超过了三个那大概率说明你精简得有点激进了适当回退一点手机这东西稳定比极致清爽重要得多。
返回列表