ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Swift SDK for Android - Android 앱을 Swift로 개발하기
    Swift 2025. 10. 26. 09:08

    안녕하세요. 그린입니다 🍏

    드디어 Swift로 Android 앱을 개발할 수 있는 시대가 왔습니다!

    2015년 오픈소스로 공개된 이후 Darwin 기반 시스템(iOS, macOS 등)에 집중했던 Swift가 이제 Android 앱 개발까지 지원하게 되었습니다.

     

    이번 포스팅에서는 Swift SDK for Android를 시작하는 방법부터 실제로 "Hello World"를 Android 기기에서 실행하는 과정까지 자세히 정리해보겠습니다 🙋🏻


    Swift의 크로스 플랫폼 여정

    Swift는 2015년 오픈소스로 공개된 이후, Darwin 기반 시스템에 집중하던 언어에서 Linux, Windows, 그리고 다양한 임베디드 시스템을 지원하는 크로스 플랫폼 개발 언어로 성장했습니다.

    그리고 이제 Swift SDK for Android의 출시로 Android 애플리케이션 개발에도 Swift를 사용할 수 있게 되었습니다.

     

    이는 단순히 새로운 플랫폼 추가가 아닙니다.

    iOS와 Android 앱을 모두 Swift로 개발할 수 있다는 것은 코드 공유, 개발자 생산성, 그리고 생태계 측면에서 큰 의미를 가집니다.

     


    크로스 컴파일레이션 이해하기

    Android용 Swift 패키지를 빌드하려면 크로스 컴파일레이션 SDK를 설치하고 구성해야 합니다.


    크로스 컴파일레이션이란?

    크로스 컴파일레이션은 한 플랫폼(호스트)에서 코드를 빌드하여 다른 플랫폼(타겟)에서 실행하는 프로세스입니다.

    Swift for Android의 경우, 일반적으로 호스트 macOS 또는 Linux 머신에서 Swift 코드를 컴파일하여 타겟 Android OS용 실행 파일이나 라이브러리를 생성하는 것을 의미합니다.

     

    이는 호스트와 타겟이 동일한 호스트 플랫폼용 Swift 컴파일과는 다릅니다(예: macOS에서 macOS용 Swift 코드를 컴파일하고 실행하는 경우).

     

    필요한 세 가지 컴포넌트

    Android용 Swift 코드를 크로스 컴파일하려면 세 가지 별도의 컴포넌트가 필요합니다.

    1. Host Toolchain (호스트 툴체인)

    • Swift 코드를 빌드하고 실행하는 데 사용할 swift 명령어와 관련 도구들

    2. Swift SDK for Android

    • Android 타겟용 Swift 코드를 생성하고 실행하는 데 필요한 라이브러리, 헤더 및 기타 리소스 세트

    3. Android NDK

    • Android용 "Native Development Kit"
    • 호스트 툴체인이 크로스 컴파일하고 링크하는 데 사용하는 clang, ld와 같은 크로스 컴파일레이션 도구 포함
    ┌─────────────────────────────────────────┐
    │         호스트 머신 (macOS/Linux)          │
    │                                         │
    │  ┌───────────────────────────────────┐  │
    │  │   Host Toolchain (swift)          │  │
    │  │   - swift build                   │  │
    │  │   - swift package                 │  │
    │  └───────────────────────────────────┘  │
    │              ↓                          │
    │  ┌───────────────────────────────────┐  │
    │  │   Swift SDK for Android           │  │
    │  │   - 라이브러리                       │  │
    │  │   - 헤더 파일                       │  │
    │  └───────────────────────────────────┘  │
    │              ↓                          │
    │  ┌───────────────────────────────────┐  │
    │  │   Android NDK                     │  │
    │  │   - clang                         │  │
    │  │   - linker                        │  │
    │  └───────────────────────────────────┘  │
    │              ↓                          │
    │  [Android용 실행 파일 생성]                 │
    └─────────────────────────────────────────┘
                  ↓
         adb push로 전송
                  ↓
    ┌─────────────────────────────────────────┐
    │      Android 기기/에뮬레이터                │
    │                                         │
    │      Swift 앱 실행!                       │
    └─────────────────────────────────────────┘

     


    Getting Started

    이제 실제로 설치하고 설정하는 과정을 단계별로 살펴보겠습니다.


    1단계: Host Toolchain 설치

    먼저 주목해야 할 점은 시스템에 이미 swift가 설치되어 있을 수 있지만(예: macOS의 Xcode 설치를 통해), 크로스 컴파일레이션 Swift SDK를 사용하려면 호스트 툴체인과 Swift SDK 버전이 정확히 일치해야 한다는 것입니다.

     

    이러한 이유로 주어진 Swift SDK 버전에 대한 특정 버전의 호스트 툴체인을 설치해야 합니다.

    Swiftly 사용하기

    macOS와 Linux에서 호스트 툴체인을 관리하는 가장 쉽고 권장되는 방법은 swiftly 명령어를 사용하는 것입니다.

    # Swiftly를 설정한 후, 호스트 툴체인 설치
    $ swiftly install main-snapshot-2025-10-16
    Installing Swift main-snapshot-2025-10-16
    Installing package in user home directory...
    main-snapshot-2025-10-16 installed successfully!
    
    # 설치한 버전을 사용하도록 설정
    $ swiftly use main-snapshot-2025-10-16
    The global default toolchain has been set to `main-snapshot-2025-10-16` (was 6.2.0)
    
    # 버전 확인
    $ swiftly run swift --version
    Apple Swift version 6.3-dev (LLVM 0d0246569621d5b, Swift 199240b3fe97eda)
    Target: arm64-apple-macosx15.0

     

    왜 버전이 정확히 일치해야 할까?

    크로스 컴파일레이션에서는 호스트 툴체인과 타겟 SDK가 동일한 Swift 컴파일러 버전을 사용해야 합니다.

    버전이 다르면 ABI(Application Binary Interface) 호환성 문제로 인해 빌드가 실패하거나 런타임 오류가 발생할 수 있습니다.

     


    2단계: Swift SDK for Android 설치

    다음으로 내장된 swift sdk 명령어를 사용하여 Swift SDK 번들을 다운로드하고 설치합니다.

    $ swift sdk install https://download.swift.org/development/android-sdk/swift-DEVELOPMENT-SNAPSHOT-2025-10-16-a/swift-DEVELOPMENT-SNAPSHOT-2025-10-16-a_android-0.1.artifactbundle.tar.gz --checksum 451844c232cf1fa02c52431084ed3dc27a42d103635c6fa71bae8d66adba2500
    
    Swift SDK bundle at `https://download.swift.org/development/android-sdk/...` successfully installed as swift-DEVELOPMENT-SNAPSHOT-2025-10-16-a-android-0.1.artifactbundle.

     

    설치 후 swift sdk list 명령어로 확인할 수 있습니다.
    $ swiftly run swift sdk list
    swift-DEVELOPMENT-SNAPSHOT-2025-10-16-a-android-0.1

     

    Checksum이 왜 필요한가?

    --checksum 플래그는 다운로드한 파일의 무결성을 검증합니다.

    네트워크 전송 중 파일이 손상되거나 변조되지 않았음을 보장하여 보안과 안정성을 제공합니다.

     


    3단계: Android NDK 설치 및 구성

    Swift SDK for Android는 Android 아키텍처로 크로스 컴파일하는 데 필요한 헤더와 도구를 제공하기 위해 Android NDK 버전 27d에 의존합니다.

     

    NDK 다운로드

    Android NDK를 설치하는 방법은 여러 가지가 있지만, 가장 간단한 방법은 NDK Downloads 페이지에서 직접 아카이브를 다운로드하고 압축을 푸는 것입니다.

     

    선택한 디렉토리에서 다음 명령어로 자동화할 수 있습니다.
    # NDK 디렉토리 생성 및 이동
    $ mkdir ~/android-ndk
    $ cd ~/android-ndk
    
    # NDK 다운로드 (OS에 맞게 자동으로 선택)
    $ curl -fSLO https://dl.google.com/android/repository/android-ndk-r27d-$(uname -s).zip
    
    # 압축 해제
    $ unzip -q android-ndk-r27d-*.zip
    
    # 환경 변수 설정
    $ export ANDROID_NDK_HOME=$PWD/android-ndk-r27d

     

    Swift SDK와 NDK 연결

    NDK를 다운로드하고 압축을 푼 후, Swift SDK 번들에 포함된 setup-android-sdk.sh 유틸리티 스크립트를 실행하여 Swift SDK for Android와 연결해야 합니다.

    # Swift SDK 디렉토리로 이동
    $ cd ~/Library/org.swift.swiftpm || cd ~/.swiftpm
    
    # 설정 스크립트 실행
    $ ./swift-sdks/swift-DEVELOPMENT-SNAPSHOT-2025-10-16-a-android-0.1.artifactbundle/swift-android/scripts/setup-android-sdk.sh
    
    setup-android-sdk.sh: success: ndk-sysroot linked to Android NDK at android-ndk-r27d/toolchains/llvm/prebuilt

     

    이미 다른 위치에 NDK가 설치되어 있다면?

    이미 다른 위치에 NDK를 설치한 경우, ANDROID_NDK_HOME 환경 변수를 해당 위치로 설정하고 setup-android-sdk.sh 스크립트를 실행하면 됩니다.

    export ANDROID_NDK_HOME=/path/to/your/ndk
    ./setup-android-sdk.sh

     

    이제 Android용 완전히 작동하는 크로스 컴파일레이션 툴체인을 갖추게 되었습니다! 🎉


    Hello World on Android

    이제 전통적인 "Hello World" 프로그램으로 테스트해봅시다.


    프로젝트 생성

    먼저 코드를 담을 디렉토리를 만듭니다.
    $ cd /tmp
    $ mkdir hello
    $ cd hello

     

    Swift에게 새 패키지를 만들도록 요청합니다.

    $ swiftly run swift package init --type executable
    Creating executable package: hello
    Creating Package.swift
    Creating .gitignore
    Creating Sources/
    Creating Sources/main.swift

     


    로컬에서 테스트

    먼저 호스트 머신에서 로컬로 빌드하고 실행해봅니다.

    $ swiftly run swift build
    Building for debugging...
    [8/8] Applying hello
    Build complete! (15.29s)
    
    $ .build/debug/hello
    Hello, world!

     

    잘 워킹하죠!? 이제 Android용으로 크로스 컴파일해봅시다.


    Android용 크로스 컴파일

    Swift SDK for Android가 설치되고 구성되었으므로, 이제 x86_64 아키텍처용 Android로 실행 파일을 크로스 컴파일할 수 있습니다.

    $ swiftly run swift build --swift-sdk x86_64-unknown-linux-android28 --static-swift-stdlib
    Building for debugging...
    [8/8] Linking hello
    Build complete! (2.04s)
    
    $ file .build/x86_64-unknown-linux-android28/debug/hello
    .build/x86_64-unknown-linux-android28/debug/hello: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /system/bin/linker64, with debug_info, not stripped

     

    또는 aarch64 아키텍처용으로도 빌드할 수 있습니다.

    $ swiftly run swift build --swift-sdk aarch64-unknown-linux-android28 --static-swift-stdlib
    Building for debugging...
    [8/8] Linking hello
    Build complete! (2.04s)
    
    $ file .build/aarch64-unknown-linux-android28/debug/hello
    .build/aarch64-unknown-linux-android28/debug/hello: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /system/bin/linker64, with debug_info, not stripped
    

     

    주요 플래그

    • --swift-sdk x86_64-unknown-linux-android28: x86_64 Android API 레벨 28용 타겟
    • --static-swift-stdlib: Swift 표준 라이브러리를 정적으로 링크 (배포 단순화)

    지원하는 아키텍처

    • x86_64-unknown-linux-android28: 에뮬레이터나 x86 기반 Android 기기용
    • aarch64-unknown-linux-android28: 대부분의 최신 Android 기기(ARM64)용

    Android 기기에서 실행

    USB 디버깅이 활성화된 연결된 Android 기기나 로컬에서 실행 중인 Android 에뮬레이터가 있으면, 이제 adb 유틸리티를 사용하여 실행 파일과 Android NDK의 필수 libc++_shared.so 의존성을 복사하고 실행할 수 있습니다.

    # 실행 파일 푸시
    $ adb push .build/aarch64-unknown-linux-android28/debug/hello /data/local/tmp
    .build/aarch64-unknown-linux-android28/debug/hello: 1 file pushed, 0 skipped. 155.9 MB/s (69559568 bytes in 0.425s)
    
    # C++ 공유 라이브러리 푸시
    $ adb push $ANDROID_NDK_HOME/toolchains/llvm/prebuilt/*/sysroot/usr/lib/aarch64-linux-android/libc++_shared.so /data/local/tmp/
    aarch64-linux-android/libc++_shared.so: 1 file pushed, 0 skipped. 145.7 MB/s (1794776 bytes in 0.012s)
    
    # Android에서 실행!
    $ adb shell /data/local/tmp/hello
    Hello, world!

     


    Conclusion

    어떠셨나요?

    Swift 발전이 굉장히 광범위적으로 적용되고 있다고 생각이 들어요.

    Swift로 크로스 플랫폼을 모두 대체할 수 있는 날이 올수도 있지 않을까 합니다.

     


    References

     

    Announcing the Swift SDK for Android

    Swift has matured significantly over the past decade — extending from cloud services to Windows applications, browser apps, and microcontrollers. Swift powers apps and services of all kinds, and thanks to its great interoperability, you can share code ac

    www.swift.org

     

    Swift.org

    Swift is a general-purpose programming language built using a modern approach to safety, performance, and software design patterns.

    www.swift.org

    'Swift' 카테고리의 다른 글

    Swift Closure Capture Semantics  (0) 2025.11.15
    Swift Build Technologies  (0) 2025.11.01
    Iterate Over Parameter Packs  (0) 2025.10.18
    Swift Profile Recorder  (0) 2025.10.12
    Swift 6.2  (0) 2025.10.02
Designed by Tistory.