Add Gitea Actions workflow for automated builds
Some checks failed
Build Android Emulator Images / build (android-30) (push) Failing after 5s

This commit is contained in:
Neon Vortex
2025-11-26 12:22:25 -05:00
parent 6bf51f101d
commit df78b01c85
9 changed files with 325 additions and 83 deletions

View File

@@ -0,0 +1,55 @@
name: Build Android Emulator Images
on:
push:
branches: [main, master]
workflow_dispatch:
inputs:
android_version:
description: 'Android API version (e.g., 30, 31, 32)'
required: false
default: '30'
env:
REGISTRY: images.caffeinetux.com
PROJECT: library
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
version: [android-30]
fail-fast: false
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to Harbor
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ secrets.HARBOR_USERNAME }}
password: ${{ secrets.HARBOR_PASSWORD }}
- name: Generate build files
run: make generate
- name: Build and push
working-directory: build/${{ matrix.version }}
run: |
# Build the image
docker build \
--build-arg VCS_REF=${{ github.sha }} \
--build-arg IMAGE_VERSION=${{ github.run_number }} \
-t ${{ env.REGISTRY }}/${{ env.PROJECT }}/docker-emulator-${{ matrix.version }}:latest \
-t ${{ env.REGISTRY }}/${{ env.PROJECT }}/docker-emulator-${{ matrix.version }}:${{ github.sha }} \
.
# Push tags
docker push ${{ env.REGISTRY }}/${{ env.PROJECT }}/docker-emulator-${{ matrix.version }}:latest
docker push ${{ env.REGISTRY }}/${{ env.PROJECT }}/docker-emulator-${{ matrix.version }}:${{ github.sha }}

View File

@@ -1,5 +1,5 @@
SHELL := /usr/bin/env bash
VERSIONS ?= android-16 android-17 android-18 android-19 android-21 android-22 android-23 android-24 android-25 android-26 android-27 android-28
VERSIONS ?= android-29 android-30 android-31 android-32 android-33 android-34
generate:
for version in $(VERSIONS); do \
@@ -37,8 +37,10 @@ tag: generate
$(MAKE) -C build/$$version tag; \
done
REGISTRY ?= images.caffeinetux.com
login:
@docker login -u "$(DOCKER_USER)" -p "$(DOCKER_PASS)" "$(PROXY)"
@docker login -u "$(DOCKER_USER)" -p "$(DOCKER_PASS)" "$(REGISTRY)"
push: login
for version in $(VERSIONS); do \

View File

@@ -1,63 +1,75 @@
FROM ubuntu:18.04
FROM ubuntu:22.04
MAINTAINER Anton Malinskiy "anton@malinskiy.com"
LABEL maintainer="Updated for modern Android SDK"
# Set up insecure default key
COPY adbkey adbkey.pub adb_usb.ini /root/.android/
ENV LINK_ANDROID_SDK=https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip \
ENV ANDROID_SDK_ROOT=/opt/android-sdk \
ANDROID_HOME=/opt/android-sdk \
LANG=en_US.UTF-8 \
LANGUAGE=en_US:en \
LC_ALL=en_US.UTF-8 \
ANDROID_HOME=/opt/android-sdk-linux \
PATH="$PATH:/opt/android-sdk-linux/tools:/opt/android-sdk-linux/platform-tools:/opt/android-sdk-linux/tools/bin:/opt/android-sdk-linux/emulator"
PATH="$PATH:/opt/android-sdk/cmdline-tools/latest/bin:/opt/android-sdk/platform-tools:/opt/android-sdk/emulator"
# Use specific cmdline-tools version
ENV CMDLINE_TOOLS_URL=https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip
RUN dpkg --add-architecture i386 && \
echo "deb mirror://mirrors.ubuntu.com/mirrors.txt bionic main restricted universe multiverse" > /etc/apt/sources.list && \
echo "deb mirror://mirrors.ubuntu.com/mirrors.txt bionic-updates main restricted universe multiverse" >> /etc/apt/sources.list && \
echo "deb mirror://mirrors.ubuntu.com/mirrors.txt bionic-security main restricted universe multiverse" >> /etc/apt/sources.list && \
echo "deb mirror://mirrors.ubuntu.com/mirrors.txt bionic-backports main restricted universe multiverse" >> /etc/apt/sources.list && \
apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get install -yq software-properties-common libstdc++6:i386 zlib1g:i386 libncurses5:i386 \
locales ca-certificates apt-transport-https curl unzip redir iproute2 \
openjdk-8-jdk xvfb x11vnc fluxbox nano libpulse0 telnet expect\
--no-install-recommends && \
DEBIAN_FRONTEND=noninteractive apt-get install -yq \
software-properties-common \
libstdc++6:i386 \
zlib1g:i386 \
libncurses5:i386 \
locales \
ca-certificates \
apt-transport-https \
curl \
unzip \
redir \
iproute2 \
openjdk-17-jdk-headless \
xvfb \
x11vnc \
fluxbox \
libpulse0 \
telnet \
expect \
qemu-utils \
libglu1-mesa \
libnss3 \
libxcomposite1 \
libxcursor1 \
libxi6 \
libxtst6 \
libasound2 \
--no-install-recommends && \
locale-gen en_US.UTF-8 && \
# Install Android SDK
curl -L $LINK_ANDROID_SDK > /tmp/android-sdk-linux.zip && \
unzip -q /tmp/android-sdk-linux.zip -d /opt/android-sdk-linux/ && \
rm /tmp/android-sdk-linux.zip && \
# Customized steps per specific platform
yes | sdkmanager --no_https --licenses && \
yes | sdkmanager emulator tools platform-tools "platforms;{{ platform }}" "system-images;{{ platform }};google_apis;x86" --verbose | uniq && \
echo no | avdmanager create avd -n "x86" --package "system-images;{{ platform }};google_apis;x86" --tag google_apis && \
# Unfilter devices (now local because CI downloads from github are unstable)
# curl -o /root/.android/adb_usb.ini https://raw.githubusercontent.com/apkudo/adbusbini/master/adb_usb.ini && \
DEBIAN_FRONTEND=noninteractive apt-get purge -yq unzip openjdk-8-jdk && \
# Convert large partitions to qcow2 to save space
qemu-img convert -O qcow2 -c /opt/android-sdk-linux/system-images/{{ platform }}/google_apis/x86/system.img /opt/android-sdk-linux/system-images/{{ platform }}/google_apis/x86/system.qcow2 && \
mv /opt/android-sdk-linux/system-images/{{ platform }}/google_apis/x86/system.qcow2 /opt/android-sdk-linux/system-images/{{ platform }}/google_apis/x86/system.img && \
qemu-img convert -O qcow2 -c /opt/android-sdk-linux/system-images/{{ platform }}/google_apis/x86/userdata.img /opt/android-sdk-linux/system-images/{{ platform }}/google_apis/x86/userdata.qcow2 && \
mv /opt/android-sdk-linux/system-images/{{ platform }}/google_apis/x86/userdata.qcow2 /opt/android-sdk-linux/system-images/{{ platform }}/google_apis/x86/userdata.img && \
qemu-img resize /root/.android/avd/x86.avd/userdata.img 2G && \
e2fsck -fy /root/.android/avd/x86.avd/userdata.img && \
resize2fs /root/.android/avd/x86.avd/userdata.img && \
qemu-img convert -O qcow2 -c /root/.android/avd/x86.avd/userdata.img /root/.android/avd/x86.avd/userdata.qcow2 && \
mv /root/.android/avd/x86.avd/userdata.qcow2 /root/.android/avd/x86.avd/userdata.img && \
(qemu-img convert -O qcow2 -c /opt/android-sdk-linux/system-images/{{ platform }}/google_apis/x86/vendor.img /opt/android-sdk-linux/system-images/{{ platform }}/google_apis/x86/vendor.qcow2 && \
mv /opt/android-sdk-linux/system-images/{{ platform }}/google_apis/x86/vendor.qcow2 /opt/android-sdk-linux/system-images/{{ platform }}/google_apis/x86/vendor.img || true) && \
# Install Android SDK cmdline-tools
mkdir -p /opt/android-sdk/cmdline-tools && \
curl -L $CMDLINE_TOOLS_URL -o /tmp/cmdline-tools.zip && \
unzip -q /tmp/cmdline-tools.zip -d /tmp && \
mv /tmp/cmdline-tools /opt/android-sdk/cmdline-tools/latest && \
rm /tmp/cmdline-tools.zip && \
# Accept licenses
yes | sdkmanager --licenses && \
# Install emulator, platform-tools, and specific platform
sdkmanager "emulator" "platform-tools" "platforms;{{ platform }}" "system-images;{{ platform }};google_apis;x86_64" --verbose && \
# Create AVD
echo no | avdmanager create avd -n "x86_64" --package "system-images;{{ platform }};google_apis;x86_64" --tag google_apis --device "pixel_2" && \
# Clean up
apt-get -yq autoremove && \
apt-get clean && \
apt-get autoclean && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
COPY config.ini /root/.android/avd/x86.avd/config.ini
COPY config.ini /root/.android/avd/x86_64.avd/config.ini
# Expose adb
# Expose adb and emulator ports
EXPOSE 5037 5554 5555 5900
# Add script
# Add start script
COPY start.sh /start.sh
RUN chmod +x /start.sh
CMD ["/start.sh"]

63
templates/Dockerfile.old Normal file
View File

@@ -0,0 +1,63 @@
FROM ubuntu:18.04
MAINTAINER Anton Malinskiy "anton@malinskiy.com"
# Set up insecure default key
COPY adbkey adbkey.pub adb_usb.ini /root/.android/
ENV LINK_ANDROID_SDK=https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip \
LANG=en_US.UTF-8 \
LANGUAGE=en_US:en \
LC_ALL=en_US.UTF-8 \
ANDROID_HOME=/opt/android-sdk-linux \
PATH="$PATH:/opt/android-sdk-linux/tools:/opt/android-sdk-linux/platform-tools:/opt/android-sdk-linux/tools/bin:/opt/android-sdk-linux/emulator"
RUN dpkg --add-architecture i386 && \
echo "deb mirror://mirrors.ubuntu.com/mirrors.txt bionic main restricted universe multiverse" > /etc/apt/sources.list && \
echo "deb mirror://mirrors.ubuntu.com/mirrors.txt bionic-updates main restricted universe multiverse" >> /etc/apt/sources.list && \
echo "deb mirror://mirrors.ubuntu.com/mirrors.txt bionic-security main restricted universe multiverse" >> /etc/apt/sources.list && \
echo "deb mirror://mirrors.ubuntu.com/mirrors.txt bionic-backports main restricted universe multiverse" >> /etc/apt/sources.list && \
apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get install -yq software-properties-common libstdc++6:i386 zlib1g:i386 libncurses5:i386 \
locales ca-certificates apt-transport-https curl unzip redir iproute2 \
openjdk-8-jdk xvfb x11vnc fluxbox nano libpulse0 telnet expect\
--no-install-recommends && \
locale-gen en_US.UTF-8 && \
# Install Android SDK
curl -L $LINK_ANDROID_SDK > /tmp/android-sdk-linux.zip && \
unzip -q /tmp/android-sdk-linux.zip -d /opt/android-sdk-linux/ && \
rm /tmp/android-sdk-linux.zip && \
# Customized steps per specific platform
yes | sdkmanager --no_https --licenses && \
yes | sdkmanager emulator tools platform-tools "platforms;{{ platform }}" "system-images;{{ platform }};google_apis;x86" --verbose | uniq && \
echo no | avdmanager create avd -n "x86" --package "system-images;{{ platform }};google_apis;x86" --tag google_apis && \
# Unfilter devices (now local because CI downloads from github are unstable)
# curl -o /root/.android/adb_usb.ini https://raw.githubusercontent.com/apkudo/adbusbini/master/adb_usb.ini && \
DEBIAN_FRONTEND=noninteractive apt-get purge -yq unzip openjdk-8-jdk && \
# Convert large partitions to qcow2 to save space
qemu-img convert -O qcow2 -c /opt/android-sdk-linux/system-images/{{ platform }}/google_apis/x86/system.img /opt/android-sdk-linux/system-images/{{ platform }}/google_apis/x86/system.qcow2 && \
mv /opt/android-sdk-linux/system-images/{{ platform }}/google_apis/x86/system.qcow2 /opt/android-sdk-linux/system-images/{{ platform }}/google_apis/x86/system.img && \
qemu-img convert -O qcow2 -c /opt/android-sdk-linux/system-images/{{ platform }}/google_apis/x86/userdata.img /opt/android-sdk-linux/system-images/{{ platform }}/google_apis/x86/userdata.qcow2 && \
mv /opt/android-sdk-linux/system-images/{{ platform }}/google_apis/x86/userdata.qcow2 /opt/android-sdk-linux/system-images/{{ platform }}/google_apis/x86/userdata.img && \
qemu-img resize /root/.android/avd/x86.avd/userdata.img 2G && \
e2fsck -fy /root/.android/avd/x86.avd/userdata.img && \
resize2fs /root/.android/avd/x86.avd/userdata.img && \
qemu-img convert -O qcow2 -c /root/.android/avd/x86.avd/userdata.img /root/.android/avd/x86.avd/userdata.qcow2 && \
mv /root/.android/avd/x86.avd/userdata.qcow2 /root/.android/avd/x86.avd/userdata.img && \
(qemu-img convert -O qcow2 -c /opt/android-sdk-linux/system-images/{{ platform }}/google_apis/x86/vendor.img /opt/android-sdk-linux/system-images/{{ platform }}/google_apis/x86/vendor.qcow2 && \
mv /opt/android-sdk-linux/system-images/{{ platform }}/google_apis/x86/vendor.qcow2 /opt/android-sdk-linux/system-images/{{ platform }}/google_apis/x86/vendor.img || true) && \
# Clean up
apt-get -yq autoremove && \
apt-get clean && \
apt-get autoclean && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
COPY config.ini /root/.android/avd/x86.avd/config.ini
# Expose adb
EXPOSE 5037 5554 5555 5900
# Add script
COPY start.sh /start.sh
RUN chmod +x /start.sh
CMD ["/start.sh"]

View File

@@ -1,16 +1,16 @@
OWNER=agoda
REGISTRY ?= images.caffeinetux.com
PROJECT ?= library
IMAGE_NAME=docker-emulator-{{ platform }}
VCS_REF=`git rev-parse --short HEAD`
IMAGE_VERSION ?= 1.0.0
PROXY ?=
QNAME=$(PROXY)$(OWNER)/$(IMAGE_NAME)
QNAME=$(REGISTRY)/$(PROJECT)/$(IMAGE_NAME)
GIT_TAG=$(QNAME):$(VCS_REF)
BUILD_TAG=$(QNAME):$(IMAGE_VERSION)
LATEST_TAG=$(QNAME):latest
SNAPSHOT_IMAGE_NAME=docker-emulator-snapshot-{{ platform }}
SNAPSHOT_QNAME=$(PROXY)$(OWNER)/$(SNAPSHOT_IMAGE_NAME)
SNAPSHOT_QNAME=$(REGISTRY)/$(PROJECT)/$(SNAPSHOT_IMAGE_NAME)
SNAPSHOT_GIT_TAG=$(SNAPSHOT_QNAME):$(VCS_REF)
SNAPSHOT_BUILD_TAG=$(SNAPSHOT_QNAME):$(IMAGE_VERSION)
SNAPSHOT_LATEST_TAG=$(SNAPSHOT_QNAME):latest

View File

@@ -1,39 +1,40 @@
avd.ini.encoding=UTF-8
AvdId=x86
PlayStore.enabled=true
abi.type=x86
avd.ini.displayname=x86
disk.dataPartition.size=800M
abi.type=x86_64
disk.dataPartition.size=2G
fastboot.forceColdBoot=no
hw.accelerometer=yes
hw.arc=false
hw.audioInput=no
hw.audioOutput=no
hw.battery=yes
hw.camera.back=none
hw.camera.front=none
hw.cpu.arch=x86
hw.cpu.arch=x86_64
hw.cpu.ncore=2
hw.dPad=no
hw.device.hash2=MD5:1be89bc42ec9644d4b77968b23474980
hw.device.hash2=MD5:6b5943207fe196d842659d2e43022e20
hw.device.manufacturer=Google
hw.device.name=Nexus 5X
hw.device.name=pixel_2
hw.gps=yes
hw.gpu.enabled=on
hw.gpu.enabled=yes
hw.gpu.mode=swiftshader_indirect
hw.initialOrientation=Portrait
hw.keyboard=no
hw.lcd.density=160
hw.keyboard=yes
hw.lcd.density=420
hw.lcd.height=1920
hw.lcd.width=1080
hw.mainKeys=no
hw.ramSize=1536
hw.ramSize=2048
hw.sdCard=no
hw.sensors.orientation=yes
hw.sensors.proximity=yes
hw.trackBall=no
image.sysdir.1=system-images/{{ platform }}/google_apis/x86/
runtime.network.latency=none
runtime.network.speed=full
image.sysdir.1=system-images/{{ platform }}/google_apis/x86_64/
showDeviceFrame=no
skin.dynamic=yes
skin.name=480x800
skin.name=1080x1920
skin.path=_no_skin
skin.path.backup=_no_skin
tag.display=Google APIs
tag.id=google_apis
vm.heapSize=192
vm.heapSize=256

39
templates/config.ini.old Normal file
View File

@@ -0,0 +1,39 @@
avd.ini.encoding=UTF-8
AvdId=x86
PlayStore.enabled=true
abi.type=x86
avd.ini.displayname=x86
disk.dataPartition.size=800M
hw.accelerometer=yes
hw.audioInput=no
hw.battery=yes
hw.camera.back=none
hw.camera.front=none
hw.cpu.arch=x86
hw.cpu.ncore=2
hw.dPad=no
hw.device.hash2=MD5:1be89bc42ec9644d4b77968b23474980
hw.device.manufacturer=Google
hw.device.name=Nexus 5X
hw.gps=yes
hw.gpu.enabled=on
hw.gpu.mode=swiftshader_indirect
hw.initialOrientation=Portrait
hw.keyboard=no
hw.lcd.density=160
hw.mainKeys=no
hw.ramSize=1536
hw.sensors.orientation=yes
hw.sensors.proximity=yes
hw.trackBall=no
image.sysdir.1=system-images/{{ platform }}/google_apis/x86/
runtime.network.latency=none
runtime.network.speed=full
showDeviceFrame=no
skin.dynamic=yes
skin.name=480x800
skin.path=_no_skin
skin.path.backup=_no_skin
tag.display=Google APIs
tag.id=google_apis
vm.heapSize=192

View File

@@ -4,42 +4,41 @@ adb_port=$ADB_PORT
adb_server_port=$ADB_SERVER_PORT
emulator_opts=$EMULATOR_OPTS
if [ -z "$console_port" ]
then
if [ -z "$console_port" ]; then
console_port="5554"
fi
if [ -z "$adb_port" ]
then
if [ -z "$adb_port" ]; then
adb_port="5555"
fi
if [ -z "$adb_server_port" ]
then
if [ -z "$adb_server_port" ]; then
adb_server_port="5037"
fi
if [ -z "$emulator_opts" ]
then
emulator_opts="-screen multi-touch -no-boot-anim -noaudio -nojni -netfast -verbose -camera-back none -camera-front none -skip-adb-auth -snapshot default -no-snapshot-save"
if [ -z "$emulator_opts" ]; then
emulator_opts="-screen multi-touch -no-boot-anim -noaudio -no-window -gpu swiftshader_indirect -camera-back none -camera-front none -skip-adb-auth -no-snapshot-save"
fi
# Detect ip and forward ADB ports outside to outside interface
ip=$(ip addr list eth0|grep "inet "|cut -d' ' -f6|cut -d/ -f1)
ip=$(ip addr list eth0 | grep "inet " | cut -d' ' -f6 | cut -d/ -f1)
redir --laddr=$ip --lport=$adb_server_port --caddr=127.0.0.1 --cport=$adb_server_port &
redir --laddr=$ip --lport=$console_port --caddr=127.0.0.1 --cport=$console_port &
redir --laddr=$ip --lport=$adb_port --caddr=127.0.0.1 --cport=$adb_port &
function clean_up {
echo "Cleaning up"
rm /tmp/.X1-lock
rm -f /tmp/.X1-lock
kill $XVFB_PID
kill $FLUXBOX_PID
kill $VNC_PID
kill $XVFB_PID 2>/dev/null
kill $FLUXBOX_PID 2>/dev/null
kill $VNC_PID 2>/dev/null
exit
}
trap clean_up SIGHUP SIGINT SIGTERM
export DISPLAY=:1
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/android-sdk-linux/emulator/lib64/qt/lib:/opt/android-sdk-linux/emulator/lib64/libstdc++:/opt/android-sdk-linux/emulator/lib64:/opt/android-sdk-linux/emulator/lib64/gles_swiftshader
export ANDROID_SDK_ROOT=/opt/android-sdk
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ANDROID_SDK_ROOT/emulator/lib64/qt/lib:$ANDROID_SDK_ROOT/emulator/lib64:$ANDROID_SDK_ROOT/emulator/lib64/gles_swiftshader
Xvfb :1 +extension GLX +extension RANDR +extension RENDER +extension XFIXES -screen 0 1024x768x24 &
XVFB_PID=$!
sleep 1 && fluxbox -display ":1.0" &
@@ -48,14 +47,12 @@ sleep 2 && x11vnc -display :1 -nopw -forever &
VNC_PID=$!
# Set up and run emulator
# qemu references bios by relative path
cd /opt/android-sdk-linux/emulator
cd $ANDROID_SDK_ROOT/emulator
CONFIG="/root/.android/avd/x86.avd/config.ini"
CONFIG="/root/.android/avd/x86_64.avd/config.ini"
CONFIGTMP=${CONFIG}.tmp
if [ -n "$ANDROID_CONFIG" ];
then
if [ -n "$ANDROID_CONFIG" ]; then
IFS=';' read -ra OPTS <<< "$ANDROID_CONFIG"
for OPT in "${OPTS[@]}"; do
IFS='=' read -ra KV <<< "$OPT"
@@ -69,4 +66,5 @@ fi
echo "emulator_opts: $emulator_opts"
LIBGL_DEBUG=verbose ./qemu/linux-x86_64/qemu-system-x86_64 -avd x86 -ports $console_port,$adb_port $emulator_opts -qemu $QEMU_OPTS
# Use the emulator binary directly
$ANDROID_SDK_ROOT/emulator/emulator -avd x86_64 -ports $console_port,$adb_port $emulator_opts

72
templates/start.sh.old Normal file
View File

@@ -0,0 +1,72 @@
#!/usr/bin/env bash
console_port=$CONSOLE_PORT
adb_port=$ADB_PORT
adb_server_port=$ADB_SERVER_PORT
emulator_opts=$EMULATOR_OPTS
if [ -z "$console_port" ]
then
console_port="5554"
fi
if [ -z "$adb_port" ]
then
adb_port="5555"
fi
if [ -z "$adb_server_port" ]
then
adb_server_port="5037"
fi
if [ -z "$emulator_opts" ]
then
emulator_opts="-screen multi-touch -no-boot-anim -noaudio -nojni -netfast -verbose -camera-back none -camera-front none -skip-adb-auth -snapshot default -no-snapshot-save"
fi
# Detect ip and forward ADB ports outside to outside interface
ip=$(ip addr list eth0|grep "inet "|cut -d' ' -f6|cut -d/ -f1)
redir --laddr=$ip --lport=$adb_server_port --caddr=127.0.0.1 --cport=$adb_server_port &
redir --laddr=$ip --lport=$console_port --caddr=127.0.0.1 --cport=$console_port &
redir --laddr=$ip --lport=$adb_port --caddr=127.0.0.1 --cport=$adb_port &
function clean_up {
echo "Cleaning up"
rm /tmp/.X1-lock
kill $XVFB_PID
kill $FLUXBOX_PID
kill $VNC_PID
exit
}
trap clean_up SIGHUP SIGINT SIGTERM
export DISPLAY=:1
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/android-sdk-linux/emulator/lib64/qt/lib:/opt/android-sdk-linux/emulator/lib64/libstdc++:/opt/android-sdk-linux/emulator/lib64:/opt/android-sdk-linux/emulator/lib64/gles_swiftshader
Xvfb :1 +extension GLX +extension RANDR +extension RENDER +extension XFIXES -screen 0 1024x768x24 &
XVFB_PID=$!
sleep 1 && fluxbox -display ":1.0" &
FLUXBOX_PID=$!
sleep 2 && x11vnc -display :1 -nopw -forever &
VNC_PID=$!
# Set up and run emulator
# qemu references bios by relative path
cd /opt/android-sdk-linux/emulator
CONFIG="/root/.android/avd/x86.avd/config.ini"
CONFIGTMP=${CONFIG}.tmp
if [ -n "$ANDROID_CONFIG" ];
then
IFS=';' read -ra OPTS <<< "$ANDROID_CONFIG"
for OPT in "${OPTS[@]}"; do
IFS='=' read -ra KV <<< "$OPT"
KEY=${KV[0]}
VALUE=${KV[1]}
mv ${CONFIG} ${CONFIGTMP}
cat ${CONFIGTMP} | grep -v ${KEY}= > ${CONFIG}
echo ${OPT} >> ${CONFIG}
done
fi
echo "emulator_opts: $emulator_opts"
LIBGL_DEBUG=verbose ./qemu/linux-x86_64/qemu-system-x86_64 -avd x86 -ports $console_port,$adb_port $emulator_opts -qemu $QEMU_OPTS