Flutter 在颤振应用程序中托管可执行文件

Flutter 在颤振应用程序中托管可执行文件,flutter,dart,Flutter,Dart,我有一个在android上运行的基本颤振项目,当应用程序启动时,我会在我的资产中编写一个捆绑的可执行文件 static String appInternalPath = '/data/data/com.maksimdan.face_merger'; void writeExecutable() async { var executablePath = join(appInternalPath, 'main'); if (await File(executablePat

我有一个在android上运行的基本颤振项目,当应用程序启动时,我会在我的资产中编写一个捆绑的可执行文件

  static String appInternalPath = '/data/data/com.maksimdan.face_merger';

  void writeExecutable() async {
    var executablePath = join(appInternalPath, 'main');

    if (await File(executablePath).exists()) {
      File(executablePath).delete();
      print('deleted old executable');
    } else {
      print('not executable exists');
    }

    ByteData data = await rootBundle.load('lib/py/dist/main');
    List<int> bytes =
        data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
    await File(executablePath).writeAsBytes(bytes);
    print('wrote new executable');
  }
但获取权限被拒绝的错误

E/flutter (31825): [ERROR:flutter/lib/ui/ui_dart_state.cc(186)] Unhandled Exception: ProcessException: Permission denied
E/flutter (31825):   Command: /data/data/com.maksimdan.flutter_general/main 
E/flutter (31825): #0      _ProcessImpl._start (dart:io-patch/process_patch.dart:390:33)
E/flutter (31825): #1      Process.start (dart:io-patch/process_patch.dart:36:20)
E/flutter (31825): #2      _runNonInteractiveProcess (dart:io-patch/process_patch.dart:565:18)
E/flutter (31825): #3      Process.run (dart:io-patch/process_patch.dart:47:12)
E/flutter (31825): #4      _MyHomePageState.invokeExecutable.<anonymous closure> (package:flutter_general/main.dart:51:15)
E/flutter (31825): #5      _rootRunUnary (dart:async/zone.dart:1362:47)
E/flutter (31825): #6      _CustomZone.runUnary (dart:async/zone.dart:1265:19)
E/flutter (31825): <asynchronous suspension>
我的可执行文件:

/“你好,世界!”节目
#包括
int main()
{

std::cout除了可写权限外,你还需要在应用程序中拥有可读权限

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.xxx.yyy">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

。。。

您需要将.db文件扩展名放在数据库名称的末尾(假设db_DIR用于数据库)。var path=join(db_DIR,'main.db')

那么我想你可能想用


对于您访问数据库的目录。

您运行的平台是什么?@Eiko android平台在同一路径上有趣地运行
chmod
,可执行文件会出现
未处理的异常:ProcessException:没有这样的文件或目录
,这没有多大意义。您可以共享使用的pubspec.yaml包吗您正在使用。它是否与您的项目安装位置有关?可能您要写入的路径需要您的操作系统的管理员权限?为了完整性,我也尝试了此操作。可执行文件正在手机内部内存中写入,而不是外部内存。我最初使用db_dir作为占位符名称;很抱歉造成混淆;我已编辑了question。但我对通过数据库进行复制不感兴趣。它是一个可以在终端上运行的可执行文件。我已经证明,通过可执行文件进行复制不是问题所在,而是在应用程序中执行它的尝试失败了。
      Process.run('/system/bin/chmod', ['744', path]).then((ProcessResult results) {
        print('shell1 complete');
        Process.run(path, []).then((ProcessResult results) {
          print('shell2 complete');
          print(results.stdout);
        });
      });
>> g++ main.cc -o main
name: face_merger
description: A new Flutter project.

version: 1.0.0+1

environment:
  sdk: ">=2.1.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter

  sqflite: ^1.3.0+2
  process_run: ^0.10.10+1
  cupertino_icons: ^0.1.3

dev_dependencies:
  flutter_test:
    sdk: flutter


flutter:
  uses-material-design: true
  assets:
    - lib/py/dist/main
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.xxx.yyy">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
Directory documentsDirectory = await getApplicationDocumentsDirectory();