I’ve recently updated to the new IntelliJ-based Android studio 2.1.
I ran into some issues attempting to launch a “hello world” project in the emulator, which I’m writing up here for the benefit of others.
For context, I run Debian GNU/Linux Jessie on an AMD64 box, with Radeon graphics card, using the free drivers.
The OpenGL error
When attempting to launch a simple project with the emulator, the emulator died with the following message:
Cannot launch AVD in emulator.
Output:
libGL error: unable to load driver: radeonsi_dri.so
libGL error: driver pointer missing
libGL error: failed to load driver: radeonsi
libGL error: unable to load driver: swrast_dri.so
libGL error: failed to load driver: swrast
X Error of failed request: GLXBadContext
Major opcode of failed request: 155 (GLX)
Minor opcode of failed request: 6 (X_GLXIsDirect)
Serial number of failed request: 49
Current serial number in output stream: 48
libGL error: unable to load driver: radeonsi_dri.so
libGL error: driver pointer missing
libGL error: failed to load driver: radeonsi
libGL error: unable to load driver: swrast_dri.so
libGL error: failed to load driver: swrast
X Error of failed request: GLXBadContext
Major opcode of failed request: 155 (GLX)
Minor opcode of failed request: 6 (X_GLXIsDirect)
Serial number of failed request: 49
Current serial number in output stream: 48
libGL error: unable to load driver: radeonsi_dri.so
libGL error: driver pointer missing
libGL error: failed to load driver: radeonsi
libGL error: unable to load driver: swrast_dri.so
libGL error: failed to load driver: swrast
X Error of failed request: BadValue (integer parameter out of range for operation)
Major opcode of failed request: 155 (GLX)
Minor opcode of failed request: 24 (X_GLXCreateNewContext)
Value in failed request: 0x0
Serial number of failed request: 33
emulator: WARNING: VM heap size set below hardware specified minimum of 228MB
emulator: WARNING: Setting VM heap size to 384MB
Current serial number in output stream: 34
QObject::~QObject: Timers cannot be stopped from another thread
The console logs that the command being executed is:
/home/mike/Android/Sdk/tools/emulator -netdelay none -netspeed full -avd Nexus_5X_API_23
Fixing on the command-line
Quick list of things that didn’t work:
- Installing more libraries via apt-get
apt-get install libstdc++6 xserver-xorg-video-radeon
- Pre-loading libraries
LD_PRELOAD='/usr/lib64/libstdc++.so.6' /home/mike/Android/Sdk/tools/emulator -netdelay none -netspeed full -avd Nexus_5X_API_23
- Attempting to understand LibGL’s debug output
LIBGL_DEBUG=verbose /home/mike/Android/Sdk/tools/emulator -netdelay none -netspeed full -avd Nexus_5X_API_23
But the solution turned out to be this very specific flag:
$ ./emulator -help | grep libstdc++
-use-system-libs Use system libstdc++ instead of bundled one
So launching the emulator from the CLI worked for me, using this command:
/home/mike/Android/Sdk/tools/emulator -netdelay none -netspeed full -avd Nexus_5X_API_23 -use-system-libs
Fixing in the IDE
So this was fantastic progress, but without being able to launch this emulator from Android Studio, the development environment wasn’t really integrated yet.
Apparently there used to be a feature for adding command-line flags to the emulator, but this is now gone.
So, adapting a post here, I jumped in and replaced the emulator binary into a wrapper to inject some flags.
$ cd ~/Android/Sdk/tools/
$ mv emulator emulator.0
$ touch emulator
$ chmod +x emulator
I then opened up the emulator in a text editor and punched in this:
#!/bin/sh
set -ex
$0.0 $@ -use-system-libs
Result
Success!
excellent, it’s run :D….thank’s
thank you
Fantastic!!!
Thanks
You sir, are a god!
but if the SDK Manager makes a Update of the Emulator file, we must do this changes again !
Thanks for the pointer. Looking through “emulator -help-all” I found that you also can set the environment variable ANDROID_EMULATOR_USE_SYSTEM_LIBS=1
https://developer.android.com/studio/command-line/variables.html
For information on newer SDK, the path
is /Android/Sdk/emulator and not /Android/Sdk/tools
Tried it with Android/Sdk/tools/emulator and didn’t work. Tried again with Android/Sdk/emulator/emulator and it solved the problem. Thanks.