稍作配置,同一份代码横跨 Android & IOS,相比于 React Native 方案更加高性能。除此之外,得益于 Rust 跨平台加持,Rust 部分的代码可在种种场合复用。

这篇文章旨在记录作者尝试结合 Rust 和 Flutter 的过程,且仅为初步尝试。不会涉及诸如:

如何搭建一个 Flutter 开发环境,以及 Dart 语言怎么用

如何搭建一个 Rust 开发环境,以及 Rust 语言怎么学

开头给自己博客打波广告Rust + Flutter 高性能的跨端尝试​blog.idx0.dev

EnvironmentFlutter: Android, IOS 工具配置妥当

Rust: Stable 就好

Rust Part

Prepare cross-platform toolchains & deps

IOS

# Download targets for IOS ( 64 bit targets (real device & simulator) )

rustup target add aarch64-apple-ios x86_64-apple-ios

# Install cargo-lipo to generate the iOS universal library

cargo install cargo-lipo

Android

这里有一些行之有效的辅助脚本用于更加快捷配置交叉编译工具。获取 Android NDK

sh sdkmanager --verbose ndk-bundle 如果已经准备好了 Android NDK ,则设置环境变量 $ANDROID_NDK_HOME ```sh

example:

export ANDROID_NDK_HOME=/Users/yinsiwei/Downloads/android-ndk-r20b 2. Create the standalone NDKsh

$(pwd) == ~/Downloads

git clone https://github.com/kennytm/rust-ios-android.git cd rust-ios-android ./create-ndk-standalone.sh 3. 在 Cargo default config VS 配置 Android 交叉编译工具sh cat cargo-config.toml >> ~/.cargo/config 执行上述命令后会在 Cargo 默认配置中,增加有关 Android 跨平台目标 (targets, `aarch64-linux-android`, `armv7-linux-androideabi`, `i686-linux-android`) 的工具信息,指向刚刚创建的 `standalone NDK`。ini [target.aarch64-linux-android] ar = ... linker = ..

[target.armv7-linux-androideabi] ...

[target.i686-linux-android] .. 4. 下载 Rust 支持 Android 交叉编译的依赖sh rustup target add aarch64-linux-android armv7-linux-androideabi i686-linux-android ```

Start a simple rust library创建一个 Rust 项目

sh cargo init my-app-base --lib

编辑 Cargo.toml 修改 crate-type

ini [lib] name = "my_app_base" crate-type = ["staticlib", "cdylib"] Rust 构建出来的二进制库,在 IOS 中是静态链接进最终的程序之中,需要对构建 staticlib 的支持;在 Android 是通过动态链接在运行时装在进程序运行空间的,需要对构建 cdylib 的支持。

写一些符合 C ABI 的函数 src/lib.rs

```rust use std::os::raw::c_char; use std::ffi::CString;

[no_mangle]

pub unsafe extern fn hello() -> *const c_char { let s = CString::new("world").unwrap(); s.into_raw() } ```

在上述代码中,每次当外部调用 hello 函数时,会在晋城堆空间中创建一个字符串 ( CString ),并将所有权 ( 释放该字符串所占堆空间的权利 ) 移交给调用者。

Build libraries

# IOS

cargo lipo --release

# Android

cargo build --target aarch64-linux-android --release

cargo build --target armv7-linux-androideabi --release

cargo build --target i686-linux-android --release

然后在 target 目录下会得到以下有用的物料。

target

├── aarch64-linux-android

│ └── release

│ ├── libmy_app_base.a

│ └── libmy_app_base.so

├── armv7-linux-androideabi

│ └── release

│ ├── libmy_app_base.a

│ └── libmy_app_base.so

├── i686-linux-android

│ └── release

│ ├── libmy_app_base.a

│ └── libmy_app_base.so

├── universal

│ └── release

│ └── libmy_app_base.a

至此, Rust 部分就告于段落了。

Flutter Part

Copy build artifacts to flutter project

from: target/universal/release/libmy_app_base.a

to: ios/

from: target/aarch64-linux-android/release/libmy_app_base.so

to: android/app/src/main/jniLibs/arm64-v8a/

from: target/armv7-linux-androideabi/release/libmy_app_base.so

to: android/app/src/main/jniLibs/armeabi-v7a/

from: target/i686-linux-android/release/libmy_app_base.so

to: android/app/src/main/jniLibs/x86/

Call FFI function in Dart添加依赖

pubspec.yaml -> dev_dependencies: += ffi: ^0.1.3

添加代码

(直接在生成的项目上修改,暂不考虑代码设计问题,就简简单单的先把项目跑起来 ) ```dart import 'dart:ffi'; import 'package:ffi/ffi.dart';

// ... final dylib = Platform.isAndroid ? DynamicLibrary.open('libmy_app_base.so') :DynamicLibrary.process(); var hello = dylib.lookupFunction Function(),Pointer Function()>('hello');

// ... hello(); // -> world ```

Build Android Project

flutter run # 如果连接着 Android 设备就直接运行了起来

Build IOS Project

( 复杂了许多 )跟随 Flutter 官方文档,配置 XCode 项目。

在 Build Phases 中 Link Binary With Libraries 添加 libmy_app_base.a 文件 (按照图上箭头点...)

在 Build Settings 中 Other Linker Flags 中添加 force_load 的参数。

这是由于在 Dart 中通过动态的方式调用了该库的相关函数,但在编译期间静态分析的时候,这些都是未曾被调用过的无用函数,就被剪裁掉了。要通过 force_load 方式解决这个问题。

Result

Troubleshooting

XCode & IOS

Error getting attached iOS device: ideviceinfo could not find device

sudo xattr -d com.apple.quarantine ~/flutter/bin/cache/artifacts/libimobiledevice/ideviceinfo

将后面的路径替换成你的

dyld: Library not loaded

dyld: Library not loaded: /b/s/w/ir/k/homebrew/Cellar/libimobiledevice-flutter/HEAD-398c120_3/lib/libimobiledevice.6.dylib

Referenced from: /Users/hey/flutter/bin/cache/artifacts/libimobiledevice/idevice_id

Reason: image not found

删除&重新下载

rm -rf /Users/hey/flutter/bin/cache && flutter doctor -v

真机无法启动 Flutter 程序

What's next如何高效的实现 Rust & Dart 部分的通信

我们知道 Flutter 和广大 GUI 库类似,属于单线程模型结合事件系统,因此在主线程中使用 FFI 调用 Rust 部分的代码不能阻塞线程。Dart 语言提供 async/await 语法特性用于在 Flutter 中处理网络请求等阻塞任务。而 Rust 也在最近版本中提供了 async/await 语法支持,如何优雅的把两部分结合起来,这是一个问题。

对 MacOS Windows Linux 桌面端的支持

Flutter 已经有了对桌面端的实验性支持,可以研究下如何结合在一起,实现跨 6 个端共享代码。

References

rust+mysql+prep+exec_Rust + Flutter 高性能的跨端尝试相关推荐

  1. 流言终结者- Flutter和RN谁才是更好的跨端开发方案?

    背景 论坛上很多小伙伴关心为什么闲鱼选择了Flutter而不选择其他跨端方案?站在质量的角度,高性能是一个很重的因素,我们使用Flutter重写了宝贝详情页之后,对比了Flutter和Native详情 ...

  2. 闲鱼架构专家,详解Flutter技术架构15页ppt:跨端方案如何选择?

    文/技术领导力社区 编辑/Emma 闲鱼架构团队负责人国有.技术专家宗心.灯阳,在文章及公开分享中介绍了Flutter在闲鱼的实践,内容包括:选择Flutter的背景和思考.闲鱼的Flutter新混合 ...

  3. 初探Flutter跨端游戏开发

    本文作者为奇舞团大前端CodeFarmer 背景 笔者在公司前前后后做了有小一年Flutter 开发,从入门到后面业务方变动,到暂时放弃Flutter.对于Flutter争议不提,我们得承认Flutt ...

  4. 阿里技术分享:闲鱼IM基于Flutter的移动端跨端改造实践

    本文由阿里闲鱼技术团队祈晴分享,本次有修订和改动,感谢作者的技术分享. 1.内容概述 本文总结了阿里闲鱼技术团队使用Flutter在对闲鱼IM进行移动端跨端改造过程中的技术实践等,文中对比了传统Nat ...

  5. 京东技术大中台的 Flutter 跨端实践之路

    点击上方"开发者技术前线",选择"星标" 13:21 在看 真爱 作者 | 京东 ARES 跨端团队 编辑 | Yonie 在 2019 年,Flutter 推 ...

  6. Flutter IM跨端架构设计和实现

    本文将介绍闲鱼IM框架的基本情况. 现状 闲鱼IM框架构建于2016-2017年,期间多次迭代升级导致历史包袱累积多,后经IM界面Flutter化,造成架构更复杂. 开发层面总结闲鱼当前架构主要存在如 ...

  7. android 开源fc模拟器_星标 4.5K!又一个跨端框架,腾讯开源内部跨端统一开发框架:Hippy...

    点击上方"Github中文社区",关注 看遍Github好玩的项目 大家好,我是Hub哥,每天带你学习(假装了解)一个牛逼,又很碉(沙雕),又不失节操的项目. 今天我在Github ...

  8. react router官方文档_阿里开源可插拔 React 跨端框架 UmiJS

    点击上方"开发者技术前线",选择"星标" 18:30 在看 真爱 作者:Tamic  |  编辑: 可可 阿里之前开源:阿里闲鱼开源 Flutter 应用框架 ...

  9. 开发跨端微信小程序框架选型指南

    多端框架uni-app和Taro选型对比 一. 背景 小程序原生开发有不少槽点: 1.原生wxml开发对Node.预编译器.webpack支持不好,影响开发效率和工程构建流程.所以大公司都会用框架开发 ...

  10. 【Dart】一门为跨端开发而生的编程语言

    目录 一.Dart 语言概述: Dart 语言特点: Dart 库: Dart 平台: Web 平台的 Dart (使用 JavaScript 开发和部署): Dart 运行时环境: 二.配置 Dar ...

最新文章

  1. 9月份国外最佳WordPress主机提供商Top12
  2. 计算机专业c语言题库,计算机专业C语言考试题.doc
  3. 岗位内推 | 美团语音交互部招聘NLP/知识图谱/语音识别等算法职位(可实习)...
  4. ICLR 2020 | 多模态下使用图片信息显著增强机器翻译效果
  5. 阿里99大促 | 模型识别背后的样本生成
  6. python自动化_Python 实现Excel自动化办公上
  7. indexof的使用
  8. FeatureLayer.FeatureClass.Feature --以及图层最容易理解的讲解;如有巧合,一定是别人抄袭(Arcgis辅助理解)
  9. 【多线程】CountDownLatch 和 CyclicBarrier:如何让多线程步调一致?
  10. 存储图片到第三方云服务器
  11. 微信小程序的模块化开发,提高效率第一篇
  12. oracle报错ORA-01843: not a valid month
  13. wps文档一敲空格就换行_wps敲空格变成点
  14. 低代码快速实现跟进提醒
  15. 颜值经济风暴来袭,国产美容仪如何站稳脚跟?
  16. 【读书笔记】《人性的弱点》——卡耐基
  17. 容差分析相关的计算公式
  18. Surface pro3电源管理
  19. IDV和IDV的发展简史
  20. 《信息化项目文档模板十一——系统运维流程工作流程模板》

热门文章

  1. 熔断机制什么意思_熔断机制是什么意思 股市熔断是什么意思
  2. cv2.resize()
  3. 迅雷离线下载免费申请体验(3天)
  4. 华为服务变革转型ITR流程再造的核心精髓许浩明老师一篇文章总结!
  5. 供应链金融三大类模式
  6. Metasploit [基础]
  7. 代码质量检查规则中的 is provided externally to the method and not sanitized b.
  8. python命令输入if_SPSS中Recode、Compute、Count、If命令
  9. linux so 加壳,[android] 从加壳的so文件中抽出symbols
  10. 删除WIN10桌面右键菜单多余项的方法