BT

Usando o Swift para construir código para o Android

| por Sergio De Simone Seguir 12 Seguidores , traduzido por Diogo Carleto Seguir 31 Seguidores em 05 mai 2016. Tempo estimado de leitura: 3 minutos |

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

Olá visitante

Você precisa cadastrar-se no InfoQ Brasil ou para enviar comentários. Há muitas vantagens em se cadastrar.

Obtenha o máximo da experiência do InfoQ Brasil.

Dê sua opinião

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber mensagens dessa discussão
Comentários da comunidade

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber mensagens dessa discussão

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber mensagens dessa discussão

Dê sua opinião

Faça seu login para melhorar sua experiência com o InfoQ e ter acesso a funcionalidades exclusivas


Esqueci minha senha

Follow

Siga seus tópicos e editores favoritos

Acompanhe e seja notificados sobre as mais importantes novidades do mundo do desenvolvimento de software.

Like

Mais interação, mais personalização

Crie seu próprio feed de novidades escolhendo os tópicos e pessoas que você gostaria de acompanhar.

Notifications

Fique por dentro das novidades!

Configure as notificações e acompanhe as novidades relacionada a tópicos, conteúdos e pessoas de seu interesse

BT