Rust 移动开发与跨平台模式探究

Posted Rust语言中文社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rust 移动开发与跨平台模式探究相关的知识,希望对你有一定的参考价值。

,即 ARM64 android
  • arm-linux-androideabi,即 ARMv7 Android
  • armv7-linux-androideabi,即 ARMv7a Android
  • i686-linux-android,即 32-bit x86 Android
  • thumbv7neon-linux-androideabi, 即 Thumb2-mode ARMv7a Android with NEON
  • x86_64-linux-android,即 64-bit x86 Android
  • 看得出来,Rust 对 ios 和 Android 的支持还算可以。

    crate,包含了大部分通用代码,并且使用 trait 来定义特定平台部分的接口。
  • shared-android crate,用于提供与 Java 共享的代码接口。
  • shared-ios crate, 用于提供与 ObjectiveC 共享的代码接口。
  • shared-mock crate ,为了便于核心 Rust 代码的开发而实现了一个“模拟”平台,它提供所有相同的接口,但只是在桌面环境中运行。这有助于在纯 Rust 环境中开发许多东西,并避免了移动工具链的集成痛苦。
  • 对于 iOS ,将 Rust 代码构建为静态库,使用 Ditto 编写脚本来构建 Rust 工具链,使用与 XCode 一致的 LLVM 版本。

    对于 Android,将 Rust 构建为静态库,通过 CMake 与一些 C 代码链接,再给 Java 库共享。

    使用 Rust 以后的优势

    1. 能够编写高性能代码,而无需花费过多时间进行优化
    2. 不必追踪客户在平台提供的 Rust 代码中报告的数据竞争导致的奇怪崩溃或错误
    3. 可以有信任地引入对平台代码库不熟悉的开发人员,他们知道编译器会限制他们由于没有完全理解“烧入”他们大脑的代码而造成的损害。(Rust 语言比较受欢迎,新人也愿意学习)

    移动开发中使用 Rust 带来的痛苦是什么?

    FullStory 工程师在 hacknews 上面透露:

    "The only real pain we felt was around iOS bitcode and that was mainly Apple\'s fault because they make the whole process so Byzantine if you aren\'t using clang."

    "我们唯一真正感到痛苦的是围绕着iOS的位码,这主要是苹果的错,因为如果你不使用clang,他们会使整个过程变得非常复杂。"

    关于此问题,在 Rust issues 中有记录:https://github.com/rust-lang/rust/issues/35968 (未解决),导致FullStory 团队无法直接使用上游 Rust 工具链,他们的解决办法是使用与 Xcode 相同版本的 LLVM来提供带有嵌入式 LLVM 位码的框架。

     crate 为 core 提供特定平台的服务(OS Services)。等等。

    目前这个通用的 core 库在 Linux 端比较成功,1Password 团队表示会在下一代 1Password 的产品中也采用这种架构。

    这个工具时需要注意,有时会在 Swift 代码的上下文中生成对 C 绑定不友好的函数签名,因为 Swfit 对某些类型支持不完善, 所以还需要在生成之后手工检查一下。
  • 同样遇到了 Rust 工具链 LLVM 和  Apple 中使用 LLVM 版本不同而导致 BitCode 不兼容的问题。他使用了 rust-bitcode 来解决这个问题。
  • 的作者 fzyzcjy 也在和 AppFlowy 的开发者沟通,后续 AppFlowy 有可能使用 flutter_rust_bridge,但目前这个进展比较缓慢。

    等多语言和开发环境。其中 Rust/ Kotlin/ Swift/ Python  SDK 是基于一个 Rust core 库来构建的,而 javascript/ QML 是基于 JavaScript 核心库构建。

    crate,用于为各个操作系统平台打包程序。
  • cli-rs,Rust 实现的跨平台 Cli 。
  • cli-js,是对 cli-rs的包装,使用 napi-rs为每个平台生成 npm 包。
  • webdriver,之前叫tauri-driver,是一个跨平台 WebDriver  Server。
  • 其他
  • tauri-app/create-tauri-app,TypeScript实现的一个脚手架工具,帮助开发者快速创建 Tauri App。
  • 跨平台支持

  • tauri-app/tao,纯 Rust 实现的跨平台应用程序窗口创建库,支持 Windows、macOS、Linux、iOS 和 Android 等所有主要平台,基于 winit二次开发。
  • tauri-app/wry,纯 Rust 实现的跨平台 WebView 渲染库,支持 Windows、macOS 和 Linux 等所有主要桌面平台。Tauri 使用 WRY 作为抽象层,负责确定使用哪个 webview(以及如何进行交互)。因为现在 iOS 和 macOS 都是用 wkwebview,所以相当于也支持了 iOS 。而对于 Andriod 的支持还在进行中。
  • tauri-app/tao 利用 Rust 的 trait 和 features 机制,完美实现了跨平台架构:

    使用统一的 WindowClipboardEventLoop 等窗口抽象:

    类似的。

    建立统一的跨平台抽象:

    则是平台特定行为代码,通过 cfg 和 features 来构造一个统一的门面模块,完成跨平台分发。

    crate,来提供跨平台窗口。跟tauri-app 类似。
  • wgpu,用于 bevy_render crate,来提供跨平台渲染。这样在 bevy_ui 中就不需要关心特定平台细节了。
  • 其他,比如底层音频库、I/O、Log处理、资源管理等都做了跨平台相关处理。
  • 这些底层库实现跨平台的模式和上面 Tauri 的架构是相似的。

    / cxx/ protobuf/ grpc等 crates 的支持,为了方便开发。Android 团队充分验证了 Rust 和 C++ 之间的互操作性已经在很大程度上足以在 Android 中方便地使用 Rust。

  • 也将 rust-analyzer / clippy/ rustfmt集成到了 构建系统中。

  • 给Apple 的一封公开信:请用 Rust 替换 Objective-C

    IronCore Labs 公司 CEO( Patrick Walsh )去年(2021.10)在其官网发布了一篇 给Apple 的一封公开信:请用 Rust 替换 Objective-C 的文章,内容摘要:

  • iOS 15.1 更新修复了 22 个漏洞。谢谢你。但在这 22 个漏洞中,至少有 16 个是由于内存错误造成的,包括整数溢出、内存损坏、越界读写、释放后使用、缓冲区溢出等。
  • 建议 Apple 通过 Rust 与 Swfit 的互操作性,让 Rust 语言成为苹果技术栈中一等公民。
  • 然后使用 Rust 重写CoreAudio、CoreGraphics 和 WebKit 等关键部分,这些都是现实世界中针对 Apple 客户的攻击的主要载体。
  • 这是一项艰巨的工作,但它会带来巨大的投资回报。迁移到 Rust 可以消除 70% 的漏洞,并且可能更接近 95% 的可远程利用的漏洞。专注于解析来自不受信任来源的数据的库将使Apple平台更加安全。

    参考

    https://foundation.rust-lang.org/posts/2022-03-08-member-spotlight-1password/

    https://www.fullstory.com/blog/rust-at-fullstory-part-2-mobile-sdk/

    https://digvijayu.medium.com/building-cross-platform-library-with-rust-for-ios-and-android-c56a448e4804

    https://foundation.rust-lang.org/news/2022-03-08-member-spotlight-1password/

    https://dteare.medium.com/behind-the-scenes-of-1password-for-linux-d59b19143a23

    https://github.com/QConChina/QConBeijing2019/tree/master/%E7%A7%BB%E5%8A%A8%E6%96%B0%E7%94%9F%E6%80%81

    https://rustrepo.com/repo/i-schuetz-rust_android_ios-rust-mobile

    https://github.com/Dushistov/flapigen-rs

    https://github.com/ivanschuetz/wasm-rust-d3

    https://github.com/Co-Epi/app-backend-rust

    https://macroquad.rs/tutorials/android/

    http://dockone.io/article/2434630

    https://dev.to/tauri/announcing-tauri-beta-more-efficient-crossplatform-apps-with-better-features-1nbd

    https://tauri.studio/docs/development/security

    https://rustmagazine.github.io/rust_magazine_2021/chapter_5/running_rust_on_android.html

    https://source.android.com/setup/build/rust/building-rust-modules/overview

    https://blog.mozilla.org/data/2022/01/31/this-week-in-glean-building-and-deploying-a-rust-library-on-ios/

    https://blog.ironcorelabs.com/an-open-letter-to-apple-please-please-replace-objective-c-with-rust-10df606c3dce

    https://nadim.computer/posts/2022-02-11-maccatalyst.html

    https://security.googleblog.com/2021/06/rustc-interop-in-android-platform.html

    https://source.android.com/setup/build/rust/building-rust-modules/android-rust-modules

    跨平台应用开发进阶(四十二)vue与nvue页面设计方案探究

    文章目录

    一、前言

    在应用uni-app跨平台设计方案进行app开发过程中,uni-app官网支持两种页面设计方案:vuenvue,不少同学在应用过程中,会搞不清楚两者的区别,而不知如何选择,甚至可能产生错误的应用方式。

    二、选择方案

    uni-app App 端内置了一个基于 weex 改进的原生渲染引擎,提供了原生渲染能力。

    在 App 端,如果使用 vue 页面,则使用 webview 渲染;如果使用 nvue 页面(native vue
    的缩写),则使用原生渲染。一个 App 中可以同时使用两种页面,比如首页使用 nvue,二级页使用 vue 页面。

    注意⚠️:

    2.1 CSS注意事项

    三、快速上手

    3.1 新建 nvue 页面

    在 HBuilderX 的 uni-app 项目中,新建页面,弹出界面右上角可以选择是建立vue页面还是nvue页面,或者 2 个同时建。

    不管是 vue 页面还是 nvue 页面,都需要在pages.json中进行路由注册。如果在 HBuilderX 中新建页面是会自动注册的,如果使用其他编辑器,则需要自行在 pages.json 里手工注册。

    如果一个页面路由下同时有 vue 页面和 nvue 页面,即出现同名的 vuenvue 文件。那么在 App 端,会仅使用 nvue 页面,同名的 vue 文件将不会被编译到 App 端。而在非 App 端,会优先使用 vue 页面。

    如果不同名,只有 nvue 页面,则在非 app 端,只有 uni-app 编译模式nvue 文件才会编译。

    3.2 开发 nvue 页面

    nvue 页面结构同 vue, 由 templatestylescript 构成。

    1. nvue API :仅支持 App 端,uni-app 编译模式也可使用。使用前需先引入对应模块,参考:模块引入 API
    2. uni API
    3. plus API:仅支持 App 端。

    3.3 调试 nvue 页面

    HBuilderX 内置了 weex 调试工具的强化版,包括审查界面元素、看 log、debug 打断点,详见

    四、拓展阅读

    以上是关于Rust 移动开发与跨平台模式探究的主要内容,如果未能解决你的问题,请参考以下文章

    一个iOS开发者的android修行之路二:UITableView和ListView的对比探究

    设计模式之外观模式(门面模式)

    APICloud刘鑫:从小程序和苹果的生态探究应用开发者生态五大标准

    工厂模式和门面模式

    设计模式之门面模式与装饰器模式详解和应用

    跨平台应用开发进阶(四十二)vue与nvue页面设计方案探究