写点什么

使用 Swift 为 Android 构建代码

  • 2016-04-26
  • 本文字数:1879 字

    阅读完需:约 6 分钟

一个名为“Port to Android”的合并请求最近被合并进了官方Swift 代码仓库的主分支,这使得用Swift 开发简单的Android 程序变得有可能。该合并请求为Swift stdlib 增加了安卓目标,其允许开发者使用Linux 环境,跨平台地为基于ARMv7 处理器的Android 进行编译。

Swift 面向 Android 的端口主要是两个开发者的贡献:一个是 Zhuowei Zhang,他在 2015 年末开始了此项目,另一个是Facebook 的Brian Gesiak,他提交了此次PR,并解决了在最终被合并到主分支之前出现的所有反馈的问题。由于这次PR 的规模很大(最初包含了54 个文件的修改),整个流程从提交到合并花了差不多两个月时间。

正如之前提到的,目前只有可能在Linux 环境跨平台编译Android 。另外还需要最新版本的Android NDK,以及为Android 开发的libiconv 和libicu。这些依赖项都满足之后,针对Android 的Swift 可以通过这样的调用被构建:

复制代码
$ utils/build-script \
-R \ # Build in ReleaseAssert mode.
-T \ # Run all tests.
--android \ # Build for Android.
--android-deploy-device-path /data/local/tmp \ # Temporary directory on the device where Android tests are run.
--android-ndk ~/android-ndk-r10e \ # Path to an Android NDK.
--android-ndk-version 21 \
--android-icu-uc ~/libicu-android/armeabi-v7a/libicuuc.so \
--android-icu-uc-include ~/libicu-android/armeabi-v7a/icu/source/common \
--android-icu-i18n ~/libicu-android/armeabi-v7a/libicui18n.so \
--android-icu-i18n-include
~/libicu-android/armeabi-v7a/icu/source/i18n/

一旦编译器可用,它可以被用作创建 Android 可执行文件:

复制代码
$ build/Ninja/ReleaseAssert/swift-linux-x86_64/swiftc \ # The Swift compiler built in the previous step.
-target armv7-none-linux-androideabi \ # Targeting android-armv7.
-sdk ~/android-ndk-r11c/platforms/android-21/arch-arm \ # Use the same NDK path and API version as you used to build the stdlib in the previous step.
-L ~/android-ndk-r11c/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a \ # Link the Android NDK's libc++ and libgcc.
-L ~/android-ndk-r11c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.9 \
hello.swift

它可以和 Swift stdlib 以及 Android NDK libc++ 一起被部署到真实的 Android 设备上,使用下面的 adb push 命令:

复制代码
$ adb push build/Ninja-ReleaseAssert/swift-linux-x86_64/lib/swift/android/libswiftCore.so /data/local/tmp
$ adb push build/Ninja-ReleaseAssert/swift-linux-x86_64/lib/swift/android/libswiftGlibc.so /data/local/tmp
$ adb push build/Ninja-ReleaseAssert/swift-linux-x86_64/lib/swift/android/libswiftSwiftOnoneSupport.so /data/local/tmp
$ adb push build/Ninja-ReleaseAssert/swift-linux-x86_64/lib/swift/android/libswiftRemoteMirror.so /data/local/tmp
$ adb push build/Ninja-ReleaseAssert/swift-linux-x86_64/lib/swift/android/libswiftSwiftExperimental.so /data/local/tmp
$ adb push ~/android-ndk-r11c/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a/libc++_shared.so /data/local/tmp
$ adb push hello /data/local/tmp

最后,该程序可以使用 adb shell 命令执行。

因为目前此端口只包含 Swift stdlib,还需要做很多工作才能让 Swift 有效地被用作创建完整的安卓应用,比方说提供图形化用户界面的应用。它可以用两种方式来完成,要么用某些可以运行在 Android 上的 Swift UI 框架,或者通过和 Android 的 Java 框架交互。然而,要注意的是,Swift 编译器目前并没有包含任何条款,能够让 Swift 像和 Objective C 代码互通一样,和 Java 代码更简单地互通。

另一个在真实 Android 应用中使用 Swift 代码的可能是,使用 JNI/ NDK 通过 Java 调用 Swift 代码。Zhang 还提供了一个原型应用示例来展示如何在JNI 之上从Android Java 应用访问Swift 代码。

查看英文原文 Using Swift to Build Code for Android


感谢夏雪对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016-04-26 19:005276

评论

发布
暂无评论
发现更多内容

【最不佳实践】文件上传并不简单

刘宇

Python Serverless 文件上传

趁着课余时间学点python(二)缩进 标识符 保留字 注释 输入输出的理解

ベ布小禅

8月日更

精彩回顾 | 阿里云 Serverless Developer Meetup 杭州站亮点有这些!

阿里巴巴云原生

阿里云 Serverless 云原生 Meetup

我测了啊,我真测了!

QualityFocus

测试 质量保障 线上问题 缺陷

【最不佳实践】函数计算的函数是什么意思

刘宇

Serverless

王者并发课-钻石2:分而治之-如何从原理深入理解ForkJoinPool的快与慢

MetaThoughts

Java 多线程 并发

Elasticsearch VS ClickHouse

Se7en

能力圈与焦虑:焦虑是因为自己能力不够吗?

非著名程序员

个人成长 提升认知 焦虑 8月日更

全球生态合作伙伴纷至沓来 解码AppGallery 2021“期中成绩单”

叶落便知秋

华为

声网Agora发布教育信息化解决方案 助力教育公平提效

声网

人工智能 在线教育

【前端 · 面试 】HTTP 总结(三)—— HTTP 请求方法

编程三昧

面试 大前端 HTTP 8月日更 HTTP方法

Windows10下JDK8下载及java环境配置

Bob

8月日更

分布式性能测试框架用例方案设想(三)

FunTester

性能测试 接口测试 测试框架 测试开发

基于docker的分布式性能测试框架功能验证(三)

FunTester

分布式 性能测试 接口测试 测试框架 测试开发

奥运“哮喘”运动员为什么越来越多?

脑极体

弱口令到底是什么牛马?

网络安全学海

黑客 网络安全 信息安全 渗透测试 漏洞挖掘

第一次凡尔赛,字节跳动3面+腾讯6面一次过,谈谈我的大厂面经

编程菌

Java 编程 程序员 面试 计算机

一个好的产品需要一个好的产品

刘宇

产品经理

再见 Jenkins!几行脚本搞定自动化部署,这款神器有点厉害

编程菌

Java 编程 程序员 计算机 技术宅

网络攻防学习笔记 Day94

穿过生命散发芬芳

网络攻防 8月日更

万人连麦的幕后技术详解

拍乐云Pano

「SQL数据分析系列」15. 元数据

Databri_AI

sql 脚本 元数据

架构实战营 毕业设计

竹林七贤

Fil行情:投资fil的成本有哪些?

区块链 分布式存储 IPFS fil fil成本

Vue3异步数据加载组件:suspense

devpoint

Vue 3 8月日更

NLP随笔(三)

毛显新

人工智能 自然语言处理 神经网络 深度学习

从未如此简单:基于Serverless架构的博客

刘宇

Serverless Hexo 博客

各种消息队列设计要点与对比

海明菌

消息队列 消息队列对比 消息队列系统设计

SpringBoot 中的事务处理

xcbeyond

事务 springboot 8月日更

架构实战营 模块四作业

孫影

架构实战营 #架构实战营

体验设计落地的四个原则和十个步骤

石云升

用户体验 关键时刻 体验设计 8月日更

使用Swift为Android构建代码_移动_Sergio De Simone_InfoQ精选文章