You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中从Assets执行二进制文件遇权限被拒,如何解决?

解决Flutter中执行自定义二进制文件的权限被拒问题

我开发了一款应用,因特定需求需要执行由其他语言编译生成的自定义二进制文件。尝试使用Dart的Process.run执行该文件时,遇到权限被拒的问题。

实现代码

class _MyHomePageState extends State<MyHomePage> {
  ...

  void _executeBinary() async { 
    final byteData = await rootBundle.load('assets/my_executable');
    final buffer = byteData.buffer;
    Directory tempDir = await getApplicationDocumentsDirectory();
    String tempPath = tempDir.path;

    File file = await File('$tempPath/my_executable').writeAsBytes(
      buffer.asUint8List(byteData.offsetInBytes, byteData.lengthInBytes)
    );
    
    // Permission denied :(
    ProcessResult rs = await Process.run(file.path, []);

    if (rs.stdout.isNotEmpty) {
      print("Log: ${rs.stdout}");
    }

    if (rs.stderr.isNotEmpty) {
      print("Log: ${rs.stderr}");
    }
  }

  ...
}

错误信息

E/flutter ( 3343): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: ProcessException: Permission denied
E/flutter ( 3343):   Command: /data/user/0/com.example.webrtc_test/app_flutter/my_executable

解决方案

1. 给二进制文件添加可执行权限

从assets目录复制到应用私有目录的文件默认没有执行权限,需要通过chmod命令添加可执行权限,在写入文件后、执行文件前添加以下代码:

// 添加可执行权限
await Process.run('chmod', ['+x', file.path]);

修改后的完整执行逻辑:

void _executeBinary() async { 
  final byteData = await rootBundle.load('assets/my_executable');
  final buffer = byteData.buffer;
  Directory tempDir = await getApplicationDocumentsDirectory();
  String tempPath = tempDir.path;

  File file = await File('$tempPath/my_executable').writeAsBytes(
    buffer.asUint8List(byteData.offsetInBytes, byteData.lengthInBytes)
  );

  // 新增:添加可执行权限
  await Process.run('chmod', ['+x', file.path]);
  
  ProcessResult rs = await Process.run(file.path, []);

  if (rs.stdout.isNotEmpty) {
    print("Log: ${rs.stdout}");
  }

  if (rs.stderr.isNotEmpty) {
    print("Log: ${rs.stderr}");
  }
}

2. 确认二进制文件适配目标平台

确保你的自定义二进制文件是针对目标平台编译的:

  • 对于Android,需要编译成对应架构的二进制(如arm64-v8a、armeabi-v7a),不能使用x86架构的文件
  • 对于iOS,需要确保二进制符合Apple的签名要求,且是针对iOS平台编译的

3. 验证应用私有目录权限

你使用的getApplicationDocumentsDirectory()是应用私有目录,Android 10+无需额外申请存储权限,但仍需确认该目录的读写权限正常,避免因系统限制导致的权限问题。

内容的提问来源于stack exchange,提问作者Maverick Fabroa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 05:45:33