每天一个安卓测试开发小知识之 四 —常用的adb shell命令第二期 pm命令在安卓测试开发中adb shell命令是与设备交互的核心工具之一。上一期我们介绍了基础的adb shell命令如dumpsys、input等今天我们来深入探讨pm命令。pm是 Package Manager 的缩写它允许你管理设备上的应用包包括安装、卸载、查询权限、清除数据等操作。对于测试开发者来说掌握pm命令是高效进行应用测试和调试的必备技能。本文将从基础概念开始逐步深入到高级用法并通过完整代码示例帮助你快速上手。## 基础概念什么是 pm 命令pm命令是 Android 系统提供的包管理工具运行在adb shell环境中。它可以查询已安装的应用信息、控制应用状态、管理权限和缓存等。在测试中我们经常用它来- 查看应用是否安装- 清除应用数据以重置状态- 控制应用的权限授予- 强制停止或启用/禁用应用pm命令的基本语法是pm 子命令 [参数]所有操作都需要通过adb shell前缀执行例如adb shell pm list packages。## 常用 pm 子命令详解### 1. 查询已安装的应用包pm list packages是最常用的命令之一用于列出设备上所有已安装的应用包名。你可以添加过滤参数来缩小结果范围。常用参数--f显示应用对应的 APK 文件路径--3仅显示第三方应用非系统应用--s仅显示系统应用--i显示应用的安装来源如 Google Play示例bash# 列出所有第三方应用包名adb shell pm list packages -3# 列出包含 test 关键词的应用adb shell pm list packages | grep test输出示例package:com.example.myapppackage:com.android.test### 2. 安装与卸载应用虽然adb install更常用但pm install提供了更多控制选项特别是在脚本中。安装命令bashadb shell pm install -r /data/local/tmp/myapp.apk--r覆盖安装保留数据卸载命令bashadb shell pm uninstall -k com.example.myapp--k卸载时保留应用数据与缓存注意卸载系统应用可能需要 root 权限。### 3. 清除应用数据重置状态在测试中清除应用数据是重置应用状态的最快方法比如清除登录状态、缓存等。bashadb shell pm clear com.example.myapp执行后应用的所有用户数据、数据库、SharedPreferences 都会被删除应用会回到初始状态。### 4. 查看应用详细信息使用pm dump可以获取应用的详细信息包括权限、activity、service、provider 等。bashadb shell pm dump com.example.myapp | grep -A 5 permissions这将显示应用声明的权限列表。更全面的信息通常用于调试权限问题或分析应用结构。## 中级用法权限管理与应用状态控制### 1. 授予和撤销权限在 Android 6.0 及以上版本应用运行时需要动态请求权限。使用pm grant和pm revoke可以手动控制权限非常适合测试不同权限下的行为。授予权限bashadb shell pm grant com.example.myapp android.permission.CAMERA撤销权限bashadb shell pm revoke com.example.myapp android.permission.CAMERA列出所有权限bashadb shell pm list permissions -g--g按权限组分组显示### 2. 强制停止应用当应用出现 ANR无响应或需要模拟崩溃后重启时可以使用pm force-stop或am force-stop实际上am更常用但pm也可实现。bashadb shell pm force-stop com.example.myapp这等同于用户从最近任务中划掉应用会终止进程。### 3. 启用/禁用应用测试中可能需要临时禁用某个应用如系统应用以观察影响。注意禁用应用会从启动器中隐藏但不会卸载。禁用应用bashadb shell pm disable-user --user 0 com.example.myapp--user 0 表示主用户通常为默认用户。**启用应用**bashadb shell pm enable com.example.myapp**查看应用状态**bashadb shell pm list packages -d-d显示已禁用的应用## 高级用法脚本自动化与系统应用管理### 1. 批量操作脚本在自动化测试中我们可以编写 Python 或 Shell 脚本结合pm命令来批量管理应用。以下是一个 Python 示例用于清除多个应用的缓存并重置权限。pythonimport subprocessimport sys# 定义要操作的应用包名列表packages [ com.example.app1, com.example.app2, com.example.app3]# 定义要授予的权限permissions [ android.permission.CAMERA, android.permission.ACCESS_FINE_LOCATION]def clear_app_data(package_name): 清除指定应用的数据 command fadb shell pm clear {package_name} result subprocess.run(command, shellTrue, capture_outputTrue, textTrue) if Success in result.stdout: print(f[✓] 已清除 {package_name} 的数据) else: print(f[✗] 清除 {package_name} 失败: {result.stderr})def grant_permissions(package_name, permissions_list): 为指定应用授予权限列表 for perm in permissions_list: command fadb shell pm grant {package_name} {perm} result subprocess.run(command, shellTrue, capture_outputTrue, textTrue) if Error in result.stderr: print(f[✗] 授权失败 {perm}: {result.stderr}) else: print(f[✓] 已授予 {perm})if __name__ __main__: # 依次处理每个应用 for pkg in packages: print(f\n处理应用: {pkg}) clear_app_data(pkg) grant_permissions(pkg, permissions) print(\n所有操作完成)**代码说明**- 使用subprocess模块执行 adb 命令-clear_app_data函数清除指定应用数据-grant_permissions函数批量授予权限- 脚本会输出每个操作的成功或失败信息### 2. 管理系统应用与隐藏包对于测试开发者有时需要查看或操作系统级应用。pm命令可以通过–user参数管理多用户环境。**列出所有用户**bashadb shell pm list users**为指定用户安装应用**bashadb shell pm install --user 10 /path/to/app.apk用户 ID 10 通常为访客用户**查看应用的安装路径**bashadb shell pm path com.example.myapp输出类似package:/data/app/com.example.myapp-1/base.apk## 常见问题与调试技巧### 1. 权限错误如果pm grant失败可能是因为- 应用没有声明该权限检查 AndroidManifest.xml- 应用是系统应用且需要更高权限- 设备没有 root无法修改系统级权限### 2. 命令无响应如果pm clear后应用仍然有数据可能是因为应用使用了外部存储如 SD 卡需要手动清理。### 3. 批量操作效率当设备连接多个模拟器或真机时可以使用-s参数指定设备bashadb -s emulator-5554 shell pm list packages## 总结pm命令是安卓测试开发中不可或缺的工具它提供了对应用包的精细控制。从基础的查询安装包到中级的权限管理、应用状态控制再到高级的脚本自动化pm命令覆盖了测试流程的多个环节。通过本文的学习你应该能够- 使用pm list packages快速定位应用包名- 用pm clear和pm grant重置应用状态- 编写 Python 脚本自动化批量操作- 处理多用户环境下的应用管理掌握这些技巧后你可以更高效地进行回归测试、兼容性测试和权限测试。下一期我们将继续探索adb shell 的其他强大命令敬请期待