用 Swift 写 Android App ?来了解下 Skip 原生级跨平台框架

最近在找资料的时候,机缘巧合发现了一个有趣的商业跨平台框架 Skip ,刚好看到了它发布 1.0 正式版,主要作用是将 Swift 开发引入到 Android 领域,这样 App 就可以共享 Swift 的业务逻辑,在 SwiftUI 中完成 Android App,用 Skip 的话说就是:

Skip brings Swift app development to Android. Share Swift business logic, or write entire cross-platform apps in SwiftUI.”

至于为什么说是原生级?稍微了解之后,我发现它的理念和思路有点意思,或者说类似的路子国内也有,例如曾经写过的 《uni-app-x 了解过吗?》 ,从思路上看它们都是走的「转译」的路线,当然这个路线成本不低,比如在 uni-app-x 文章的评论区,就有大哥有比较深的感悟:

当然,Skip 和 uni-app-x 比较大的区别在于:它是直接通过 Swift / SwiftUI 去转移为 Kotlin / Compose,所以在语法和兼容成本会更低一点点,因为它只需要实现 Android 平台的转移,iOS 平台本身就是 Native 。

另外,Skip 的可脱离性质才是我觉得最有意思的,这个我们后续会讲到。

至于为什么会想到用 Swift 来做跨平台?因为在 Skip 的产品理念里,移动应用基本是 iOS 先行,而后才考虑 Android,所以用 Swift 做跨平台是它们的最佳实践:

In our experience, however, apps are generally made for iOS first. Clients ask for an iOS app, then expect a port to the Play Store. Large tech companies design for iOS first, then adapt their designs for Android.

当然,作为商业框架, Skip 的目标其实就是在 Xcode 中用 Swift / SwiftUI 写完代码后,可以通过 Xcode 插件自动处理生产 Android 版本。

当然理想和现实还是有一些区别,毕竟语法特效和平台 API 差异注定在「转译」时需要做阉割。

回到 Skip 的实现,在 Skip Engine 内部,它底层采用的是原生平台的框架实现:iOS 上 Swift / SwiftUI,Android 上 Kotlin / Compose,也就是纯纯原生,没有桥接和第三方运行时,事实上 Skip 在 iOS 上会直接调用 Swift 或 Objective C API,在 Android 上直接调用 Kotlin 或 Java API ,所以其实它在 Android 上等于是一个「转译」框架

所以从运行上看,他们都是原生级别的 App ,因为跨平台能力是在编译期处理完成,这点和 uni-app-x 一样。

Skip 的核心是它的 Swift to Kotlin 转译器,转译器使用了 Apple 的 SwiftSyntax 来解析 Swift 源码,然后将代码转换为可读的 Kotlin ,甚至连注释也会一同转换,而类似 SwiftUI 和 Compose 都是响应式的 UI 开发模式,所以从「转译」的适配角度而言,确实也合适。

其实这个框架的思路,大概也是 KMP / Compose 兼容鸿蒙比较低成本的方向,ArkUI 本身也是响应式构建树,这一方面的可行成本会比较可控,目前我知道已经有一些企业,内部完成了 KMP / Compose 适配到鸿蒙的支持,当然他们用的是更底层的兼容方式,但是这个「转译」其实也算是一个不错的思路,相对成本会更低一些,当然古老的 XML 模式是不用想了,成本太高。

如果鸿蒙的 API 能稳定不再 break 的情况下。

回到 Skip ,在 Skip 内部 Swift 字符串编译后会变为 Kotlin 字符串, Swift 的 class 、structs、enums 和 protocols 会转换为 Kotlin 上对一个的类、枚举和接口,甚至闭包和异步调用也可以兼容。

这意味着,Skip 在和 Android 原生 API 交互时,无论是平台库、第三方库,其实都可以直接调用对应 API,然后提供回调,并来回传递数据,这个过程其实并不需要复杂的桥接,因为本质就是 Kotlin 调用 kt/java 接口。

甚至 Skip 提供了一些简单的实现,可以将 Compose UI 代码嵌入到 SwiftUI ,反之也可以:

VStack {Text("Hello from SwiftUI")#if SKIPComposeView { _ inandroidx.compose.material3.Text("Hello from Compose")}#endif
}
#if SKIP
ComposeView { context in androidx.compose.foundation.layout.Column(modifier: context.modifier) {Text("Hello from SwiftUI").Compose(context: context.content())androidx.compose.material3.Text("Hello from Compose")}
}
#endif

另外,Skip 提供 Transpilation 用于查看和理解 Skip 的「转译」输出,因为 Skip 「转译」后的 Kotlin 是完全可读的并且可调试的状态,也就是对于 Android 的问题,可以直接在 Android Studio 中运行 Skip Android 应用,并使用 AS 的调试工具进行调试输出。

甚至 Skip 还支持从 Xcode 构建错误消息跳转到 Kotlin 文件,当 Kotlin 编译器输出错误消息时,Skip 的 Xcode 插件会在 Swift 和 Kotlin 源文件中显示为 Xcode 构建错误,点击 Kotlin 文件的构建错误将跳转到有问题的 Kotlin 代码。

从这一点看, Skip 更像是将一个 Swift 项目无缝编译为独立可运行的 Android 项目,也就是当你不想使用 Skip 的时候,你依旧存有 iOS 和 Android 版本的完整源代码可以独立开发,Skip 除了用于在 Android 上提供 Foundation、SwiftUI 等 API 的库外,没有任何必需的运行时组件,也就是当你不想用 Skip 的时候,其实可以相对低成本转化为纯原生开发。

类似思路,如果放到鸿蒙 Next 上呢?如果一个项目编译后,可以直接生成另外一个具有可读性的代码工程,那么是否鸿蒙上也可以通过这种方式,来转化和提升社区的原生开发

当然,Skip 的这条路肯定也存在很多问题,就像前面说的 uni-app-x 一样,这条路必须存在一定程度的妥协,例如:

  • 并不支持完整的语言,阉割是必须的,为了支持 Kotlin 和 Compose ,API 必然需要为了转译器而做删减
  • Skip 转译器不能执行 Swift 类型推理以及完整的 Swift 编译器
  • 语言差异:例如 Swift 和 Kotlin 处理泛型方式不同,又或者 Kotlin 缺乏 static protocol 要求

另外除了转译器,Skip 还附带了一个 Swift Package Manager (SwiftPM) 到 Android Gradle 项目转换器,Skip 将这些工具捆绑在一起,形成一个 Xcode 构建插件,在 Skip 工具链称为 SkipStone,这一步也帮助完成 Android 端最后打包构建的转换处理。

最后,因为 Swift 的 App 依赖于 Swift 标准库、Foundation 、 SwiftUI 等基础能力库,所以 Skip 开源库提供了 iOS 的 Swift、Foundation、Observation、SwiftUI 等库在 Android 的特定实现, 如 URLSessionJSONDecoder ,还有 UI 组件如 NavigationStack 等,Skip 甚至会将 XCTest 单元测试转译为 JUnit 进行测试运行,这一套在 Skip 统称为 SkipStack

这也算是第一套 iOS 端反卷 Android 的完整跨平台框架,其实这种直接让原生开发支持到另外一端的做法,我个人觉得其实会更受原生开发接受,因为:

  • 对比 uni-app、RN、Flutter 需要再学一种语言的场景,它体验更轻
  • 对于 Compose MultiPlatform 的场景,它的框架脱离和可独立又更具优势,比如 Kotlin Native 更轻

那么 Skip 有什么问题呢?目前来看Skip 对于国内最大的劣势,就是他是商业框架,有一定程度收费,在 Skip 里 SkipStone 是需要 licensekeys,只有 SkipStack 是免费和开源。

image-20240816175133807

所以我笃定它只能小范围商业合作的流行,但是它的思路还是挺不错的,工程级别的转译需要很大工作量,但是也能让转译后的工程具备独立性,这样为后期可能的独立开发做了很好的基础。

例如原先项目只需要 iOS 开发参与,纯 Native 的 iOS 项目在试水可行之后,通过 Skip 产出的 Android 项目需要进一步开发时,可以直接在已有的工程直接进行 Native 改造,这确实是一个不错的方向。

当然,如果能有类似 Skip 这样完善的框架且完全开源的,并且还适配鸿蒙,或者会是不错的开源方向,或者需要有大厂愿意尝试走通并开源出来共建,大概会比 uni-app-x 具有更大的可能。

参考链接:https://skip.tools/blog/skip-1_0-release/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/53986.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python | Leetcode Python题解之第395题至少有K个重复字符的最长子串

题目: 题解: class Solution:def longestSubstring(self, s1: str, k: int) -> int:if k 1: return len(s1)n len(s1)res 0for c in range(1, len(set(s1)) 1):# 滑窗中字母种类个数恰好为 cfreq Counter()l cnt tcnt 0 for r, ch in enu…

代码随想录训练营Day3 | 链表理论基础 | 203.移除链表元素 | 707.设计链表 | 206.反转链表

今天任务:学习链表理论基础 链表的类型 链表的存储方式 链表的定义…

开发一款通过蓝牙连接控制水电表的微信小程序

增强软硬件交互 为了更好的解决师生生活中的实际问题,开发蓝牙小程序加强了和校区硬件的交互。 比如通过蓝牙连接控制水电表,减少实体卡片的使用。添加人脸活体检测功能,提高本人认证效率,减少师生等待时间。 蓝牙水电控展示 蓝…

HashMap常用方法及底层原理

目录 一、什么是HashMap二、HashMap的链表与红黑树1、数据结构2、链表转为红黑树3、红黑树退化为链表 三、存储(put)操作四、读取(get)操作五、扩容(resize)操作六、HashMap的线程安全与顺序1、线程安全2、…

【LeetCode每日一题】2024年9月第二周(上)

2024.9.9 中等 难度评分 1333 链接:2181. 合并零之间的节点 (1)题目描述: (2)示例 (3)分析 整体来说,描述还算清晰的题目,找到0节点所框定的区域&#xff0c…

Pandas读取某列、某行数据——loc、iloc区别

loc:通过行、列的名称或标签来索引 iloc:通过行、列的索引位置来寻找数据 首先,我们先创建一个DataFrame生成数据 import pandas as pddata {a:[1,2,3,4,5],b:[6,7,8,9,10],c:[11,12,13,14,15] } data pd.DataFrame(data) print(data) 运行…

工具、环境等其他小问题归纳

此篇文章内容会不定期更新,仅作为学习过程中的笔记记录 一、查询Windows 10环境下python版本与安装路径 若电脑成功安装了python环境,不小心忘了版本。 I、查询版本 1、cmd窗口快捷查询 Win R 输入cmd 进入窗口; 直接输入 python --version …

[数据集][目标检测]血细胞检测数据集VOC+YOLO格式2757张4类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2757 标注数量(xml文件个数):2757 标注数量(txt文件个数):2757 标注…

关于武汉芯景科技有限公司的IIC电平转换芯片XJ9517开发指南(兼容PCF9517)

一、芯片引脚介绍 1.芯片引脚 2.引脚描述 二、系统结构图 三、功能描述 1.电平转换 2.芯片使能/失能 EN 引脚为高电平有效,内部上拉至 VCC(B),允许用户选择中继器何时有效。这可用于在上电时隔离行为不良的从机,直到…

4052A/4052B/4052C/4052D/4052E/4052F/4052G /4052H信号/频谱分析仪

4052A/4052B/4052C/4052D/4052E/4052F/4052G /4052H信号/频谱分析仪 苏州新利通 Ceyear 4052具备出色的测试动态范围、相位噪声、幅度精度和测试速度,具备频谱分析、I/Q分析、实时频谱分析、瞬态分析、矢量信号分析、脉冲分析、音频分析等丰富的测试功能。 Ceyear…

OpenAI发布o1预览模型:推理能力更强可达理科博士生水准

近日OpenAI宣布推出了新一代 AI 模型系列 OpenAI o1,按照官方技术博客说法,o1 在推理能力上代表了人工智能最强的水平。 那究竟是怎么一回事呢? OpenAI CEO Sam Altman 表示:o1 系列的推出代表了 AI 能力的新起点,能…

240909-ChuanhuChatGPT集成Ollama的环境配置

A. 最终效果 B. 需求文件 requirements.txt (至少需要安装这个,具体参见官网)requirements_advanced.txt (如果安装了Ollama,并且可以进行对话,可以不需要安装,具体参见官网)requirements_succcess.txt&am…

gin配置swagger文档

一、基本准备工作 1、安装依赖包 go get -u github.com/swaggo/swag/cmd/swag go get -u github.com/swaggo/gin-swagger go get -u github.com/swaggo/files2、在根目录上配置swagger的路由文件 //2.初始化路由router : initialize.Routers()// 配置swaggerdocs.SwaggerInfo…

微服务杂谈

几个概念 还是第一次听说Spring Cloud Alibaba ,真是孤陋寡闻了,以前只知道 SpringCloud 是为了搭建微服务的,spring boot 则是快速创建一个项目,也可以是一个微服务 。那么SpringCloud 和 Spring boot 有什么区别呢?S…

Unity for Android使用蓝牙低功耗Bluetooth LE

Unity2021.3.35f1 插件&#xff1a;Bluetooth LE for iOS and Android v2.3.unitypackage 1、将插件资源包导入unity中 2.修改插件中的AndroidManifest文件 <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schem…

系统优化工具 | PC Cleaner v9.7.0.3 绿色版

PC Cleaner是一款功能强大的电脑清理和优化工具&#xff0c;旨在通过清理系统垃圾文件、解除恶意软件和优化系统性能来提高计算机的运行效率。该软件提供了多种功能&#xff0c;可以帮助用户维护和提升计算机的整体表现。 PC Cleaner 支持 Windows 7 及以上操作系统&#xff0…

Qt使用绿色pdf阅读器打开文件

1.下载SumatraPDF 2.设置 3.代码 void MainWindow::on_pushButton_clicked() {QProcess *process new QProcess();QString filePath "C:\\Users\\jude\\Desktop\\su\\11.pdf";QString sumatraPath "C:\\Users\\jude\\Desktop\\su\\SumatraPDF-3.5.2-64.exe&q…

电瓶车火灾频发背后的隐忧

近年来&#xff0c;电瓶车火灾事件频发&#xff0c;不仅严重威胁着人民群众的生命财产安全&#xff0c;也给社会带来了极大的安全隐患。从城市街道到居民小区&#xff0c;电瓶车火灾的阴影无处不在&#xff0c;如何有效防范与自救成为了全社会关注的焦点。 一、电瓶车火灾频发…

linux_L1_linux重启服务器

使用putty登录到linux服务器切换到管理员账号 sudo -s重启命令 reboot

钾盐矿开采与加工过程中的机电设备选型及管理指南

创作不易&#xff0c;您的打赏、关注、点赞、收藏和转发是我坚持下去的动力&#xff01; 在钾盐矿的开采和加工过程中&#xff0c;需要使用多种机电设备以确保生产的顺利进行。这些设备主要用于矿石开采、破碎、运输、选矿以及矿物产品的深加工等过程。以下是钾盐矿常用的一些机…