quinta-feira, 17 de agosto de 2017

Emulador do Android SDK no Ubuntu 16 - Resolvido

Recentemente passei por alguns problemas para fazer funcionar o emulador do Android SDK instalado juntamente com o Android Studio 2.3.3 em máquinas Ubuntu de onde trabalho.

Configuração das máquinas:
Intel® Core™ i7 CPU 870 @ 2.93GHz × 8
8GB de RAM
Ubuntu 16.04 64bit

A princípio, uma configuração suficiente pra rodar o Android Studio, mais precisamente o emulador que dava problema. Tanto na minha como nas máquinas de 2 colegas.

Depois de muitas pesquisas na documentação do Android Studio, stackoverflow e outros sites relacionados chegamos à solução do problema.

Android Studio no Ubuntu

Problema:

Antes de chegar na questão, passamos por outras situações, tais como a solicitação de instalação do Intel HAXM (Hardware Accelerated Execution Manager) ou KVM (Kernel-based Virtual Machine), configuração de BIOS para habilitar a virtualização do processador, entre outros.

Após pesquisas vimos que era algo bem comum. Com vários relatos, inclusive de casos que funcionavam antes, mas não após o upgrade pra versão 2 do Android Studio.

Após a resolução das configurações iniciais citadas, chegamos num ponto em que o emulador é iniciado, mas dá crash, às vezes logo de início, às vezes no início do carregamento do sistema operacional.

Um das causas do problema parece estar relacionada à interface gráfica Unity, já que vimos soluções em que a mudança para o Mate resolveria, mas não era algo aplicável ao nosso caso.

Cheguei a pensar se o fato de usar um processador Intel de 1ª geração poderia ser complicador também, já que no meu notebook com processador de 5ª geração (i5-5200U) e 8GB de RAM o emulador rodou normalmente.

Solução:

Inicialmente, a CPU precisa suportar uma das seguintes tecnologias de virtualização:
  • Intel Virtualization Technology (VT, VT-x, vmx) extensions
  • AMD Virtualization (AMD-V, SVM) extensions (Linux only)
A chave de tudo é fazer funcionar o processo de aceleração

1) Aceleração de hardware

Ao usar aceleração de hardware seu emulador deve rodar mais rapidamente, mas o problema que temos é que exatamente por tentar usar isso que o erro ocorre. Muito provavelmente você está usando o driver SL Nouveau. Ele acaba tornando a renderização gráfica mais lenta ou ocasiona o crash.

Solução: atualizar/modificar o driver da placa de vídeo. No meu caso a placa era uma GeForce 8400. Bastou reverter para o driver do fabricante nvidia-340 que já estava até instalado, mas não em uso.

2) Se ainda assim não der certo... usar Aceleração via software

Aceleração via software é útil somente se o computador não dispõe de drivers gráficos compatíveis com o emulador. A imagem do Android deve ser criada definindo a opção Emulated Performance: Graphics como 'Software' para assim não usar a GPU do host. Mesmo com esse procedimento só funcionou a versão Lollipop do Android no nosso caso.

Além disso foram necessários mais alguns comandos:
  • Instalação de bibliotecas:
sudo apt-get install lib64stdc++6:i386
sudo apt-get install mesa-utils
  • Copiar pastas lib, lib64 e qemu da pasta emulator para tools dentro de $ANDROID_SDK.
  • Renomeia pasta:
Na pasta '$ANDROID_SDK/emulator/lib64': 
mv libstdc++/ libstdc++.bak
  • Linca pasta do emulador pra pegar as bibliotecas do sistema
Na pasta '$ANDROID_SDK/emulator/lib64': 
ln -s /usr/lib64/libstdc++.so.6 libstdc++
  • Para rodar o emulador via linha de comando:
Na pasta '$ANDROID_SDK/tools$:
 ./emulator -list-avds
Na pasta '$ANDROID_SDK/tools$:
 ./emulator -use-system-libs -avd Nexus_5X_API_22

Em alguns casos não precisa do -use-system-libs. Em outros dá pra rodar direto do Android Studio.

Em qualquer dos casos, se prepare que muita memória vai ser consumida. Nem 8GB é o bastante quando uma aplicação está rodando e com navegadores e outros programas abertos.

Observação: você não pode rodar uma VM dentro de outra VM como VirtualBox ou VMWare. Você deve rodar o emulador diretamente do seu hardware.

Um comentário: