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
相关产品推荐
相关产品推荐

