diff --git a/templates/Dockerfile b/templates/Dockerfile index 56c66be..08d8b81 100644 --- a/templates/Dockerfile +++ b/templates/Dockerfile @@ -1,56 +1,84 @@ FROM ubuntu:18.04 -MAINTAINER Anton Malinskiy "anton@malinskiy.com" +ARG ANDROID_SDK_TOOLS='7302050' + +ENV LANG=en_US.UTF-8 +ENV LANGUAGE=en_US:en +ENV LC_ALL=en_US.UTF-8 +ENV ANDROID_SDK_ROOT=/opt +ENV PATH="$PATH:/opt/cmdline-tools/tools/bin:/opt/platform-tools:/opt/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 \ + && apt-get install -y --no-install-recommends \ + apt-transport-https \ + ca-certificates \ + curl \ + expect \ + fluxbox \ + iproute2 \ + libc6:i386 \ + libgcc1:i386 \ + libncurses5:i386 \ + libstdc++6:i386 \ + libtinfo5:i386 \ + libasound2 \ + libgl1 \ + libnss3 \ + libpulse0 \ + libxcomposite1 \ + libxcursor1 \ + libxi6 \ + locales \ + nano \ + openjdk-8-jdk \ + redir \ + software-properties-common \ + telnet \ + unzip \ + x11vnc \ + xvfb \ + zlib1g:i386 \ + && locale-gen en_US.UTF-8 # 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 && \ +# Install Android SDK +RUN curl -L https://dl.google.com/android/repository/commandlinetools-linux-${ANDROID_SDK_TOOLS}_latest.zip > /tmp/android-sdk-linux.zip \ + && unzip -q /tmp/android-sdk-linux.zip -d ${ANDROID_SDK_ROOT}/cmdline-tools/ \ + && rm /tmp/android-sdk-linux.zip \ + && mv ${ANDROID_SDK_ROOT}/cmdline-tools/cmdline-tools ${ANDROID_SDK_ROOT}/cmdline-tools/tools \ + \ # 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) && \ + && yes | sdkmanager --no_https --licenses \ + && sdkmanager platform-tools --verbose \ + "platforms;{{ platform }}" \ + "system-images;{{ platform }};google_apis;x86" | uniq \ + && echo no | avdmanager create avd -n "x86" --package "system-images;{{ platform }};google_apis;x86" --tag google_apis \ + \ # Clean up - apt-get -yq autoremove && \ - apt-get clean && \ - apt-get autoclean && \ - rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + && apt-get purge -yq unzip openjdk-8-jdk \ + && apt-get -yq autoremove \ + && apt-get clean \ + && apt-get autoclean \ + && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + +# Convert large partitions to qcow2 to save space +RUN qemu-img convert -O qcow2 -c ${ANDROID_SDK_ROOT}/system-images/{{ platform }}/google_apis/x86/system.img ${ANDROID_SDK_ROOT}/system-images/{{ platform }}/google_apis/x86/system.qcow2 \ + && mv ${ANDROID_SDK_ROOT}/system-images/{{ platform }}/google_apis/x86/system.qcow2 ${ANDROID_SDK_ROOT}/system-images/{{ platform }}/google_apis/x86/system.img \ + \ + && qemu-img convert -O qcow2 -c ${ANDROID_SDK_ROOT}/system-images/{{ platform }}/google_apis/x86/userdata.img ${ANDROID_SDK_ROOT}/system-images/{{ platform }}/google_apis/x86/userdata.qcow2 \ + && mv ${ANDROID_SDK_ROOT}/system-images/{{ platform }}/google_apis/x86/userdata.qcow2 ${ANDROID_SDK_ROOT}/system-images/{{ platform }}/google_apis/x86/userdata.img \ + \ + && qemu-img resize -f raw /root/.android/avd/x86.avd/userdata.img 4096M \ + \ + && (qemu-img convert -O qcow2 -c ${ANDROID_SDK_ROOT}/system-images/{{ platform }}/google_apis/x86/vendor.img ${ANDROID_SDK_ROOT}/system-images/{{ platform }}/google_apis/x86/vendor.qcow2 \ + && mv ${ANDROID_SDK_ROOT}/system-images/{{ platform }}/google_apis/x86/vendor.qcow2 ${ANDROID_SDK_ROOT}/system-images/{{ platform }}/google_apis/x86/vendor.img || true) COPY config.ini /root/.android/avd/x86.avd/config.ini diff --git a/templates/Makefile b/templates/Makefile index 4504e9a..74f5a55 100644 --- a/templates/Makefile +++ b/templates/Makefile @@ -4,6 +4,7 @@ VCS_REF=`git rev-parse --short HEAD` IMAGE_VERSION ?= 1.0.0 PROXY ?= QNAME=$(PROXY)$(OWNER)/$(IMAGE_NAME) +ADDITIONAL_BUILD_OPTIONS ?= GIT_TAG=$(QNAME):$(VCS_REF) BUILD_TAG=$(QNAME):$(IMAGE_VERSION) @@ -21,6 +22,7 @@ build: docker build \ --build-arg VCS_REF=$(VCS_REF) \ --build-arg IMAGE_VERSION=$(IMAGE_VERSION) \ + $(ADDITIONAL_BUILD_OPTIONS) \ -t $(LATEST_TAG) $(ROOT_DIR) snapshot: diff --git a/templates/config.ini b/templates/config.ini index bb9f4b7..e64d8ea 100644 --- a/templates/config.ini +++ b/templates/config.ini @@ -3,26 +3,26 @@ AvdId=x86 PlayStore.enabled=true abi.type=x86 avd.ini.displayname=x86 -disk.dataPartition.size=800M +disk.dataPartition.size=4096M 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.cpu.ncore=4 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.enabled=yes hw.gpu.mode=swiftshader_indirect hw.initialOrientation=Portrait hw.keyboard=no hw.lcd.density=160 hw.mainKeys=no -hw.ramSize=1536 +hw.ramSize=4096M hw.sensors.orientation=yes hw.sensors.proximity=yes hw.trackBall=no @@ -36,4 +36,4 @@ skin.path=_no_skin skin.path.backup=_no_skin tag.display=Google APIs tag.id=google_apis -vm.heapSize=192 +vm.heapSize=512 diff --git a/templates/snapshot.sh b/templates/snapshot.sh index 7d4a29a..346afa6 100644 --- a/templates/snapshot.sh +++ b/templates/snapshot.sh @@ -16,11 +16,11 @@ function clean_up { echo "Starting emulator" 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 LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/emulator/lib64/qt/lib:/opt/emulator/lib64/libstdc++:/opt/emulator/lib64:/opt/emulator/lib64/gles_swiftshader Xvfb :1 +extension GLX +extension RANDR +extension RENDER +extension XFIXES -screen 0 1024x768x24 & XVFB_PID=$! -cd /opt/android-sdk-linux/emulator +cd /opt/emulator LIBGL_DEBUG=verbose ./qemu/linux-x86_64/qemu-system-x86_64 -avd x86 -snapshot default -no-snapshot-save & EMULATOR_PID=$! @@ -49,7 +49,7 @@ adb emu kill # mv /root/.android/avd/x86.avd/userdata-qemu.img_qcow2 /root/.android/avd/x86.avd/userdata-qemu.img # Moving adb binary away so that stopping adb server with delay will release the emulator and will make it available for external connections -mv /opt/android-sdk-linux/platform-tools/adb /opt/android-sdk-linux/platform-tools/_adb +mv /opt/platform-tools/adb /opt/platform-tools/_adb echo "Great Scott!" clean_up diff --git a/templates/start.sh b/templates/start.sh index 2f01229..abc076d 100644 --- a/templates/start.sh +++ b/templates/start.sh @@ -39,7 +39,7 @@ function clean_up { 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 LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/emulator/lib64/qt/lib:/opt/emulator/lib64/libstdc++:/opt/emulator/lib64:/opt/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" & @@ -49,7 +49,7 @@ VNC_PID=$! # Set up and run emulator # qemu references bios by relative path -cd /opt/android-sdk-linux/emulator +cd /opt/emulator CONFIG="/root/.android/avd/x86.avd/config.ini" CONFIGTMP=${CONFIG}.tmp