跳转到内容
Skip 中文站
3.2k

常见问题

Skip 是一个 Xcode 插件,可以将你的 Swift 和 SwiftUI 构建为 Android 应用。Skip 构建流程使你能够使用单一统一代码库持续迭代 iOS 和 Android 应用,同时可以随意混入任意数量的平台特定代码。要了解更多信息,请从文档开始。

Skip 与 Flutter、React Native、Xamarin 和 Cordova 等框架相比如何?

Section titled “Skip 与 Flutter、React Native、Xamarin 和 Cordova 等框架相比如何?”

Skip 专注于两大主流移动平台——iOS 和 Android 的真正原生应用开发。各框架之间的对比表请参见 Skip 对比矩阵。

Swift 是 iOS 设备(包括 iPhone 和 iPad)应用开发的官方推荐语言。Swift 与 Objective-C(iOS 开发的遗留语言)无缝集成。有关 Swift 的信息,请参见 https://developer.apple.com/swift/ ↗。

根据 developer.apple.com ↗ 的介绍,SwiftUI “提供了一种现代的、跨平台的方式来构建你的 UI 和应用基础设施。使用 SwiftUI,你可以以编程方式指定界面,并让系统动态地显示和更新该界面”。自 2019 年推出以来,SwiftUI 已可用于构建 iPhone、iPad、tvOS、watchOS、visionOS 及其他操作系统的应用,并已成为创建 iPhone 和 iPad 新应用的推荐方式。Skip 通过 SkipStone 插件和 SkipUI 兼容框架 将 SwiftUI 带到了 Android 平台。

Kotlin 是 Android 设备应用开发的官方推荐语言。Kotlin 与 Java(Android 开发的遗留语言)无缝集成。有关 Kotlin 和 Android 的信息,请参见 https://developer.android.com/kotlin/ ↗。

根据 developer.android.com ↗ 的介绍:“Jetpack Compose 是 Android 推荐的用于构建原生 UI 的现代工具包。” Jetpack Compose 于 2019 年推出,提供了声明式的 Kotlin API,用于跨平台的用户界面。

什么是”原生”模式和”转译”模式?

Section titled “什么是”原生”模式和”转译”模式?”

Skip 支持在 Android 上编译原生 Swift,也支持将 Swift 转译为 Kotlin。请在文档中了解 Skip 的模式。

转译被定义为在大约相同抽象级别上运行的编程语言之间的转换。SkipStone 插件同时具有原生模式和转译模式,但即使是原生模式的应用也需要一些 Kotlin 代码生成来与 Android 系统交互。除了生成 Kotlin 和 Compose 代码外,SkipStone 插件还将你应用的 Swift Package Manager 项目转译为可构建的 Gradle 项目,并将你 iOS 应用的元数据转译为 Android 元数据。这一切都由 Xcode 自动完成,结果是你可以构建、测试和运行你的 Swift 应用,同时转译后的等效应用也会被构建、测试并并行运行。

Skip 提供了多种机制来与 Kotlin 集成,但你不需要了解任何 Kotlin 就能使用 Skip 构建应用。不过在使用 Skip 开发的过程中,你可能会学到一些 Kotlin——特别是在集成 Android 特定功能时。

macOS 15(ARM 或 Intel)搭配 Xcode 16.4 或更高版本。构建和测试 Android 项目需要额外的软件。请参见 Skip 的安装说明。

Skip 能在 Linux 或 Windows 上运行吗?

Section titled “Skip 能在 Linux 或 Windows 上运行吗?”

Skip 确实对 Linux(以及通过 WSL 的 Windows)提供了有限的支持。skip 工具本身可以通过 Homebrew 安装(参见入门指南),skip 可用于创建项目、构建框架、在 CI 中运行,以及作为 skip android [build|test|sdk|emulator] 的前端。但是,由于依赖 macOS 附带的 SwiftUI 和 Xcode 工具链,它目前还不能用于构建完整的应用。我们正在考虑未来扩展 Skip 在 Linux 和 Windows 上的实用性。

Skip 哪些部分是免费的,哪些部分是商业的?

Section titled “Skip 哪些部分是免费的,哪些部分是商业的?”

以前,Skip 需要许可证密钥才能进行非商业应用开发。现在不同了:Skip 现在完全免费且开源,但请考虑支持该项目。

访问管理你的赞助页面来更新你的付款信息、查看过去的发票、更改你的赞助等级或取消赞助。个人赞助通过 GitHub Sponsors 管理,企业赞助等级通过 Stripe 账单门户管理。

框架开发推荐使用哪种 FOSS 许可证?

Section titled “框架开发推荐使用哪种 FOSS 许可证?”

所有 Skip 库的标准许可证是 Mozilla Public License 2.0 (MPL-2.0) ↗。MPL 提供了灵活性和自由的良好平衡:MPL 授权的库可以嵌入到闭源商业应用中,且许可证的文件级 copyleft 对开发者来说很容易遵守。

Skip 应用能在 Apple App Store 和 Google Play Store 上发布吗?

Section titled “Skip 应用能在 Apple App Store 和 Google Play Store 上发布吗?”

可以。使用 Skip 构建的应用利用了平台厂商推荐的 UI 工具包,因此遵循这两个平台各自独特的指南和原则。在 iOS 端,Skip 核心框架模块可以从构建中完全移除(使用 SkipZero),从而生成一个完全没有任何 Skip 库痕迹的应用提交。

一个在 Apple App Store 和 Google Play Store 上发布的应用示例是 Skip Showcase 应用。

真正的原生(Genuinely Native)意味着什么?

Section titled “真正的原生(Genuinely Native)意味着什么?”

Skip 应用是真正的原生应用,因为它们直接使用厂商推荐的 UI 工具包,从而保证了最大的兼容性、可访问性和性能。它们在 iPhone 上直接使用 SwiftUI(“SwiftUI 是首选的应用构建技术,因为它提供了一种现代的、跨平台的方式来构建你的 UI 和应用基础设施。“——developer.apple.com ↗),在 Android 上使用 Compose(“如果你想构建一个新应用,我们推荐使用 Jetpack Compose”——android-developers.googleblog.com ↗)。

当 Skip 应用仅依赖 Skip 核心框架模块(SkipUnit、SkipLib、SkipFoundation、SkipModel 和 SkipUI)时,这些库可以从应用构建中完全排除。这意味着你可以发布一个 Skip 应用到 Android 和 iOS,而 iOS 端将完全没有任何 Skip 的痕迹。其中一个好处是,你的应用分发体积可以非常小(例如,HelloSkip.ipa 示例不到 25KB)。这也使 Skip 很容易从你的 iOS 项目中”弹出”,你可以随时放弃 Skip 工具,继续拥有一个功能完整的 iOS 项目。

Skip 是云服务吗?你们会把我的代码上传到你们的服务器吗?

Section titled “Skip 是云服务吗?你们会把我的代码上传到你们的服务器吗?”

不是,都不是。Skip 构建插件作为 Xcode 构建过程的一部分在本地 macOS 机器上运行。插件使用标准的 Xcode 插件沙箱机制来阻止网络访问和文件系统访问。你的 Swift 代码和任何生成的代码都不会离开你的机器。唯一的网络需求是解析项目的外部依赖,无论是 SwiftPM 端的 Swift 依赖,还是 Gradle 端的 Kotlin 依赖。

skipstone 构建插件以二进制可执行工件的形式分发,并由托管在 https://github.com/skiptools/skip.git ↗ 的 Skip 插件驱动。此外,必须使用 Homebrew ↗ 命令安装 skip 命令行工具:brew install skip。这将安装 skip 工具,可用于创建项目和运行测试,以及本地 Android 测试所需的先决条件:gradle、openjdk、android-platform-tools 和 android-commandlinetools。

Skip 或任何 Skip 框架是否会收集用户跟踪数据?

Section titled “Skip 或任何 Skip 框架是否会收集用户跟踪数据?”

Skip 插件不收集任何数据、不执行任何遥测,也不会”向总部报告”,除非明确要求(例如,运行 skip upgrade 命令检查 Skip 的最新版本)。Skip 框架都是免费开源的(因此可以被外部审计),也不会收集任何遥测数据或以任何方式跟踪用户。我们提供此通知以帮助你填写 Apple 的 App 隐私详情 ↗ 并遵守 Google 的用户数据 ↗ 政策。

请注意,使用 Homebrew 安装 skip 时,他们可能会使用遥测来报告安装事件。请参阅 Homebrew 分析 ↗ 文档了解他们的解释以及如何禁用它的详细信息。

Skip 与低代码或无代码应用构建技术相比如何?

Section titled “Skip 与低代码或无代码应用构建技术相比如何?”

Skip 与无代码/低代码产品正好相反。Skip 拥抱了声明式用户界面这一主流的新兴 UI 范式,使用与平台原生组件相同的语言编写。这意味着 SwiftUI 使用 Swift,Compose 使用 Kotlin。

不使用,Skip 是一个纯离线工具,行为可预测。

不过,AI 工具在生成 Swift 和 SwiftUI 代码方面非常有用,特别是在开始 iOS 应用的框架设计时。这些代码通常与 SkipUI 和其他 Skip 库兼容,这可以帮助快速启动双平台应用。

是否有用于 Skip 开发的 AI Agent 技能?

Section titled “是否有用于 Skip 开发的 AI Agent 技能?”

有。Skip 团队在 github.com/skiptools/skills ↗ 维护了一个官方的 Agent 技能集合。这些是纯 Markdown 的 SKILL.md 文件,Agent(如 Claude Code ↗、Cursor 或任何支持基于文件上下文的 Agent)可以按需加载以获取 Skip 特定的指导。

这些技能分为两个插件:

  • skip-app-design — 搭建新项目(skip init)、构建转译为 Compose 的 SwiftUI 视图、导航 Skip Lite 的转译规则和 Skip Fuse 的桥接模型、添加可选框架(SkipSQL、SkipFirebase 等)、Material Symbols .symbolset 工作流实现双平台图标渲染,以及通过 Localizable.xcstrings 和 fastlane 店面元数据进行应用翻译。
  • skip-testing-deployment — 使用 swift test、skip test 和 skip android test 运行测试,通过 skip app launch 和 Maestro ↗ 流程同时驱动两个模拟器上的运行应用,以及使用 skip export 和 skip verify 进行导出、签名和发布。

要在 Claude Code ↗ 中安装:

/plugin marketplace add skiptools/skills
/plugin install skip-app-design
/plugin install skip-testing-deployment

对于 Cursor 和其他 Agent,请参见仓库 README ↗ 了解等效设置。该仓库还包含一个完整的示例,演示如何使用这些技能端到端地构建一个小型 TODO 应用。

Skip 应用的最低 iOS 版本是多少?

Section titled “Skip 应用的最低 iOS 版本是多少?”

iOS 16+。根据 developer.apple.com ↗,绝大多数活跃设备运行的是 iOS 16 或更高版本。

Skip 应用的最低 Android 版本是多少?

Section titled “Skip 应用的最低 Android 版本是多少?”

Skip 目标为 Android API 级别 34,这是向 Play Store ↗ 提交新应用所需的最低级别。最低支持的版本是 API 级别 28(Android 9 “Pie”),根据 Android Studio 的设备覆盖范围估计,覆盖了超过 95% 的活跃 Android 设备。

对于使用 SkipZero 的 iOS 应用,最小的 app.ipa 大小约为 50KB。对于 Android 应用,约为 5MB。这种差异主要是因为 Android 应用需要将 Jetpack Compose 库与应用本身一起打包,而 SwiftUI 已包含在 iOS 中。

为什么我的应用第一次构建这么慢?

Section titled “为什么我的应用第一次构建这么慢?”

Skip 库通过 SwiftPM 以源代码形式分发,这意味着你的第一次构建也包含了构建 Skip 本身的部分。此外,第一次构建生成的 Gradle 项目以在 Android 上测试和运行时,Gradle 构建系统需要下载所有依赖 jar 和构建工具。这可能导致应用的初始构建下载大量依赖。仅 Compose 依赖就会为 Gradle 缓存文件夹增加约 1GB 的大小,可以通过 du -skh ~/.gradle 查看。但一旦下载并缓存了项目的依赖,未来的构建就不需要再次获取它们。

Skip 本身是一个本地安装的 Xcode 插件,不会与网络通信,适合离线使用。但是,你的应用依赖需要被解析和缓存,才能构建、测试或运行你的应用。这意味着如果你添加了任何新依赖,无论是 Swift 端的 Package.swift 中的依赖,还是 Kotlin 端的 build.gradle.kts 中的依赖(通过模块的 Skip/skip.yml 文件配置),你都需要至少执行一次构建来解析和下载依赖。

Skip 利用 Swift Package Manager 对模块间依赖的支持,包括本地和外部 git 仓库。Skip 的插件会针对项目的每个传递依赖单独运行,生成的 Gradle 项目将镜像这些依赖。这产生了一个高度模块化的系统,大型代码库可以分布在多个模块中,每个模块都有自己的文档、测试用例和持续集成工作流。

什么是 parity testing(对等测试)?

Section titled “什么是 parity testing(对等测试)?”

Skip 鼓励对大型代码库进行模块化,每个模块都有自己的测试目标。命令 skip test 可以在包含 Skip 测试的项目中运行,它将同时运行 Swift XCTest 用例和生成的 Kotlin JUnit 用例,然后该工具将输出一个 Markdown 表格,汇总每个平台的测试结果。

Skip 核心框架模块(也称为 “Skip Stack”)是核心兼容模块,将标准 iOS 框架透明地桥接到 Kotlin、Java 和 Android 的等效实现。在转译的 Skip Lite 模块中,当导入等效框架时,它们会被隐式导入。

Skip 核心框架是 Skip 库生态系统其余部分所基于的基本构建块。

我可以预览 Skip 转译模式生成的 Kotlin 代码吗?

Section titled “我可以预览 Skip 转译模式生成的 Kotlin 代码吗?”

有关 Swift 到 Kotlin 转译的示例,请参见转译参考中的示例。在开发时使用 Skip,你可以随时访问它生成的转译 Kotlin。

SkipUI 在 Compose 端增加了多少运行时开销?

Section titled “SkipUI 在 Compose 端增加了多少运行时开销?”

SkipUI 视图是其 Compose 等效组件的轻量封装。例如,Divider.swift ↗ 直接映射到 androidx.compose.material3.Divider。Skip 的 @Environment 和 @State 支持增加了少量的记录开销,但在实践中这种开销是感知不到的。

为什么我的 Android 应用感觉很慢?

Section titled “为什么我的 Android 应用感觉很慢?”

Android 设备上 Debug 和 Release 构建性能之间通常存在显著差异。在评估真实性能时,始终使用 Release 构建。

Skip 应用可以使用哪些纯 Swift 库?

Section titled “Skip 应用可以使用哪些纯 Swift 库?”

Skip 使用 Swift Package Manager 处理源代码依赖解析。Swift Package Index ↗ 网站跟踪了数千个为 Android 编译的 Swift 包,这些包可用于使用 Skip 原生模式的应用。如果依赖模块有 Skip/skip.yml 文件且不是原生模式,它将被转译为 Kotlin。你还可以通过 #if os(Android) 块或自定义 Kotlin 文件提供 Android 回退来使用仅限 iOS 的 Swift 库(示例请参见 LottieMotionView 实现)。Skip 的框架体系预计能提供现代应用常用的大多数功能,但你可以自由开发自己的库和框架,可以从头开始,也可以通过 fork 现有仓库来为库添加 Skip 支持。

Swift 依赖通过编辑 Package.swift 将依赖包添加到 dependencies 数组来添加。Kotlin 和 Java 依赖通过编辑模块的 Skip/skip.yml 文件来添加。详情请参见依赖文档。

如何更改应用或模块的 Java/Kotlin 包名?

Section titled “如何更改应用或模块的 Java/Kotlin 包名?”

可以通过在模块的 Skip/skip.yml 文件中的 skip 组下添加 package: 'my.module.name' 属性来自定义 Java/Kotlin 包名。详情请参见自定义模块包名文档以及顶级应用模块的重要说明。

Skip 支持 OSLog 模块,因此应用可以使用 Logger 实例进行日志记录,这将把日志消息输出到 Xcode 控制台的 iOS 端。对于 Android 端,日志消息会传递给 android.util.Log,可以在 Android Studio 的 Logcat 标签页中查看,或者通过终端运行 adb logcat 查看。请注意,print() 写入的是 stdout 而不是 Logcat,所以在 Android 上请使用 OSLog.Logger 进行日志记录。

SkipFoundation 框架实现了 Bundle.module 函数,用于访问存储在标准 SwiftPM 位置 Sources/ModuleName/Resources/ 中的资源。这些资源会自动打包到 Gradle 项目中,并嵌入到生成的 .apk 工件中。请注意,与 Darwin 平台上的 Foundation 不同,Android 应用的应用存档不会在磁盘上展开,而是只能通过流接口访问。SkipFoundation 会透明地为你处理这些,所以你可以用 try Data(contentsOfURL Bundle.module.url(forResource: "SomeResource", withExtension: "ext")) 加载资源。但是,你不能像 iOS 那样对资源 URL 进行随机访问。这意味着嵌入的资源(如 .sqlite 数据库)需要先手动提取到应用的存储文件夹,然后才能访问。

Skip 支持标准的 Localizable.xcstrings ↗ 翻译源文件。这些文件由 Xcode 15 自动更新,包含应用中任何与本地化相关的字符串。

这使你可以拥有一个同时被 iOS 和 Android 应用使用的单一翻译文件,这样你的 SwiftUI Text("Hello!") 就可以显示为法语的 “Bonjour!”。

如何在 Skip 应用中使用 SQLite 数据库?

Section titled “如何在 Skip 应用中使用 SQLite 数据库?”

我们有一个 SkipSQL 框架,提供对 iOS 和 Android 上系统安装的 SQLite3 库的底层访问。

如何在 Skip 应用中使用 Firebase 数据库?

Section titled “如何在 Skip 应用中使用 Firebase 数据库?”

Skip 有一个 SkipFirebase 框架模块,提供与官方 Firebase iOS 和 Android SDK 的集成。目前 Firestore 集成最为完整。

我能在应用中显示 Lottie 动画吗?

Section titled “我能在应用中显示 Lottie 动画吗?”

我们有一个 SkipMotion 框架和一个 Lottie Demo 应用可用。

你可以使用标准的 UIApplication API 在 iOS 和 Android 上打开应用的系统设置页面:

await UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!)

在 iOS 上,这会打开设置应用并跳转到你的应用条目;在 Android 上,它会打开系统应用信息界面,用户可以在那里管理你的应用的权限、通知、存储和其他设置。详情请参见常见问题。

如何更改主屏幕上显示的应用名称?

Section titled “如何更改主屏幕上显示的应用名称?”

对于 iOS 端,你可以编辑 Darwin/AppName.xcconfig 并设置:

INFOPLIST_KEY_CFBundleDisplayName = App Name

对于 Android 端,你可以编辑 Android/app/src/main/AndroidManifest.xml 并设置 android:label 属性:

<application android:label="App Name" …

Skip 是否会传输应用的元数据、图标和权限?

Section titled “Skip 是否会传输应用的元数据、图标和权限?”

Skip 目前只处理必需的 AndroidMetadata.xml 的生成,该文件会从项目的 Skip.env 文件中填充元素,如 PRODUCT_NAME、BUNDLE_IDENTIFIER 和 MARKETING_VERSION。Android 应用的其他方面(如图标)必须手动为应用定制,可以使用 Android Studio 或在 Gradle 项目中手动操作。

Skip 如何在 Android 模拟器中启动我的应用?

Section titled “Skip 如何在 Android 模拟器中启动我的应用?”

启用 Skip 的应用项目会生成一个 .xcodeproj,其中包含一个嵌入脚本,作为运行应用目标构建的副作用,该脚本会使用 gradle 命令组装并启动应用。应用将针对找到的第一个已连接的 Android 模拟器或设备启动。要自定义使用哪个模拟器,可以将 ANDROID_SERIAL 环境变量设置为 Android 设备的标识符,可以通过终端命令 adb devices 查看。

如何只启动 iOS 应用而不启动 Android 应用?

Section titled “如何只启动 iOS 应用而不启动 Android 应用?”

默认情况下,每当你从 Xcode 运行 iOS 应用时,Skip 也会构建并运行 Android 应用。但有时你可能只想运行 iOS 端,例如调试 iOS 特定问题时。为此,请按照构建和运行文档中的这些说明操作。

启用 Skip 的项目有一个 XCSkipTests.swift 测试用例,它是作为 skip init 命令的一部分生成的(参见入门指南)。这个测试用例将使用 SkipDrive 模块在生成的项目上启动 gradle test 命令。然后它会解释测试结果并将任何失败转换回 XCTest 失败,包括将 JUnit 测试的行号映射回原始 Swift。这将导致测试失败在 Xcode 中出现两次:一次是 Swift XCTest 失败,一次是 Kotlin JUnit 失败。

如何在 Android 模拟器或设备上运行单元测试?

Section titled “如何在 Android 模拟器或设备上运行单元测试?”

默认情况下,你翻译的 XCTest 用例会作为 Kotlin JUnit 4 测试使用 SkipUnit 框架运行,这些测试在本地 JVM 中使用 Robolectric 工具来模拟许多 Android API。如果你有一个已连接的 Android 模拟器或设备,可以从 adb devices 命令获取标识符,然后将标识符设置在环境变量 ANDROID_SERIAL 中。这可以在命令行中通过 ANDROID_SERIAL=emulator-1234 skip test 完成。在 Xcode 中,你可以在 Scheme 的 Run Arguments 部分设置这个变量,然后切换它来在(更快的)Robolectric 测试和(更高保真度的)Android 测试之间切换。

Skip 框架能否使用持续集成系统进行构建和测试?

Section titled “Skip 框架能否使用持续集成系统进行构建和测试?”

Skip 框架项目内置了对项目的 Swift 和 Kotlin 两端运行 parity 测试的支持。这些测试可以包含在自动化持续集成工作流中,以确保测试始终通过。我们自己也在各种 Skip 框架中这样做,例如 SkipLib Actions ↗,它引用了我们标准的 GitHub CI 工作流 ↗。

Skip 能否与 Xcode Cloud 一起使用?

Section titled “Skip 能否与 Xcode Cloud 一起使用?”

你应该能够使用 Homebrew 为 Xcode Cloud 构建安装 Skip,请参见 https://developer.apple.com/documentation/xcode/making-dependencies-available-to-xcode-cloud#Use-a-custom-build-script-to-install-a-third-party-dependency-or-tool ↗ 的文档。

Swift 不使用垃圾回收,但 Kotlin/Java 使用。任何转译为 Kotlin 的 Swift 代码都将与其他所有 Android 应用一样,运行在同一个托管的、垃圾回收的 Android Runtime 环境中。

如何嵌入自定义 SwiftUI 和 Compose 视图?

Section titled “如何嵌入自定义 SwiftUI 和 Compose 视图?”

你可以使用 #if SKIP 块来提供平台特定的视图实现——在 iOS 上使用 Apple 框架的 SwiftUI 视图,在 Android 上通过 ComposeView 使用 Jetpack Compose 可组合函数。请参见嵌入自定义 SwiftUI 和 Compose 视图部分,了解使用 MapKit 和 Google Maps 的完整示例。

如何嵌入旧的 UIView 和 Android XML 视图?

Section titled “如何嵌入旧的 UIView 和 Android XML 视图?”

你可以在 iOS 上使用 UIViewRepresentable 包装 UIKit UIView 子类,在 Android 上使用 Compose 的 AndroidView 在 ComposeView 中包装传统的 Android 视图。请参见嵌入旧版 UIKit 和 Android XML 视图部分,了解使用 WKWebView 和 android.webkit.WebView 的完整示例。

Skip Lite 的转译模式是否支持 Swift 语言特性 ________?

Section titled “Skip Lite 的转译模式是否支持 Swift 语言特性 ________?”

Skip 的转译 Swift 支持在转译参考中有详细说明。

Skip Lite 的转译模式如何处理 Swift 和 Kotlin 之间的 ________ 差异?

Section titled “Skip Lite 的转译模式如何处理 Swift 和 Kotlin 之间的 ________ 差异?”

与 Swift 和 Kotlin 差异相关的许多主题已在转译参考主题中涵盖。

如何检查我的 Android 构建是处于调试模式还是发布模式?

Section titled “如何检查我的 Android 构建是处于调试模式还是发布模式?”

传统的 #if DEBUG 检查在转译的 Skip Lite 的 Android 端不起作用——它始终解析为 false。你可以这样做:添加一个顶层的 isDebugBuild 变量,检查 Android ApplicationInfo 的 debuggable 标志,如下所示:

let isDebugBuild: Bool = {
#if SKIP
return (ProcessInfo.processInfo.androidContext.getApplicationInfo().flags & android.content.pm.ApplicationInfo.FLAG_DEBUGGABLE) != 0
#elseif DEBUG
return true
#else
return false
#endif
}()

Skip Fuse 支持使用编译的 Swift 而非转译为 Kotlin 的 Swift 为 Android 创建应用和库。

如何在现有项目在 Skip Lite 和 Skip Fuse 之间切换?

Section titled “如何在现有项目在 Skip Lite 和 Skip Fuse 之间切换?”

切换模式涉及更新你的 Package.swift 依赖(例如,从 skip-ui.git 改为 skip-fuse-ui.git),更改 skip.yml 文件中的 mode,并执行清理重新构建。详细说明请参见 Lite 和 Fuse 模式文档。

使用原生 Skip Fuse 相比转译 Skip Lite 有什么优势?

Section titled “使用原生 Skip Fuse 相比转译 Skip Lite 有什么优势?”

Skip Lite 转译模式的一个限制是,任何包依赖都需要是 “Skip aware” 的,才能在应用的 Android 端使用。这实际上将大量 Swift 包生态系统锁定在 Skip 应用中跨两个平台使用。

借助 Skip Fuse 使用原生编译 Swift 的能力,任何为 Android 编译的包都可以在你的 Skip 应用中使用,这大大增加了可以依赖的库目录。

使用原生 Skip Fuse 相比转译 Skip Lite 有什么劣势?

Section titled “使用原生 Skip Fuse 相比转译 Skip Lite 有什么劣势?”

对于最终用户来说,使用 Skip Fuse 应用的体验应该与使用 Skip Lite 应用相同,因为它们都使用 Jetpack Compose 呈现真正的原生用户界面。一个缺点是 Skip Fuse 应用比 Skip Lite 应用更大,因为它们需要将原生 Swift 库及其所有依赖作为库包含在 .apk 中。

对于开发者来说,Skip Fuse 构建更慢,因为 Swift 必须为 Android 目标架构编译第二次。调试也更有限:你不能像 Kotlin 那样从 Android Studio 在原生 Swift 代码中设置断点。请参阅调试文档了解可用选项。

Skip Fuse 已稳定并用于生产应用。它构建在 Swift 6.3 附带的官方 Swift Android SDK ↗之上。

Skip Fuse 应用的最低 Swift 版本是多少?

Section titled “Skip Fuse 应用的最低 Swift 版本是多少?”

Skip Fuse 需要 Swift 6 或更高版本。

如何检查使用原生 Skip Fuse 构建的系统先决条件?

Section titled “如何检查使用原生 Skip Fuse 构建的系统先决条件?”

运行 skip checkup --native 将执行完整的系统分析,并创建和构建一个小型 Skip Fuse 应用,以确保它在你的系统上正常工作。

哪些核心 iOS 框架可以与 Skip Fuse 一起使用?

Section titled “哪些核心 iOS 框架可以与 Skip Fuse 一起使用?”

Foundation、Dispatch、Observation 和 Swift 标准库作为 Swift Android SDK 的一部分”免费”提供。此外,通过 SkipFuseUI 支持 SwiftUI 来构建应用的用户界面。

其他 Apple 设备原生框架如 Combine、CoreGraphics 和 CoreAnimation,以及许多 iOS 特定的 “Kit” 框架(StoreKit、PhotoKit、HealthKit 等)不可用,需要为你的应用的 Android 端找到替代方案。

一些库有 Skip 特定的桥接实现,如 SkipAV 对应 AVKit,SkipWeb 对应 WebKit。其他框架有流行的开源等效实现,如 OpenCombine ↗ 对应 Combine 框架。

哪些第三方依赖可以与 Skip Fuse 一起使用?

Section titled “哪些第三方依赖可以与 Skip Fuse 一起使用?”

一些仅依赖内置框架(如 Foundation 和 Swift 标准库)的包可以”开箱即用”地与 Skip Fuse 一起使用。对于其他包,需要由维护者为其 Swift 包添加 Android 支持。在某些情况下这可能很简单,但与底层操作系统特定 API 交互的包可能更具挑战性。

将 Swift 包移植到 Android 文章提供了更多信息和有用建议,帮助包作者确保其代码可以在 Android 上使用。

是否有可以与 Skip Fuse 一起使用的第三方包列表?

Section titled “是否有可以与 Skip Fuse 一起使用的第三方包列表?”

Swift Package Index ↗ 网站虽然不是全面的,但列出了已知可以成功为 Android 编译的 Swift 包。它可以作为快速参考,查看你喜欢的包是否可能用于 Skip Fuse。

我可以在 Skip Fuse 中使用二进制依赖吗?

Section titled “我可以在 Skip Fuse 中使用二进制依赖吗?”

Swift Package Manager 仅支持 Darwin(例如 macOS、iOS)平台的二进制依赖。因此,目前 Skip Fuse 仅支持源代码依赖,不能用于有二进制依赖的包。

Skip Fuse 原生应用会完全取代 Skip Lite 转译应用吗?

Section titled “Skip Fuse 原生应用会完全取代 Skip Lite 转译应用吗?”

不会。Skip Lite 的转译层被 Skip Fuse 编译应用在需要从 Swift 桥接到 Kotlin(再回来)时使用。这包括 SkipFuseUI 兼容框架(SwiftUI),它构建在转译的 SkipUI 模块之上。转译仍然是 Skip 架构的基本组成部分,不会消失。

什么是 SkipFuse 模块,什么时候需要导入它?

Section titled “什么是 SkipFuse 模块,什么时候需要导入它?”

SkipFuse 是处理将你的 iOS 习惯用法适配到 Android 的许多细微差别的模块。它处理各种杂项功能,如将 OSLog Logger 类桥接到使用 Android adb logcat 系统的实现。

当你的代码使用 @Observable 时,也需要导入 SkipFuse 模块,因为它处理跟踪状态的 Jetpack Compose 组件更新所需的通信。

如何对 Skip Fuse 代码进行单元测试?

Section titled “如何对 Skip Fuse 代码进行单元测试?”

对于原生包,你可以运行 skip android test 来在已连接的 Android 设备上运行 XCTest 或 Swift Testing 测试用例。

SkipFuse 应用的调试支持目前相当有限。除了使用 Logger 消息(显示在 adb logcat 中)外,任何原生崩溃都会记录到 logcat。Swift 符号在崩溃报告中会被混淆,但可以通过 swift demangle 命令处理以获得更易读的名称。例如:

$ swift demangle
__TMaC17find_the_treasure15YD_Secret_Class
_type metadata accessor for find_the_treasure.YD_Secret_Class

带有断点和单步支持的交互式调试目前正在积极研究中。

如何以发布模式构建我的 Skip Fuse 应用?

Section titled “如何以发布模式构建我的 Skip Fuse 应用?”

在 Xcode 中,为目标在 scheme 选择器中选择 “Release” 构建类型选项将使 Android 应用以发布模式构建。请注意,对于 Android 应用,在发布模式下运行时需要设置签名密钥。发布模式对于性能测试特别重要,因为它可能对 Android 产生显著影响。

如何导出我的 Skip Fuse 应用进行分发?

Section titled “如何导出我的 Skip Fuse 应用进行分发?”

skip export 命令将创建应用的 .apk,包括执行原生编译和嵌入共享对象文件。

默认情况下,Skip Fuse 会为 aarch64 和 x86_64 构建,这覆盖了绝大多数已部署的 Android 架构。如果 riscv 等新架构在 Android 中获得全面支持,未来将会添加。

Skip Fuse 应用比 Skip Lite 应用更大吗?

Section titled “Skip Fuse 应用比 Skip Lite 应用更大吗?”

Skip Fuse 应用不仅需要嵌入你原生编译的库,还需要嵌入所有 Swift 依赖,如 libFoundation.so 和 libSwift.so。因此,Skip Fuse 应用可能比转译的 Skip Lite 应用大得多,后者不需要包含任何原生库。

是的,从 Swift 6.2 开始,Swift Android SDK 默认构建 16KB 对齐的库。这使得 Skip Fuse 应用兼容 Android 在 2025 年 11 月 1 日起对原生库的要求 ↗。