一個名為“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代碼。
Ubuntu 15.10安裝部署Swift開發環境 http://www.linuxidc.com/Linux/2016-01/126995.htm
Swift 的變化:從 2.2 到 3.0 會帶來什麼 http://www.linuxidc.com/Linux/2015-12/126440.htm
Swift 正式開源,同時開源 Swfit 核心庫和包管理器 http://www.linuxidc.com/Linux/2015-12/125847.htm
Apple Swift學習教程 http://www.linuxidc.com/Linux/2014-09/106420.htm
使用 Swift 構建一個 iOS 的郵件應用 http://www.linuxidc.com/Linux/2014-08/105542.htm
Swift 2.0開源化 http://www.linuxidc.com/Linux/2015-06/118594.htm
Linux下搭建Swift語言開發學習環境 http://www.linuxidc.com/Linux/2015-12/125983.htm
Swift 的詳細介紹:請點這裡
查看英文原文:Using Swift to Build Code for Android