拓冰建站拓冰建站
首页 / 资讯中心 / 正文

安卓系统软件彻底删除:ADB、Shizuku 与 pm 卸载原理

手机里那些预装的系统软件我盯了它们很多年。你说它是系统组件吧它天天给你推广告你说它是必需服务吧卸了以后手机反而更省电、更安静、运存占用更低。于是彻底删除手机系统软件这件事成了很多安卓用户绕不过去的一道坎。它解决的核心问题其实很具体把厂商和渠道塞进来的、你从没用过也不打算用的预装应用从系统里清理掉换回干净的桌面、更少的通知栏推送、更长的待机时间。这篇内容适合三类人第一次听说 ADB 这个工具、想动手又怕变砖的新手已经会敲命令、但对哪些包能删哪些包碰不得心里没底的老玩家以及想把手里的旧机器整理干净再送人或转卖的用户。我会把删除这个动作拆到包管理器的层面讲清楚五种操作方式的区别、为什么无 root 的卸载清不掉空间、主流品牌各自的坑在哪里最后把我自己和身边人踩过的故障处理方案摊开来讲。全程以安卓为主iOS 单独说一节。1. 先搞清楚删除到底删掉了什么1.1 一个应用在系统里其实有三份存在很多人以为卸载就是把文件删掉但在安卓里一个预装应用同时在三个地方留下痕迹。第一份是 APK 实体文件躺在只读分区里常见路径是/system/app、/system/priv-app、/product/app、/system_ext/appAndroid 10 之后又多出了动态分区同一批软件可能被拆散在好几个分区。第二份是数据目录/data/data/包名和/data/user/0/包名这里面是配置、缓存、登录态属于可写的用户分区。第三份最容易忽略是包管理服务里的注册记录也就是PackageManagerService扫描分区后写进packages.xml的那份清单它决定了系统认为这个应用存在还是不存在。你执行的每一条删除命令实际都是在动这三份痕迹中的某几份或者干脆只是改了一条标记位。这就解释了一个很反直觉的现象为什么千辛万苦卸载了二十个应用存储空间几乎没变——因为被改掉的只是第三份注册记录APK 实体还稳稳地待在只读分区里一分不少。想通这一层后面所有操作的选择逻辑就顺了。1.2 五种操作方式效果完全不同新手最容易犯的错是把卸载停用清除数据冻结当成一回事随便挑一个用。实际上它们的可逆性、影响范围、风险等级差得很远。下面这张表是我自己整理过的对照建议动手前先看一遍。操作方式典型命令空间释放可逆性适合什么场景卸载当前用户pm uninstall --user 0 包名仅释放数据与缓存高一条命令可恢复已经确定不需要想彻底断掉后台与推送停用pm disable-user --user 0 包名仅释放部分缓存高随时可启用拿不准是否安全先观察几天挂起pm suspend 包名基本不释放最高临时静默重启后可能自动恢复清除数据pm clear 包名释放数据目录不可逆但应用还在应用出问题想重置状态root 后删 APKrm -rf 应用目录释放只读分区空间低需重刷固件追求极限精简、不在乎后续 OTA注意pm uninstall --user 0虽然叫 uninstall但它是针对用户 0 卸载并不等于从系统里抹掉。这是后面能一条命令救回来的关键也是它被推荐给新手的原因。1.3 无 root 到底能不能真正腾出空间先把结论放前面无 root 情况下你几乎不可能真正释放只读分区的空间。原因是那些分区在正常启动状态下是以只读方式挂载的还叠着 dm-verity 这类完整性校验任何写入都会被拒绝甚至导致无法开机。你能清掉的只有数据目录和缓存量级通常在几十兆到一两百兆。那为什么还有那么多人折腾因为收益根本不在存储而在行为和功耗。预装应用最让人难受的地方是自启动、常驻后台、定时拉取配置、往通知栏塞内容。把注册记录摘掉之后进程起不来、广播收不到、服务绑不上运存占用和待机耗电会有肉眼可见的改善。我自己的一台旧机器清理掉十来个来自厂商和渠道的应用后夜间八小时待机从掉 11% 降到掉 3%这不是玄学是后台唤醒次数从几百次降到了个位数。如果你确实想把只读分区也瘦下来那就必须走 root 路线或者用现代的无系统修改方案这两条路的风险等级完全不同我在第 3 节会专门讲。2. 动手前的准备环境、工具与红线清单2.1 打开开发者选项顺便处理厂商的额外门槛第一步全平台通用进入设置 - 关于手机连续点击版本号七次直到提示已进入开发者模式。然后回到设置 - 系统里找到开发者选项打开USB 调试。听起来简单但国内厂商基本都会加戏。小米和红米在 HyperOS、MIUI 上还有一个USB 调试安全设置开关不开它的话安装、卸载这类需要写权限的命令会被拒绝执行而打开它通常要求登录账号并且插入 SIM 卡这一步劝退过不少人。OPPO、vivo 的部分机型会有USB 调试安全设置或者需要输入验证码。华为和荣耀在开发者选项里对 ADB 的管控相对更紧部分命令会返回权限不足。所以连上没反应先别怀疑线有问题回头看看是不是漏了厂商的第二个开关。连接时手机上会弹一个是否允许 USB 调试的对话框一定要勾选一律允许使用这台计算机进行调试否则拔插一次就要点一次。Windows 上如果adb devices显示设备是unauthorized八成是驱动没装好装一遍厂商的官方手机助手或者通用的 ADB 驱动即可。另外还有一条完全不用电脑的路子Android 11 之后自带无线调试在开发者选项里找到无线调试选择使用配对码配对设备手机上会给出一个 IP、端口和六位配对码在电脑上执行adb pair IP:端口并输入配对码再adb connect IP:端口就能连上同一局域网内非常省事。2.2 三种 ADB 工具的获取方式按需选择第一种是官方命令行工具也就是 platform-tools 压缩包解压后直接在目录里开终端用。它的优点是干净、版本新、支持所有命令缺点是要敲命令、要在电脑上操作。第二种是 Shizuku 这类把 ADB 权限本地化的工具它通过无线调试拿到权限后常驻在手机里之后手机上的第三方精简工具就能直接调用系统接口不需要电脑特别适合没有电脑或者懒得插线的场景。第三种是手机上直接跑的本地 ADB 终端类应用原理是利用无线调试给自己授权然后你就在手机屏幕上的黑框里敲pm命令。我第一次用这种方式在高铁上删掉了一堆推送服务体验相当爽。需要说明的是Shizuku 和这类本地终端工具都不需要 root重启后 Shizuku 的授权会失效需要重新激活一次这是它们的固有代价。提示无论用哪种工具第一件事都是执行adb devices或者在其界面里确认设备已连接且状态正常。设备列表为空、显示 offline、显示 unauthorized这三种状态的排查方向完全不同别混着试。2.3 动手之前先把原始状态抄下来这一步被绝大多数教程省略但它是你后面能睡好觉的唯一保障。思路很简单在没做任何修改前把系统当前的包清单导出成文件删的过程中同步维护一份已删除清单。# 导出全部系统应用包名-s 表示 system adb shell pm list packages -s packages_before.txt # 导出当前用户下处于启用状态的应用 adb shell pm list packages --user 0 -e enabled_before.txt # 导出包含 APK 路径的信息排查时非常有用 adb shell pm list packages -s -f packages_with_path.txt已删除清单建议用表格维护字段就四个包名、它原本负责什么、为什么删、恢复命令。重点是这份清单不要只存在手机备忘录里因为最容易出问题的场景恰恰是手机已经进不去系统了这时候你需要用另一台设备查到恢复命令。我吃过这个亏后来改成直接写在电脑上的一个文本文件里改完保存几年下来成了我自己的机型笔记库。2.4 红线清单这些包碰了大概率出事下面这些都是我在不同机型上一遍遍验证过的绝对不能删类别判断逻辑只有一个它是否处在开机流程、桌面渲染、应用安装、权限授予、基础通信这五条链路上。任何一环断掉轻则功能缺失重则开不了机。桌面与系统界面com.android.launcher3、各厂商定制桌面如com.miui.home、com.android.systemui。删掉桌面会开机黑屏只剩状态栏删掉 SystemUI 连状态栏和通知都没有。设置与权限com.android.settings、com.android.permissioncontroller、com.android.providers.settings。最后一个被删掉很多应用会因为读不到配置而直接崩溃。包安装与校验com.android.packageinstaller或厂商版本、com.google.android.packageinstaller。删了之后你无法安装任何 APK包括用来救命的恢复工具。通信三件套com.android.phone、com.android.providers.telephony、com.android.providers.contacts以及拨号与短信应用本体。删了可能收不到短信、无法接打电话甚至会卡在开机验证界面。账号与认证各家账号服务如com.google.android.gms、厂商账号服务。这类删掉不一定立刻开不了机但会导致大量依赖登录的应用报错而且恢复起来麻烦。输入与渲染系统输入法至少留一个、com.google.android.webview或com.android.webview。WebView 是无数应用的网页容器删了以后微信、银行类应用、内置浏览器都会白屏。基础硬件服务com.android.bluetooth、com.android.nfc、定位相关服务、相机与媒体存储。删掉是功能性缺失不会变砖但恢复前对应功能就是废的。3. 核心操作定位包名与三种删除姿势3.1 精准定位包名别靠猜所有命令都必须用包名而不是应用中文名所以第一步永远是找到准确包名。最土但最稳的办法是打开那个应用的应用信息页面很多厂商机型会显示包名小米的部分版本还支持长按复制。如果看不到就用下面几种方式。第一种是按关键字模糊搜索这是我最常用的adb shell pm list packages | grep -i weather adb shell pm list packages | grep -i browser adb shell pm list packages -s | grep -i msa如果不确定关键字可以先看当前前台应用是谁边操作边定位adb shell dumpsys window | grep mCurrentFocus adb shell dumpsys activity activities | grep -i mResumedActivity第二种是反查当你手里只有一个 APK 或者只看到图标时可以列出带路径的全量清单再找adb shell pm list packages -s -f | grep -i 关键词 adb shell pm path com.example.app第三种是借助手机端的图形化应用管理工具把包名、版本、安装路径、是否系统应用都列成表格省去记忆成本。三种方式配合用效率最高图形界面负责快速浏览命令行负责精确确认。3.2 一次完整、可回滚的卸载流程我把自己的标准流程写出来你可以照着抄。假设目标是某厂商的广告服务包com.example.ads。# 1. 确认连接状态 adb devices # 2. 确认这个包确实存在且是系统应用 adb shell pm list packages -s | grep example.ads # 3. 看它的 APK 落在哪个分区顺便确认版本 adb shell pm path com.example.ads adb shell dumpsys package com.example.ads | grep -i versionName # 4. 执行针对当前用户的卸载 adb shell pm uninstall --user 0 com.example.ads # 5. 验证加上 -u 参数可以看到已卸载但记录仍在的包 adb shell pm list packages -u | grep example.ads # 6. 万一出问题一条命令拉回来 adb shell cmd package install-existing com.example.ads这里有两个细节值得展开。第一为什么要用--user 0因为安卓是多用户模型0 号用户就是机主本人应用分身、儿童空间这些走的是另外的用户 ID所以对 0 号用户操作的天然好处是只影响你自己不会破坏系统分区的完整性也基本不会触发完整性校验。第二第 5 步的验证很重要很多人执行完看到命令返回Success就以为万事大吉其实如果输错了包名或者包名属于另一个用户命令同样可能返回成功但实际没生效。提示cmd package install-existing在较新的系统上可以直接用老一些的版本要写成pm install-existing。如果恢复时报 Package not found说明这个包在当前固件版本里根本不存在或者你用别的方式把它从分区里删掉了那就只能靠双清或刷机解决。3.3 拿不准就先停用这是一条保险绳如果你对某个包的功能只有七成把握不要直接卸改用停用。停用的好处是应用仍然在系统里只是不能运行、不接收广播重启依然保持停用状态但一条命令就能满血复活。adb shell pm disable-user --user 0 com.example.unknown adb shell pm enable com.example.unknown adb shell pm list packages -d # 查看当前所有被停用的包我给自己定的规矩是凡是和系统二字沾边、但功能描述模糊的包一律先停用正常用三天。三天内没有出现异常再改成卸载出现了任何异常先启用回来再判断是不是它的问题。这个三天观察法帮我避开了很多次险情比如某个看起来只是用户数据统计的包实际承担着推送通道停用后微信消息延迟明显这种关联光看名字是看不出来的。停用最大的坑是连锁反应。系统组件之间存在大量隐式依赖停掉 A 之后 B 虽然还在运行但会因为找不到 A 提供的接口而不断重试、报错、拉起自己反而更耗电。所以停用之后要看一眼电池和日志不能只看表面上没有那个图标了。3.4 root 之后的真删除以及更现代的替代方案如果你确实要动只读分区传统流程是这样的先adb root拿到 root 权限注意这要求系统是 userdebug 或 eng 版本绝大多数零售机不支持再执行adb disable-verity关闭完整性校验并重启然后adb remount把分区重新挂载为可写接着就能在/system/app、/system/priv-app、/system_ext/app、/product/app这些目录里删掉对应的应用文件夹。删的时候要注意一个应用的目录里通常不只有base.apk还可能有split_config.arm64_v8a.apk这类分包以及oat目录下的预编译产物。要么整个目录一起删要么一个别动删一半是最容易出问题的做法。删完记得清一下/data/dalvik-cache里的缓存不然可能启动时反复优化。这条路的风险必须讲清楚。第一破坏完整性校验会让部分机型彻底无法启动只能重新刷官方固件。第二系统更新会失败因为更新包要对现有分区做差分校验你改过就过不了。第三部分对安全性敏感的应用会检测系统完整性可能出现无法登录或功能受限。第四误删目录名相近的系统目录后果比卸载一个包严重得多。所以现在更被推荐的做法是无系统修改通过 Magisk 或 KernelSU 这类方案用模块和 bind mount 的方式在启动阶段把不需要的应用目录遮盖掉或者用 overlayfs 的方式替换。表面上系统分区一个字节都没变完整性校验能过OTA 也能正常跑想还原时删掉模块即可。代价是学习成本更高需要理解启动流程和目录挂载顺序。我的建议是如果你只是想去广告、减后台--user 0的卸载已经能解决九成问题只有当你明确要释放那几百兆空间或者要干掉某个顽固到无法卸载的组件时才考虑往这一层走。4. 主流品牌的实际差异与适配4.1 小米与红米广告包多但门槛也明确HyperOS 和 MIUI 是这类操作最活跃的阵营。常见可清理的目标包括广告服务、应用商店推广、内容中心、部分统计与反馈组件。这些包通常名字里带 ads、msa、analytics、mipicks 之类的关键词可以用关键字搜索批量定位。但有两个地方必须小心。一是安全中心它不只管清理和权限还挂着一批系统能力删掉之后可能出现权限弹窗不显示、应用管理打不开的情况。二是云服务和账号服务很多人以为只是同步实际它和查找设备、备份、部分登录流程绑定删了之后可能连账号都登不回去。至于系统更新组件删掉确实能避免被推更新但代价是你也失去了正常升级的通道我一般建议保留。另外提醒一句小米机型上那个USB 调试安全设置开关往往是最容易被忽略的一环。命令执行返回SecurityException或者直接提示失败先去看这个开关别在包名上浪费时间。4.2 三星 One UIBixby 家族要整体看三星的预装和它的生态绑得比较深。Bixby 相关的包往往有好几个分别负责语音、唤醒、视觉、日常只删其中一个剩下的会互相唤醒效果大打折扣要删就成组处理。另外还有一批社交类预装在不同渠道版本上出现的组合不一样以实际清单为准。Knox 相关的组件是绝对禁区它不只是安全套件还参与企业配置、部分支付应用的环境校验动它轻则某些应用打不开重则影响开机流程。三星的更新恢复行为也比较积极大版本升级之后删掉的包常常会自己回来升级完记得重新核对一遍清单。4.3 华为与荣耀HMS 生态不能碰这个阵营的特点是自研生态组件承担了大量基础功能。HMS Core 以及配套的推送、账号、支付组件是绝对红线很多第三方应用的登录、推送、地图都依赖它删掉之后症状是一堆应用莫名其妙需要重新登录。可清理的对象主要是厂商自带的浏览器、视频、阅读、主题商店、用户计划这类内容型应用判断标准是删了之后是否影响你的日常使用。华为对 ADB 的权限管控相对严格部分命令需要额外授权操作前先确认能否正常执行pm list packages -s如果这一步就失败后面无从谈起。4.4 OPPO、vivo、一加、realme注意推送服务这几个品牌的系统同源程度较高广告与推送相关的包名字常带 mcs、heytap、coloros、originos 之类的标识。最容易踩的一个坑是把推送服务当成广告服务删掉结果发现某些应用的消息推送延迟到几分钟甚至完全收不到。判断方法很简单名字里带 push、mcs 的先停用观察别急着卸。另一个值得单独提的是主题商店和浏览器。这类应用往往还挂着应用推荐和快捷搜索的入口删了确实清爽但如果你习惯用系统自带浏览器作为默认打开方式删掉后需要另外指定一个否则点击链接会弹选择框。这些都是小事但发生在你刚删完、正得意的时候容易让人误以为出了大问题。4.5 苹果 iOS思路完全不同iOS 上没有 ADB 这套机制也没法随意删除真正意义上的系统组件。不过从 iOS 12 开始苹果开放了一部分内置应用的删除权限长按图标选择移除 App - 删除 App会真正释放空间需要时能从应用商店重新下载。能被删的通常是计算器、指南针、股票、播客这类独立应用。不能被删的核心组件包括电话、信息、设置、相机、照片、App Store、Safari 这几类长按只会看到从主屏幕移除那只是隐藏不释放空间。真正想清理存储空间走设置 - 通用 - iPhone 储存空间用卸载未使用的 App来回收一部分占用同时保留数据。至于越狱后深度精简这条路我不建议普通用户尝试收益和风险完全不成比例而且现在新系统的越狱环境本身就很难得。5. 常见故障与抢救方案5.1 桌面消失、黑屏、开机循环怎么办这三种症状的原因高度集中你删掉了开机流程或桌面渲染链路上的关键包。最典型的是删了桌面应用本体、系统界面组件、权限控制器或者设置应用。表现是开机动画走完之后一直黑屏只有状态栏能下拉或者干脆反复重启。如果还能进系统比如状态栏可用、能下拉通知第一件事不是重启而是想办法执行恢复命令。有电脑就立刻连上adb shell cmd package install-existing --user 0 包名没电脑就用 OTG 接鼠标通过通知栏进入某个还能用的界面或者借助已安装的第三方工具执行命令。记住重启有可能让情况变得更糟因为部分机型在检测到关键组件缺失后会直接进入恢复模式。如果已经进不去系统剩下两条路。第一条是恢复模式双清代价是用户数据全丢而且如果你的问题出在只读分区的改动上双清可能也没用。第二条是用官方刷机工具重刷官方固件这是唯一能保证回到原厂状态的方法代价同样是数据丢失。所以我在第 2 节反复强调备份清单因为到了这一步你唯一能做的就是尽量少丢东西。5.2 恢复命令的正确用法与失败原因恢复的核心就是一条命令adb shell cmd package install-existing --user 0 包名 # 旧版系统可能要用 adb shell pm install-existing --user 0 包名 # 如果想恢复到所有用户 adb shell cmd package install-existing 包名它会从只读分区里重新把这个应用注册给指定用户速度很快通常几秒钟完成。执行后可以用pm list packages --user 0确认它回到了启用列表里必要时重启一次让服务重新绑定。失败一般有三种原因。一是包名拼错这个最常见回去核对清单。二是这个包在当前固件版本里不存在比如你参照的教程来自另一个版本包名已经改了或被合并了这时候报错是正常的说明你也没删到它。三是你用 root 方式真的删掉了 APK那就没有东西可以重新注册只能靠刷机或者重装对应模块。5.3 常见问题速查表下面这张表是我自己遇到和帮别人处理过的问题汇总出现症状时按顺序排查。症状大概率原因排查命令处理方式开机黑屏只剩状态栏删了桌面应用pm list packages -u | grep launcher恢复桌面包后重启应用信息页打不开权限控制器或设置被删pm list packages | grep permissioncontroller恢复该组件无法安装任何 APK包安装器被删pm list packages -u | grep packageinstaller恢复安装器网页类应用白屏WebView 被删pm list packages | grep webview恢复 WebView收不到短信/无法通话电话与通信组件被删pm list packages -u | grep telephony恢复对应组件蓝牙或定位失效硬件服务被停用pm list packages -d启用对应服务应用频繁要求重新登录账号或推送组件被删pm list packages -u | grep -i account恢复账号相关包输入法无法弹出所有输入法都被处理掉了pm list packages | grep -i inputmethod至少恢复一个系统更新按钮消失更新组件被删pm list packages -u | grep updater按需恢复否则放弃 OTA删掉的包又出现了系统进行了大版本更新pm list packages --user 0 -e更新后重新执行卸载5.4 几条用教训换来的实操心得一次只动一个包删完重启正常用满一天再删下一个。这条规矩听起来效率低但它把出问题时不知道是哪个包导致的这个最头疼的场景直接消灭了。我曾经一口气删了十四个包结果桌面小组件集体失灵只能一个个恢复来定位前后折腾了三个小时从那以后再也不批量操作。不要迷信网上的一键精简脚本。这类脚本的作者用的是他自己的机型和固件版本包名和依赖关系跟你的未必一致而脚本执行时是不带确认的一旦命中关键包你连反悔的机会都没有。真想提高效率就自己写一个带白名单校验的循环脚本执行前先把待删清单打印出来让你确认。记好你的恢复清单并且放在手机之外的地方。这个说第二遍是因为它太重要了。我在电脑上维护了一份按机型分类的文本文件包含每次删除的包名、日期、原因和恢复命令换手机的时候直接复制过去改改就能用几年下来比任何教程都可靠。准备转卖或者送人之前把删掉的东西恢复回去。倒不是道德问题而是很多功能缺失在别人手里会被当成手机坏了最后还得回来找你。而且恢复之后再双清是最干净的交付状态。大版本更新之后一定要复核。系统升级往往会重新灌入完整的预装清单你之前删掉的包可能全部复活同时还可能新增几个从没见过的新包。我的习惯是每次更新完先跑一遍导出命令和旧清单对比差异再决定要不要重新清理。5.5 一个可直接复用的半自动清理脚本最后分享一个我自己在用的思路核心是先列出、再确认、后执行避免误伤。#!/bin/bash # 待处理包名写在一个文件里每行一个井号开头为注释 LISTclean_list.txt while read -r pkg; do [ -z $pkg ] continue case $pkg in \#*) continue ;; esac # 跳过白名单里的关键组件 if echo $pkg | grep -qE launcher|systemui|settings|packageinstaller|permissioncontroller|telephony; then echo [跳过] $pkg 命中关键组件白名单 continue fi echo 即将卸载: $pkg read -r -p 确认? (y/N) ans [ $ans y ] || continue adb shell pm uninstall --user 0 $pkg echo $pkg removed_log.txt done $LIST这个脚本的价值不在省了多少次敲键盘而在于那道白名单和那一次确认。真正出事的人几乎都不是因为技术不够而是因为太快、太顺手、太相信某个现成的清单。把节奏放慢一点把记录留全一点这件事就从一个有风险的折腾变成一件可以反复做、越做越熟的手艺活。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门