Flutter原生工具链集成插件native_toolchain_rust的使用
Flutter原生工具链集成插件 native_toolchain_rust
的使用
native_toolchain_rust
是一个用于在构建 Dart 和 Flutter 原生资产时与 rustup
和 cargo
交互的库。该功能目前是实验性的,仅在 Flutter 主分支中可用,并且需要通过 flutter config
启用。
使用步骤
1. 启用 Native Assets
首先,你需要启用 Flutter 的 Native Assets 功能:
flutter config --enable-native-assets
2. 添加依赖
接下来,在你的项目中添加 native_toolchain_rust
和 native_assets_cli
作为依赖项:
dart pub add native_toolchain_rust
dart pub add native_assets_cli
3. 创建构建脚本
创建一个位于 hook/build.dart
的构建脚本:
import 'dart:io';
import 'package:native_toolchain_rust/native_toolchain_rust.dart';
import 'package:native_assets_cli/native_assets_cli.dart';
void main(List<String> args) async {
try {
await build(args, (BuildConfig buildConfig, BuildOutput output) async {
final builder = RustBuilder(
// The ID of native assets consists of package name and crate name.
package: '<your package name>',
cratePath: 'rust',
buildConfig: buildConfig,
);
await builder.run(output: output);
});
} catch (e) {
// ignore: avoid_print
print(e);
exit(1);
}
}
假设你的 Rust 代码位于包根目录下的 rust
目录中,Crate 必须是一个 cdylib
。
4. 添加 native_manifest.yaml
为了让你的工具链需求被 native_doctor
工具识别,你可以添加一个 native_manifest.yaml
文件到你的包根目录:
version: 0.1.0
requirements:
ndk:
version: 25.1.8937393
rust:
stable:
version: 1.77.2
5. 引用原生资产库
在你的代码中引用原生资产库时,可以使用 @ffi.DefaultAsset
注解:
@ffi.DefaultAsset('package:<flutter_package_name>/<rust_crate_name>')
library rust;
import 'dart:ffi' as ffi;
@ffi.Native<ffi.IntPtr Function(ffi.IntPtr, ffi.IntPtr)>()
external int sum(
int a,
int b,
);
完整的示例可以参考 GitHub 示例。
使用包含 Rust 原生资产的包
如果你的包中包含 Rust 代码,则需要在开发者的机器上安装 Rust 工具链。为了简化这一过程,native_toolchain_rust
会检测 Rust 工具链是否已安装并保持最新版本,如果未安装或版本过旧,它会建议运行 native_doctor
工具来自动安装和配置必要的工具链。
例如,当用户尝试构建你的包而没有安装 Rust 时,他们会收到以下错误消息:
Rustup not found.
Please run native_doctor in your project to fix the issue:
dart pub global activate native_doctor
dart pub global run native_doctor
以下是 native_doctor
在没有 Rust 安装且 NDK 版本过旧的计算机上的输出示例:
Project: example (Flutter)
Buildable platforms: macos, ios, android
Native toolchain: NDK
[✗] NDK installed, but too old
! Installed versions: 23.1.7779620
! Required minimum version: 25.1.8937393
Native toolchain: Rust
[✗] Rustup not found
[✗] Toolchain stable not installed
! Required minimum version: 1.77.2
! Missing targets: arm-linux-androideabi, aarch64-linux-android, i686-linux-android,
x86_64-linux-android, aarch64-apple-ios, x86_64-apple-ios, aarch64-apple-ios-sim, aarch64-apple-darwin,
x86_64-apple-darwin
Proposed actions:
• (NDK) Install NDK 25.1.8937393 or newer
• (Rust) Install rustup
• (Rust) Install toolchain stable
• (Rust) Install targets arm-linux-androideabi, aarch64-linux-android, i686-linux-android,
x86_64-linux-android, aarch64-apple-ios, x86_64-apple-ios, aarch64-apple-ios-sim, aarch64-apple-darwin,
x86_64-apple-darwin for toolchain stable
Do you want native doctor to perform proposed actions? (y/N)
确认后,native_doctor
将自动安装正确的 NDK 版本、所需的 Rust 工具链和目标:
• Fetching NDK list... [done]
• Installing NDK 26.3.11579264 [done]
• Installing rustup [done]
• Installing Rust toolchain stable [done]
• Installing target arm-linux-androideabi for toolchain stable [done]
• Installing target aarch64-linux-android for toolchain stable [done]
• Installing target i686-linux-android for toolchain stable [done]
• Installing target x86_64-linux-android for toolchain stable [done]
• Installing target aarch64-apple-ios for toolchain stable [done]
• Installing target x86_64-apple-ios for toolchain stable [done]
• Installing target aarch64-apple-ios-sim for toolchain stable [done]
• Installing target aarch64-apple-darwin for toolchain stable [done]
• Installing target x86_64-apple-darwin for toolchain stable [done]
更多关于Flutter原生工具链集成插件native_toolchain_rust的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html