flutter - 在 Flutter 应用程序中托管可执行文件
问题描述
我有一个在 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');
}
稍后在我的代码中,我尝试运行它。
void invokeExecutable() async {
String executablePath = join(appInternalPath, 'main');
Process.run('chmod', ['u+x', executablePath]).then((ProcessResult results) {
Process.run(executablePath, []).then((ProcessResult results) {
print(results.stdout);
});
});
}
但是获取权限被拒绝错误。
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>
我也试过:
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);
});
});
我的可执行文件:
// 'Hello World!' program
#include <iostream>
int main()
{
std::cout << "Hello World!" << std::endl;
return 0;
}
>> g++ main.cc -o main
有没有办法以适当的权限运行您自己的可执行文件?在原生 android 上,可以选择file.setExecutable(true);
使用此策略。(在 Android 应用程序中托管可执行文件)
还是我必须尝试方法通道?
pubspec.yml
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
我还验证了该文件已写入设备的内部存储器,我希望使用 android studio 的设备探索将其写入。
解决方案
您需要将 .db 文件扩展名放在数据库名称的末尾(假设 DB_DIR 用于数据库)。var path = join(DB_DIR, 'main.db');
然后我想你可能想使用path_provider 包并使用
Directory documentsDirectory = await getApplicationDocumentsDirectory();
用于访问数据库的目录。
推荐阅读
- bash - 将参数传递给 docker
- php - 将特定时区日期转换为 strtotime
- python - 使用或工具在车辆路径中的最小距离约束
- javascript - 链接两个对象,值到值,并填充序列中的任何缺失值
- javascript - 使用 websocket 时的意外行为
- firebase - FormatException:意外字符(在字符 1 处) - firebase 身份验证
- python - 两个数字(0.85,0.18)之间的 T 检验将 p 值设为 Nan
- c++ - C++:模板类型的提取
- angular - 模板引用变量给出_r0不是函数错误
- firebase - 过滤 Firebase 数据库中的 2 个项目