MacOS下Flutter集成测试调用dart:io执行adb命令报Permission denied错误
原因分析
- Mac系统下,Android Studio启动测试进程时加载的环境变量和终端用户自定义的环境变量不一致,默认没有包含Android SDK platform-tools的目录到PATH中,导致测试进程调用
adb命令时找不到可执行文件,抛出权限错误。 - 直接在终端执行adb命令时读取的是当前用户的完整环境变量,已经配置了adb路径,所以可以正常执行。
解决方案
方案1:指定adb绝对路径(最稳妥)
- 先在终端执行命令获取adb的完整路径:
which adb
返回结果示例:/Users/your_username/Library/Android/sdk/platform-tools/adb - 将完整路径替换掉代码中的
adb参数即可,修改后的代码示例:
void main() { group('Testing full app flow', () { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); setUpAll(() async { // 替换为你本地which adb返回的完整路径 await Process.run('/Users/your_username/Library/Android/sdk/platform-tools/adb' , ['shell' ,'pm', 'grant', 'com.MYSERVICE', 'android.permission.ACCESS_FINE_LOCATION']); }); testWidgets('test the password input on real device/emulator', (tester) async { //TESTS }); }); }
方案2:动态传入环境变量
如果不想写死路径,可以在调用Process.run时手动把adb所在目录加入运行环境的PATH中:
import 'dart:io'; // 省略其他代码 setUpAll(() async { await Process.run( 'adb', ['shell' ,'pm', 'grant', 'com.MYSERVICE', 'android.permission.ACCESS_FINE_LOCATION'], environment: { // 追加adb所在目录到PATH,替换为你本地的platform-tools路径 'PATH': '${Platform.environment['PATH']}:/Users/your_username/Library/Android/sdk/platform-tools', }, ); });
其他排查方案
如果以上操作后仍报错,给adb文件添加执行权限即可:chmod +x /Users/your_username/Library/Android/sdk/platform-tools/adb
内容的提问来源于stack exchange,提问作者lou habert
相关产品推荐
相关产品推荐

