2

Pitch: Como fiz um emulador Android nativo pro Mac com Apple Silicon (e o que aprendi no caminho)

Fala, pessoal! Nos últimos meses eu fiz, sozinho e do zero, um emulador Android pra Mac com Apple Silicon. Queria contar como ele funciona por baixo e as pancadas que tomei no caminho, porque aprendi bastante sobre virtualização e gráficos.

O SiliconPlay em 30 segundos (vdeo): https://youtu.be/qNqOwIfWrnY

A ideia: ARM rodando em ARM

Mac M1 em diante é ARM, e o Android também. Então não faz sentido traduzir instrução nenhuma: o app roda uma imagem Android 16 ARM64 direto nos núcleos do Mac, usando por baixo o Android Emulator oficial do Google com a virtualização nativa da Apple (Hypervisor.framework). Todo o resto (interface, gerenciamento, mapeamento de controles) eu escrevi do zero. A CPU do Android roda praticamente na velocidade nativa, e o gargalo vai todo pro gráfico e pra entrada.

Algumas decisões que tomei:

  • Sem extensão de kernel e sem serviço em segundo plano. Apagou o app, acabou.
  • Imagem oficial do Android. O app baixa a imagem oficial na primeira execução, e o Google Play vem junto dela.
  • Root opcional. Vem desligado. Você só liga se precisar.
  • macOS: até agora testei só no macOS Tahoe. Se alguém rodar em outra versão, me conta se funcionou!

Gráficos via Metal

O Android fala OpenGL ES/Vulkan, e o Mac quer Metal. Essa ponte foi a parte que mais me deu trabalho:

  • Glitches em vegetação. Folhagem com transparência piscando ou com artefatos em alguns jogos. Esse tipo de bug só aparece em jogo de verdade, não em teste sintético.
  • Travamento depois de mudar a resolução. Trocar a resolução com o Android rodando às vezes congelava tudo. Recriar superfícies e buffers no meio do caminho é muito mais delicado do que parece.

Teclado e controle virando toque

Jogo de celular espera toque, então fiz uma camada que traduz teclado e gamepad em toque: WASD vira o analógico virtual, J ataca, 1 a 6 usam as skills, e dá pra remapear tudo. Num MacBook Pro M3 Max medi até 60 fps num jogo 3D pesado em 2560x1440, com 7 a 43 ms de latência entre a tecla e o jogo reagir. Isso varia bastante conforme o jogo e o Mac.

Pra dev também

Como é um Android ARM64 de verdade, dá pra usar o adb normalmente:

adb install meu-app.apk

Limites

Funciona só em Mac com Apple Silicon (M1 ao M5 e mais novos). Não roda em Mac Intel.

O que eu levo disso

  • Virtualização nativa resolve a CPU, mas o trabalho de verdade está no gráfico.
  • Bug de renderização só aparece com jogo real, então teste com jogo real.
  • Mudar estado (resolução, janela) com tudo rodando é a maior fonte de travamento.

Se alguém aqui mexe com virtualização ou Metal, adoraria trocar ideia. E se testarem, me contem o que quebrou 🙌🏻

https://siliconplay.app

Carregando publicação patrocinada...
1
1