BT

Disseminando conhecimento e inovação em desenvolvimento de software corporativo.

Contribuir

Tópicos

Escolha a região

Início Notícias Usando o Swift para construir código para o Android

Usando o Swift para construir código para o Android

Favoritos

Recentemente foi realizado o merge de um pull request "Port to Android" dentro do repositório oficial do Swift, na branch master, tornando possível a criação de simples programas para o Android. O pull request adicionou um alvo Android para o stdlib do Swift e permite que os desenvolvedores usem Linux para uma compilação cruzada para o Android no processador ARMv7.

A maior parte, do trabalho de adaptação, foi um esforço de dois desenvolvedores: Zhuowei Zhang, que iniciou o projeto no final de 2015, e Brian Gesiak do Facebook, que enviou o PR (pull request) e cuidou de todo o feedback fornecido antes do merge na branch master. Devido ao tamanho do PR, que originalmente incluía 54 arquivos alterados, o processo todo demorou quase dois meses desde o envio até o merge.

Como mencionado, no momento é possível somente realizar a compilação cruzada para o Android utilizando Linux. Adicionalmente, a última versão do Android NDK é necessária, além das bibliotecas libiconv e libicu compiladas para o Android. Com estas dependências no devido lugar, o compilador Swift para Android pode ser compilado invocando:

$ utils/build-script \
  -R \                                           # Constrói em modo ReleaseAssert mode.
  -T \                                           # Executas todos testes.
  --android \                                    # Constrói para o Android.
  --android-deploy-device-path /data/local/tmp \ # Diretório temporário no dispositivo no qual os testes são executados.
  --android-ndk ~/android-ndk-r10e \             # Path para o 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/

Uma vez que o compilador esteja disponível, é possível usá-lo para criar um executável Android:

$ build/Ninja/ReleaseAssert/swift-linux-x86_64/swiftc \                   # Compilador Swift construído no passo anterior.
    -target armv7-none-linux-androideabi \                                # Visando o android-armv7.
    -sdk ~/android-ndk-r11c/platforms/android-21/arch-arm \               # Usa o mesmo path e versão de API do NDK usado para construir o stdlib no passo anterior.
    -L ~/android-ndk-r11c/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a \  # Vincula o Android NDK's libc++ e libgcc.
    -L ~/android-ndk-r11c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.9 \
    hello.swift

É possível publicar a aplicação em um dispositivo Android real com o stdlib do Swift e o Android NDK libc++ usando o comando 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

Finalmente, o programa pode ser executado usando o comando adb shell.

Dado que esta mudança atualmente inclui somente o stdlib do Swift, existe muito trabalho a ser feito antes do Swift poder ser efetivamente usado para criar aplicações Android plenamente desenvolvidas. Por exemplo, aplicações que fornecem uma interface gráfica ao usuário. Isto poderia ser feito de duas maneiras, usando algum tipo de framework de interface do usuário em Swift que execute no Android, ou através de interfaces de frameworks Java para o Android. Deve-se ter em mente, porém, que o compilador Swift atualmente não inclui quaisquer disposições para tornar mais fácil construir uma ponte entre código Swift e código Java como acontece com o Objective C.

Outra possibilidade para executar código Swift dentro de uma aplicação Android real é através do JNI/NDK para invocar o código Swift a partir do Java. Zhang também forneceu um protótipo de aplicação para demonstrar como o código Swift pode ser acessado através do JNI de uma aplicação Android Java.

Avalie esse artigo

Relevância
Estilo/Redação

Conteúdo educacional

BT