Android
Compile e execute aplicativos Wails no Android — configuração da cadeia de ferramentas, emulador, assinatura de APK, empacotamento para a Play Store e referência da API
Os aplicativos Wails v3 são executados no Android como aplicativos nativos: um WebView renderiza o frontend, os ativos são fornecidos dentro do processo por meio de um WebViewAssetLoader apoiado pelo servidor de ativos do Go (sem servidor localhost nem portas abertas), e o @wailsio/runtime padrão funciona sem alterações — vinculações de serviços, eventos, caixas de diálogo e a área de transferência passam pelo processador de mensagens do Go.
O mesmo main.go é compilado para desktop e Android. O código Go é compilado como uma biblioteca compartilhada C (libwails.so, GOOS=android + a cadeia de ferramentas do NDK) e carregado por um pequeno host Java. O comportamento específico do Android fica em arquivos Go específicos da plataforma, protegidos por //go:build android.
Requisitos
- O SDK do Android com platform-tools, uma plataforma do SDK (API 35), build-tools e o NDK (26.3.x) —
wails3 doctormostra o que foi encontrado - Um JDK (por exemplo, OpenJDK 21) para o Gradle; defina
JAVA_HOMEsejavanão estiver no seuPATH - Go 1.25+ e npm
ANDROID_HOME(ouANDROID_SDK_ROOT) apontando para o SDK
Instale os componentes do SDK com as ferramentas de linha de comando:
sdkmanager "platform-tools" "platforms;android-35" "build-tools;35.0.0" \
"ndk;26.3.11579264" "emulator" \
"system-images;android-35;google_apis;arm64-v8a"
avdmanager create avd --name wails \
--package "system-images;android-35;google_apis;arm64-v8a" \
--device pixel_7
Execução no emulador
No diretório do projeto:
wails3 task android:run
Esse comando inicializa um emulador se nenhum estiver em execução, gera as vinculações, compila o frontend, compila seu código Go como libwails.so para a ABI do emulador, monta um APK de depuração com o Gradle e, em seguida, instala e inicia o aplicativo.
Comandos complementares úteis:
wails3 task android:logs # stream the app's logcat output
Em compilações de depuração, a WebView pode ser inspecionada pelo Chrome em chrome://inspect.
Empacotamento
wails3 task android:package # production release APK
wails3 task android:deploy-emulator # install + launch it
wails3 task android:bundle # production release AAB (Android App Bundle)
wails3 task android:bundle:fat # release AAB containing all ABIs
wails3 task android:run:device # debug install + launch on a physical device
wails3 task android:deploy-device # install + launch on a physical device
DEVICE_ID=<serial> wails3 task android:run:device
DEVICE_ID=<serial> wails3 task android:deploy-device
As compilações de produção usam -tags production,android, têm os símbolos removidos e excluem, durante a compilação, os diagnósticos internos do framework. wails3 task android:package:fat compila tanto arm64-v8a quanto x86_64 em um único APK.
O Google Play exige o formato Android App Bundle (.aab) para o envio de novos aplicativos, e os novos envios devem ter como destino o Android 15 (API 35) ou posterior; o modelo de projeto define compileSdk e targetSdk como 35 em build/android/app/build.gradle. wails3 task android:bundle:fat produz bin/<AppName>.aab com ambas as ABIs incluídas; o Google Play gera a partir dele APKs otimizados para cada dispositivo, portanto o pacote universal é o artefato correto para enviar à loja. Os APKs continuam sendo a opção mais rápida para testes locais e no emulador, pois um .aab não pode ser instalado diretamente com adb.
android:run e android:deploy-emulator são tarefas voltadas ao emulador. Para um dispositivo Android físico, use android:run:device para gerar um APK de depuração ou android:deploy-device para gerar um APK de lançamento. Ambas compilam para arm64, selecionam a primeira entrada conectada que não seja um emulador em adb devices, instalam o APK e iniciam com.wails.app.MainActivity. Passe DEVICE_ID=<serial> para usar um dispositivo específico.
Assinatura e compilações de lançamento
Sem um keystore, as compilações de lançamento são assinadas com o keystore de depuração do Android para que possam ser instaladas para testes. Para assinar com seu próprio keystore, defina:
ANDROID_KEYSTORE_FILE=/path/to/release.jks \
ANDROID_KEYSTORE_PASSWORD=... \
ANDROID_KEY_ALIAS=... \
ANDROID_KEY_PASSWORD=... \
wails3 task android:package
As mesmas variáveis assinam os App Bundles: execute wails3 task android:bundle:fat com elas definidas para produzir um .aab pronto para o Play. Sem essas variáveis, o pacote é assinado com o keystore de depuração e será rejeitado pelo Google Play; por isso, a tarefa exibe um aviso.
Configuração
O frontend controla os recursos do Android em tempo de execução por meio do objeto de runtime Android: Android.Haptics.Vibrate(durationMs), Android.Device.Info(), Android.Toast.Show(message). O nome do pacote é controlado por APP_ID nas tarefas de compilação.
O que funciona e o que não funciona
| Área | Status |
|---|---|
WebView + ativos dentro do processo (WebViewAssetLoader) |
✅ |
| Vinculações de serviços e eventos (em ambas as direções) | ✅ |
| Caixas de diálogo de mensagem | ✅ AlertDialog com callbacks de botões |
| Caixas de diálogo para abrir arquivo ou arquivos | ✅ Storage Access Framework (arquivos importados como cópias no cache) |
| Caixas de diálogo para abrir diretório ou salvar arquivo | ❌ Retornam um erro — em vez disso, grave dentro do sandbox do aplicativo |
| Área de transferência | ✅ ClipboardManager |
| API Screens | ✅ WindowMetrics, incluindo a área de trabalho que exclui as barras do sistema |
Eventos do ciclo de vida (events.Android.*) |
✅ |
| Resposta tátil, informações do dispositivo e toast | ✅ API de runtime Android.* |
| Compilações para emulador e dispositivo físico | ✅ android:run, android:run:device, android:deploy-emulator, android:deploy-device |
| Geometria das janelas, menus e bandeja do sistema | Operações inativas intencionais |
| Várias janelas | Somente a primeira janela é exibida |
Observações sobre portabilidade
- O código para desktop é compilado sem alterações com
GOOS=android; as chamadas de geometria, menu e bandeja não executam nenhuma operação porque os aplicativos Android funcionam em tela cheia. androidimplica a tag de compilaçãolinux(o Android usa um kernel Linux): arquivos exclusivos do Linux para desktop precisam de//go:build linux && !androide, em tempo de execução,runtime.GOOSé"android".- Substitua as caixas de diálogo para salvar arquivos e escolher diretórios por gravações no sandbox do aplicativo, combinadas com um fluxo de compartilhamento por intent. As caixas de diálogo para abrir arquivos funcionam e importam os documentos escolhidos como cópias no diretório de cache, portanto você obtém caminhos reais do sistema de arquivos.
- Um aplicativo real é sempre compilado com
CGO_ENABLED=1e o NDK; o caminho sem cgo existe apenas para que ferramentas comowails3 generate bindingspossam carregar o pacote. - Projete o frontend de forma responsiva; a área de trabalho de
Screensexclui as barras de status e de navegação.