如何在Flutter集成测试中模拟电池设置/状态?
解决Flutter测试中执行
adb shell dumpsys battery权限拒绝问题 我来帮你排查这个Permission denied的问题,这大概率和adb的权限配置、设备调试状态有关,咱们一步步来解决:
1. 先手动验证命令是否可行
先别着急在测试代码里跑,打开终端手动执行命令,先排除设备或adb的基础问题:
adb shell dumpsys battery set ac 1
如果手动执行也报权限错误,按以下方向排查:
- 检查设备USB调试状态:进入设备「设置」→「开发者选项」(没看到的话,先去「关于手机」连续点击版本号激活),确保「USB调试」已开启,连接电脑时选择「文件传输/调试」模式。
- 检查adb设备授权:运行
adb devices,如果设备状态是unauthorized,设备屏幕会弹出授权提示,点击允许当前电脑调试该设备。 - 定制ROM限制处理:部分厂商系统会限制
dumpsys battery命令,试试开启开发者选项里的「允许修改系统设置」「允许模拟位置」这类额外选项,或者重启adb服务:adb kill-server adb start-server
2. 解决测试进程的adb权限问题
如果手动执行命令正常,但测试代码里报错,那可能是Flutter测试进程的用户权限或环境变量问题:
- Linux/macOS用户:确保当前用户加入了
plugdev组(这是访问USB设备的必要组),执行以下命令后重启终端或重新登录:sudo usermod -aG plugdev $USER - 指定adb完整路径:测试进程的环境变量可能没包含adb路径,直接写adb的绝对路径就能解决,比如:
别用// macOS示例路径 Process.run('/Users/你的用户名/Library/Android/sdk/platform-tools/adb', ['shell', 'dumpsys', 'battery', 'set', 'ac', '1']); // Linux示例路径 Process.run('/usr/bin/adb', ['shell', 'dumpsys', 'battery', 'set', 'ac', '1']);sudo,测试进程无法交互输入密码,反而会加重权限问题。
3. 测试代码的额外优化
- 执行设置命令前先重置电池状态,避免之前的配置干扰:
await Process.run(adbPath, ['shell', 'dumpsys', 'battery', 'reset']); await Process.run(adbPath, ['shell', 'dumpsys', 'battery', 'set', 'ac', '1']); - 确保测试代码调用的adb和终端里的是同一版本,避免版本不兼容导致的异常。
按照这个流程排查,应该能解决权限拒绝的问题。
内容的提问来源于stack exchange,提问作者SEG.Veenstra
相关产品推荐
相关产品推荐

