5、应用管理(上):adb install、adb uninstall、adb shell pm list packages
各位好,今天我们来聊聊 Android 应用管理中最基础、也最常用的三个命令。说白了,就是怎么装 App、怎么卸 App、以及怎么查看手机上到底装了哪些 App。
我刚开始接触 ADB 的时候,觉得装个软件嘛,直接点安装包不就行了?后来发现,真到了批量测试、自动化部署、或者处理一些系统级应用的时候,命令行才是最高效的方式。你想想看,几十台设备同时装同一个 APK,用手点得点到什么时候?
核心知识点速览
adb install— 安装 APK 文件adb uninstall— 卸载指定应用adb shell pm list packages— 列出设备上所有应用的包名
5.1 adb install — 安装 APK
这个命令应该是大家最先接触到的。用法非常简单:
adb install 路径/你的应用.apk
嗯,这里有个小细节。如果你直接把 APK 拖到命令行窗口,很多终端会自动补全路径,但要注意路径里不能有中文或空格。我曾经有个同事,APK 文件名里带了个空格,结果安装一直失败,查了半天才发现是路径解析的问题。
常用参数:
-r:覆盖安装。应用已存在时,保留数据重新安装。-d:降级安装。当新版本号低于已安装版本时,允许安装。-s:安装到 SD 卡(如果设备支持)。-g:授予所有运行时权限。
举个例子,你正在调试一个 App,每次改完代码都要重新装一遍。如果每次都先卸载再安装,数据就没了。这时候用 -r 参数就特别方便:
adb install -r app-debug.apk
我个人习惯在自动化测试脚本里加上 -g 参数,这样安装完直接就有全部权限,省得每次都要手动点「允许」。
注意:如果设备上已经安装了签名不同的同名应用,-r 也无法覆盖安装。必须先卸载再安装。这种情况我在对接第三方 SDK 时遇到过好几次,签名不一致导致安装失败,排查起来还挺头疼的。
5.2 adb uninstall — 卸载应用
卸载命令更简单:
adb uninstall 包名
注意,这里用的是包名,不是应用名称。比如你想卸载微信,不能写「微信」,而要写 com.tencent.mm。
那包名怎么查?别急,下一节就讲。
卸载时有个参数值得记住:
-k:卸载应用但保留数据和缓存目录。
为什么要保留数据?有时候你只是想换个版本,但不想丢失用户配置。比如测试某个 App 的升级逻辑,先用旧版本装好、登录、产生一些数据,然后用 adb uninstall -k 卸载,再装新版本。这样新版本启动时就能读到旧数据,模拟真实的升级场景。
我曾经踩过一个坑:用 adb uninstall 卸载系统应用(比如 com.android.calculator2),结果发现卸完之后计算器图标没了,但重启手机又回来了。这是因为系统分区里的应用,单纯用 adb uninstall 只是对当前用户停用,并没有真正删除。要彻底干掉系统应用,需要 root 权限或者用 adb shell pm uninstall -k --user 0 包名。嗯,这个后面章节会细讲。
5.3 adb shell pm list packages — 列出包名
这个命令是查看设备上所有已安装应用的包名。用法:
adb shell pm list packages
执行后会输出一长串包名,像这样:
package:com.android.contacts
package:com.android.calculator2
package:com.tencent.mm
package:com.google.android.gms
...
说实话,直接看全部列表有点眼花缭乱。所以 pm list packages 提供了很多过滤参数:
| 参数 | 说明 | 示例 |
|---|---|---|
-f |
显示 APK 文件路径 | adb shell pm list packages -f |
-3 |
只显示第三方应用 | adb shell pm list packages -3 |
-s |
只显示系统应用 | adb shell pm list packages -s |
-i |
显示安装来源 | adb shell pm list packages -i |
grep |
按关键字过滤(Linux/Mac) | adb shell pm list packages | grep tencent |
我最常用的是 -3 和 grep 的组合。比如我想看看手机上装了哪些腾讯系的应用:
adb shell pm list packages -3 | grep tencent
输出:
package:com.tencent.mm
package:com.tencent.mobileqq
package:com.tencent.qqmusic
你看,一目了然。
小技巧:在 Windows 的 cmd 里没有 grep 命令,可以用 findstr 替代:
adb shell pm list packages | findstr tencent
另外,-f 参数能显示 APK 的安装路径,这在排查「应用到底装在哪」时很有用。比如:
adb shell pm list packages -f com.tencent.mm
输出类似:
package:/data/app/com.tencent.mm-1/base.apk=com.tencent.mm
看到 /data/app/ 开头的路径,说明是用户安装的应用。如果是 /system/app/ 开头的,那就是系统预装应用。
5.4 实战组合拳
这三个命令单独用都很简单,但组合起来威力就大了。我举个例子:
假设你要批量卸载所有第三方应用,只保留系统应用。可以这样:
adb shell pm list packages -3 | cut -d ":" -f 2 | while read pkg; do adb uninstall $pkg; done
这条命令的意思是:列出所有第三方包名,提取出包名字段,然后逐个卸载。当然,这个操作很暴力,慎用。
再比如,你想知道某个 APK 的包名是什么,但又不想安装它。可以用 aapt 工具(Android SDK 自带的):
aapt dump badging 你的应用.apk | grep package
输出:
package: name='com.example.myapp' versionCode='1' versionName='1.0'
这样你就能在安装之前就知道包名了。
避坑指南:我曾经在测试一款海外应用时,用 adb install 安装一直失败,提示 INSTALL_FAILED_UPDATE_INCOMPATIBLE。查了半天发现,手机上已经有一个同包名但签名不同的版本。这种情况只能先 adb uninstall 再装。所以,如果你遇到安装失败,先看看是不是签名冲突。
好了,这一章的内容就到这里。记住这三个命令,它们是应用管理的基石。装、卸、查,三板斧用熟了,后面讲批量管理、权限控制、甚至应用冻结都会轻松很多。
公众号:蓝海资料掘金营,微信deep3321