Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
118 changes: 73 additions & 45 deletions templates/Dockerfile
Original file line number Diff line number Diff line change
@@ -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

Expand Down
2 changes: 2 additions & 0 deletions templates/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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:
Expand Down
10 changes: 5 additions & 5 deletions templates/config.ini
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
6 changes: 3 additions & 3 deletions templates/snapshot.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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=$!

Expand Down Expand Up @@ -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
4 changes: 2 additions & 2 deletions templates/start.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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" &
Expand All @@ -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
Expand Down