diff --git a/.gitea/workflows/build.yaml b/.gitea/workflows/build.yaml new file mode 100644 index 0000000..bcafe4f --- /dev/null +++ b/.gitea/workflows/build.yaml @@ -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 }} diff --git a/Makefile b/Makefile index 582b7f3..f8a2450 100644 --- a/Makefile +++ b/Makefile @@ -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 \ diff --git a/templates/Dockerfile b/templates/Dockerfile index 56c66be..9e2fabd 100644 --- a/templates/Dockerfile +++ b/templates/Dockerfile @@ -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"] diff --git a/templates/Dockerfile.old b/templates/Dockerfile.old new file mode 100644 index 0000000..56c66be --- /dev/null +++ b/templates/Dockerfile.old @@ -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"] diff --git a/templates/Makefile b/templates/Makefile index 4504e9a..a8f4b15 100644 --- a/templates/Makefile +++ b/templates/Makefile @@ -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 diff --git a/templates/config.ini b/templates/config.ini index bb9f4b7..8586cc4 100644 --- a/templates/config.ini +++ b/templates/config.ini @@ -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 diff --git a/templates/config.ini.old b/templates/config.ini.old new file mode 100644 index 0000000..bb9f4b7 --- /dev/null +++ b/templates/config.ini.old @@ -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 diff --git a/templates/start.sh b/templates/start.sh index 2f01229..33b3fcf 100644 --- a/templates/start.sh +++ b/templates/start.sh @@ -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 diff --git a/templates/start.sh.old b/templates/start.sh.old new file mode 100644 index 0000000..2f01229 --- /dev/null +++ b/templates/start.sh.old @@ -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