当前位置: 首页 > news >正文

iOS使用Rust调研

编辑已恢复
我们已与您断开连接。尝试重连时会保存您所做的变更。尝试重连

标题 1

已保存
Bin Song
B

要发布此内容,请选择键盘上的 ⌘Enter。
发布

关闭

Rust技术空间


跨平台使用调研
iOS使用Rust调研

添加表情符号

添加标题图像

添加状态

一、iOS 项目接入 Rust Library
约定:
iOS 项目目录 DemoApp
Rust Library:demo-library-ffi
1.1、Rust Library
将 Rust Library 代码 Clone 到 iOS 项目根目录下: DemoApp/demo-library-ffi;
修改 DemoApp/rust-library/Cargo.toml,将 Rust Library 修改为静态库
[lib]
crate-type = [“staticlib”]
在 DemoApp 目录下创建一个新的顶层 Cargo.toml 文件:
[workspace]
members = [
“demo-library-ffi”
]
现在可以直接使用 cargo build 来生成 rust 静态库了:
DemoApp/target/debug/demo-library-ffi.a
1.2、iOS Project
1.2.1
打开 Xcode target configuration → Build Phases → Link Binary with Libraries 选项卡,选择 Add files,将前面生成的 DemoApp/target/debug/demo-library-ffi.a 文件添加进去;
是的,这个不是最终我们需要的正确静态库文件,因为它只有当前打包机器的架构,不要紧,我们会在下面步骤中修复它;
1.2.2
用文本编辑器打开 project.pbxproj,搜索并替换 Debug 和 Release 两处 LIBRARY_SEARCH_PATHS
LIBRARY_SEARCH_PATHS = (
( i n h e r i t e d ) " , " (inherited)", " (inherited)","(PROJECT_DIR)/target/debug”,
);
Debug 替换为:
“LIBRARY_SEARCH_PATHS[sdk=iphoneos*][arch=arm64]” = “ ( P R O J E C T D I R ) / t a r g e t / a a r c h 64 − a p p l e − i o s / d e b u g " ; " L I B R A R Y S E A R C H P A T H S [ s d k = i p h o n e s i m u l a t o r ∗ ] [ a r c h = a r m 64 ] " = " (PROJECT_DIR)/target/aarch64-apple-ios/debug"; "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=arm64]" = " (PROJECTDIR)/target/aarch64appleios/debug";"LIBRARYSEARCHPATHS[sdk=iphonesimulator][arch=arm64]"="(PROJECT_DIR)/target/aarch64-apple-ios-sim/debug”;
“LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=x86_64]” = “ ( P R O J E C T D I R ) / t a r g e t / x 8 6 6 4 − a p p l e − i o s / d e b u g " ; R e l e a s e 替换为: " L I B R A R Y S E A R C H P A T H S [ s d k = i p h o n e o s ∗ ] [ a r c h = a r m 64 ] " = " (PROJECT_DIR)/target/x86_64-apple-ios/debug"; Release 替换为: "LIBRARY_SEARCH_PATHS[sdk=iphoneos*][arch=arm64]" = " (PROJECTDIR)/target/x8664appleios/debug";Release替换为:"LIBRARYSEARCHPATHS[sdk=iphoneos][arch=arm64]"="(PROJECT_DIR)/target/aarch64-apple-ios/release”;
“LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=arm64]” = “ ( P R O J E C T D I R ) / t a r g e t / a a r c h 64 − a p p l e − i o s − s i m / r e l e a s e " ; " L I B R A R Y S E A R C H P A T H S [ s d k = i p h o n e s i m u l a t o r ∗ ] [ a r c h = x 8 6 6 4 ] " = " (PROJECT_DIR)/target/aarch64-apple-ios-sim/release"; "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=x86_64]" = " (PROJECTDIR)/target/aarch64appleiossim/release";"LIBRARYSEARCHPATHS[sdk=iphonesimulator][arch=x8664]"="(PROJECT_DIR)/target/x86_64-apple-ios/release”;
1.2.3
再次打开 Build Phases 选项卡,添加一个 Script,并移动到 Compile Sources 上方,可以命名为: Build Rust library :
bash ${PROJECT_DIR}/bin/compile-rust-lib.sh demo-library-ffi $RUSTBUILDCONF
第二个参数 RUSTBUILDCONF是传递给脚本的环境变量,我们先定义它们:
打开 Build Settings 选项卡,点击 + 添加 User-Defined Setting,为其命名 RUSTBUILDCONF 并根据构建变量选择一个值:Debug 中填写 DEBUG,Release 中填写 RELEASE。
1.2.4
构建脚本 bin/compile-rust-lib.sh
#!/usr/bin/env bash

if [ “$#” -ne 2 ]
then
echo “Usage (note: only call inside xcode!):”
echo “compile-rust-lib.sh <FFI_TARGET> ”
exit 1
fi

what to pass to cargo build -p, e.g. rust_lib_ffi

FFI_TARGET=$1

RUSTBUILDCONF from our xcconfigs

RUSTBUILDCONF=$2

RELFLAG=
if [[ “$RUSTBUILDCONF” != “DEBUG” ]]; then
RELFLAG=–release
fi

set -euvx

if [[ -n “${DEVELOPER_SDK_DIR:-}” ]]; then

Assume we’re in Xcode, which means we’re probably cross-compiling.

In this case, we need to add an extra library search path for build scripts and proc-macros,

which run on the host instead of the target.

(macOS Big Sur does not have linkable libraries in /usr/lib/.)

export LIBRARY_PATH=“ D E V E L O P E R S D K D I R / M a c O S X . s d k / u s r / l i b : {DEVELOPER_SDK_DIR}/MacOSX.sdk/usr/lib: DEVELOPERSDKDIR/MacOSX.sdk/usr/lib:{LIBRARY_PATH:-}”
fi

IS_SIMULATOR=0
if [ “${LLVM_TARGET_TRIPLE_SUFFIX-}” = “-simulator” ]; then
IS_SIMULATOR=1
fi

for arch in A R C H S ; d o c a s e " ARCHS; do case " ARCHS;docase"arch" in
x86_64)
if [ $IS_SIMULATOR -eq 0 ]; then
echo “Building for x86_64, but not a simulator build. What’s going on?” >&2
exit 2
fi

  # Intel iOS simulatorexport CFLAGS_x86_64_apple_ios="-target x86_64-apple-ios"$HOME/.cargo/bin/cargo build -p $FFI_TARGET --lib $RELFLAG --target x86_64-apple-ios;;arm64)if [ $IS_SIMULATOR -eq 0 ]; then# Hardware iOS targets$HOME/.cargo/bin/cargo build -p $FFI_TARGET --lib $RELFLAG --target aarch64-apple-ioselse$HOME/.cargo/bin/cargo build -p $FFI_TARGET --lib $RELFLAG --target aarch64-apple-ios-simfi

esac
done
二、问题调研

  1. Rust访问网络是否需要原生语言的干预?需支持协议如:gRPC/RESTful/WebSocket/UDP
    Rust 可以直接访问网络,并不需要原生语言的干预
  2. Rust与原生语言的协作方式,FFI/JNI or 其他?
    FFI
    cbindgen
    rsbind
  3. 如何接收Rust发起的回调?
    使用函数指针,可以参考这个人的代码:​https://github.com/thombles/dw2019rust/blob/master/modules/07%20-%20Swift%20callbacks.md
    或者使用 rsbind
  4. Rust是否可以直接访问本地(图片/文件)/沙箱文件?
    ​https://docs.rs/cacao/latest/cacao/index.html
  5. Rust是否可以直接访问本地数据库?本地支持哪些常用数据库并且Rust有相应的封装?
    可以直接使用 sqlite,如果要用 CoreData,需要通过 FFI
  6. 构建时各平台的构建步骤以及命令
    参考 1.2.4
    或者使用 rsbind
  7. Android/iOS端异常调用栈的分析方法,是否有工具/框架可以配合
  8. 打包后包大小的变化
    1.网络
    方案1: reqwest, 关闭bitcode的情况下,包增加7.6MB

2.数据库
方案1:rusqlite, 关闭bitcode的情况下,包增加3.6MB

相关文章:

iOS使用Rust调研

编辑已恢复 我们已与您断开连接。尝试重连时会保存您所做的变更。尝试重连 标题 1 已保存 Bin Song B 要发布此内容&#xff0c;请选择键盘上的 ⌘Enter。 发布 关闭 Rust技术空间 … 跨平台使用调研 iOS使用Rust调研 添加表情符号 添加标题图像 添加状态 一、iOS 项…...

抖音引流推广的几个方法,抖音全自动引流脚本软件详细使用教学

大家好我是你们的小编一辞脚本&#xff0c;今天给大家分享新的知识&#xff0c;很开心可以在CSDN平台分享知识给大家,很多伙伴看不到代码我先录制一下视频 在给大家做代码&#xff0c;给大家分享一下抖音引流脚本的知识和视频演示 不懂的小伙伴可以认真看一下&#xff0c;我们…...

k8s概念-DaemonSet

回到目录 参考链接https://v1-23.docs.kubernetes.io/zh/docs/concepts/workloads/controllers/daemonset/ DaemonSet 确保全部&#xff08;或者某些&#xff09;节点上运行一个 Pod 的副本 当节点加入到K8S集群中&#xff0c;pod会被&#xff08;DaemonSet&#xff09;调度到…...

Mac 终端快捷键设置:如何给 Mac 中的 Terminal 设置 Ctrl+Alt+T 快捷键快速启动

Mac 电脑中正常是没有直接打开终端命令行的快捷键指令的&#xff0c;但可以通过 commandspace 打开聚焦搜索&#xff0c;然后输入 ter 或者 terminal 全拼打开。但习惯了 linux 的同学会觉得这个操作很别扭。于是我们希望能通过键盘按键直接打开。 操作流程如下&#xff1a; 1…...

VR 变电站事故追忆反演——正泰电力携手图扑

VR(Virtual Reality&#xff0c;虚拟现实)技术作为近年来快速发展的一项新技术&#xff0c;具有广泛的应用前景&#xff0c;支持融合人工智能、机器学习、大数据等技术&#xff0c;实现更加智能化、个性化的应用。在电力能源领域&#xff0c;VR 技术在高性能计算机和专有设备支…...

fpga开发——蜂鸣器

蜂鸣器的原理 有源蜂鸣器和无源蜂鸣器 无源蜂鸣器利用电磁感应现象&#xff0c;为音圈接入交变电流后形成的电磁铁与永磁铁相吸或相斥而推动振膜发声&#xff0c;接入直流电只能持续推动振膜而无法产生声音&#xff0c;只能在接通或断开时产生声音。无源蜂鸣器的工作原理与扬声…...

【Liux下6818开发板(ARM)】触摸屏

(꒪ꇴ꒪ ),hello我是祐言博客主页&#xff1a;C语言基础,Linux基础,软件配置领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff01;送给读者的一句鸡汤&#x1f914;&#xff1a;集中起来的意志可以击穿顽石!作者水平很有限&#xff0c;如果发现错误&#x…...

苍穹外卖day11——数据统计图形报表(Apache ECharts)

效果展示 Apache ECharts 介绍 常见图表 入门案例 快速上手 - Handbook - Apache ECharts 营业额统计——需求分析与设计 产品原型 接口设计 VO设计 营业额统计——代码开发 Controller中 /*** 数据统计相关接口*/ RestController RequestMapping("/admin/report&qu…...

在制作PC端Game Launcher游戏启动器时涉及到的技术选型

1&#xff09;在制作PC端Game Launcher游戏启动器时涉及到的技术选型​ 2&#xff09;​如何将图片显示到Canvas的Raw Image上面 3&#xff09;Unity 2018.4.4f1退出重启后出现黑屏 4&#xff09;如何获取到GPU耗时 这是第346篇UWA技术知识分享的推送&#xff0c;精选了UWA社区…...

SQL力扣练习(九)

目录 1.订单最多的用户(586) 示例 1 解法一(limit) 解法二(dense_rank()) 2.体育馆的人流量 示例 1 解法一(临时表) 解法二&#xff08;三表法&#xff09; 1.订单最多的用户(586) 表: Orders --------------------------- | Column Name | Type | ---------…...

软考高级架构师笔记-10数学计算题

目录 1. 前文回顾 & 考情分析2. 最小生成树3. 最短路径4. 网络与最大流量5. 线性规划6. 动态规划/决策表7. 博弈论8. 状态转移矩阵9. 决策论10. 结语1. 前文回顾 & 考情分析 前文回顾: 软考高级架构师笔记-1计算机硬件软考高级架构师笔记-2计算机软件(操作系统)软考…...

设计模式五:建造者模式(Builder Pattern)

建造者模式(Builder Pattern)是一种创建型设计模式&#xff0c;用于通过一系列步骤来构建复杂对象。它将对象的构建过程与其表示分离&#xff0c;从而允许相同的构建过程可以创建不同的表示。 建造者模式中的几个角色&#xff1a; 产品(Product)&#xff1a;表示被构建的复杂…...

C++多线程编程(包含c++20内容)

C多线程编程(包含c20内容) 文章目录 C多线程编程(包含c20内容)线程通过函数指针创建线程通过函数对象创建线程通过lambda创建线程通过成员函数创建线程线程本地存储取消线程自动join线程从线程获得结果 原子操作库原子操作原子智能指针原子引用使用原子类型等待原子变量 互斥互…...

【C语言】通讯录2.0 (动态增长版)

前言 通讯录是一种记录联系人信息的工具&#xff0c;包括姓名、电话号码、电子邮件地址、住址等。 文章的一二三章均于上一篇相同&#xff0c;可以直接看第四章改造内容。 此通讯录是基于通讯录1.0&#xff08;静态版&#xff09;的基础上进行改进&#xff0c;请先看系列文字第…...

详解AMQP协议以及JAVA体系中的AMQP

目录 1.概述 1.1.简介 1.2.抽象模型 2.spring中的amqp 2.1.spring amqp 2.2.spring boot amqp 1.概述 1.1.简介 AMQP&#xff0c;Advanced Message Queuing Protocol&#xff0c;高级消息队列协议。 百度百科上的介绍&#xff1a; 一个提供统一消息服务的应用层标准高…...

跨境电商外贸常态下,深度分析Live Market的优势

据统计&#xff0c;今年上半年&#xff0c;面对复杂严峻的外部环境&#xff0c;我国外贸进出口规模在历史同期首次突破20万亿元&#xff0c;展现较强韧性。我国正处于大力支持跨境电商发展的时代节点。在此背景下,无数商家准备抓住时代机遇,将品牌影响力从国内延伸至全世界。同…...

vue2企业级项目(八)

vue2企业级项目&#xff08;八&#xff09; 组件封装&#xff08;二&#xff09; 4、searchForm 创建components/searchForm/index.js import XSearchForm from "./index.vue"; export default XSearchForm;使用案例 <template><div class"wrap"…...

小研究 - 主动式微服务细粒度弹性缩放算法研究(二)

微服务架构已成为云数据中心的基本服务架构。但目前关于微服务系统弹性缩放的研究大多是基于服务或实例级别的水平缩放&#xff0c;忽略了能够充分利用单台服务器资源的细粒度垂直缩放&#xff0c;从而导致资源浪费。为此&#xff0c;本文设计了主动式微服务细粒度弹性缩放算法…...

【雕爷学编程】Arduino动手做(177)---ESP-32 掌控板

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…...

使用Gunicorn+Nginx部署Flask项目

部署-开发机上的准备工作 确认项目没有bug。用pip freeze > requirements.txt将当前环境的包导出到requirements.txt文件中&#xff0c;方便部署的时候安装。将项目上传到服务器上的/srv目录下。这里以git为例。使用git比其他上传方式&#xff08;比如使用pycharm&#xff…...

内容做了一大堆,流量就是起不来?初创公司低成本获流的真实解法

内容做了一大堆&#xff0c;流量就是起不来&#xff1f;初创公司低成本获流的真实解法 我见过太多这样的团队&#xff1a;每周雷打不动三篇公众号&#xff0c;两条短视频&#xff0c;外加若干条推特&#xff0c;数据面板安安静静&#xff0c;后台没有咨询&#xff0c;评论区只…...

MobaXterm远程桌面实战:在Ubuntu上配置与连接RDP服务

1. 为什么选择MobaXterm连接Ubuntu远程桌面 作为一名常年和Linux服务器打交道的开发者&#xff0c;我深知纯命令行操作有时会遇到效率瓶颈。特别是当需要处理图形界面应用或者进行复杂配置时&#xff0c;SSH终端就显得力不从心了。这时候&#xff0c;RDP远程桌面协议就成了救命…...

从静态分析到代码自愈:构建自动化自我审查工具提升代码质量

1. 项目概述&#xff1a;从“自我审视”到“代码自愈”的工程实践在软件开发的日常中&#xff0c;我们常常会陷入一种“当局者迷”的困境&#xff1a;自己写的代码&#xff0c;怎么看都觉得逻辑清晰、结构完美&#xff0c;但一旦交给同事评审或者上线运行&#xff0c;各种潜在的…...

SpeexDSP音频处理库深度解析:3种核心算法实现与40%性能优化实战

SpeexDSP音频处理库深度解析&#xff1a;3种核心算法实现与40%性能优化实战 【免费下载链接】speexdsp Speex audio processing library - THIS IS A MIRROR, DEVELOPMENT HAPPENS AT https://gitlab.xiph.org/xiph/speexdsp 项目地址: https://gitcode.com/gh_mirrors/sp/sp…...

ACK多集群配置同步:MCP Server架构、部署与实战指南

1. 项目概述&#xff1a;ACK多集群管理平台的服务端核心如果你正在或计划使用阿里云容器服务ACK来管理多个Kubernetes集群&#xff0c;并且对如何高效、统一地分发应用配置感到头疼&#xff0c;那么你很可能已经接触或正在寻找类似“ack-mcp-server”这样的解决方案。这个项目&…...

Taotoken用量看板如何帮助开发者洞察API消费明细

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Taotoken用量看板如何帮助开发者洞察API消费明细 对于依赖大模型API进行开发的团队或个人而言&#xff0c;清晰、透明地掌握资源消…...

Midjourney波普艺术风格生成失效真相(92%用户踩中的5个prompt结构陷阱)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Midjourney波普艺术风格生成失效的底层归因 波普艺术&#xff08;Pop Art&#xff09;风格在 Midjourney 中曾可通过 --style raw 配合关键词如 Andy Warhol, Ben-Day dots, bold outline, flat color …...

国产 KVM 兼容痛点及全国产定制方案

作为标准 KVM、军工加固 KVM 产品经理&#xff0c;在一些项目落地过程中&#xff0c;我发现一个普遍问题&#xff1a;国产服务器、国产系统越来越普及&#xff0c;但市面上绝大多数 KVM 切换器&#xff0c;兼容性问题频发&#xff0c;已经成为运维短板。一、当前 KVM 最常见的兼…...

RocketMQ 5.1.1 Topic管理:从创建到删除,一份完整的mqadmin命令行实战手册

RocketMQ 5.1.1 Topic全生命周期管理实战指南 接手一个新的RocketMQ集群时&#xff0c;Topic管理往往是日常运维中最频繁的操作之一。不同于简单的命令堆砌&#xff0c;本文将带您深入理解Topic从创建到销毁的完整生命周期&#xff0c;通过真实生产环境中的典型场景&#xff0c…...

WeChatExporter完整指南:如何在macOS上免费备份微信聊天记录

WeChatExporter完整指南&#xff1a;如何在macOS上免费备份微信聊天记录 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 微信聊天记录中包含了我们珍贵的回忆、重要的工作…...