diff --git a/Dockerfile b/Dockerfile index 9eeb8f4..e382c84 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,9 +4,9 @@ ENV DEBIAN_FRONTEND noninteractive #WORKDIR / #============================= -# Install Dependenices +# Install Dependenices #============================= -SHELL ["/bin/bash", "-c"] +SHELL ["/bin/bash", "-c"] RUN apt update && apt install -y curl \ sudo wget unzip bzip2 libdrm-dev \ @@ -41,7 +41,8 @@ ENV ANDROID_SDK_ROOT=/opt/android \ ABI=${IMG_TYPE}/${ARCHITECTURE} \ GPU_ACCELERATED=$GPU_ACCELERATED \ QTWEBENGINE_DISABLE_SANDBOX=1 \ - ANDROID_EMULATOR_WAIT_TIME_BEFORE_KILL=10 + ANDROID_EMULATOR_WAIT_TIME_BEFORE_KILL=10 \ + ANDROID_AVD_HOME=/data # Exporting environment variables to keep in the path # Android SDK binaries and shared libraries. @@ -59,7 +60,8 @@ EXPOSE 5554 5555 # Initializing the required directories. RUN mkdir /root/.android/ && \ - touch /root/.android/repositories.cfg + touch /root/.android/repositories.cfg && \ + mkdir /data # Exporting ADB keys. #COPY keys/* /root/.android/ diff --git a/Dockerfile.gpu b/Dockerfile.gpu index 31f058a..e7ff2c8 100644 --- a/Dockerfile.gpu +++ b/Dockerfile.gpu @@ -44,7 +44,8 @@ ENV ANDROID_SDK_ROOT=/opt/android \ ABI=${IMG_TYPE}/${ARCHITECTURE} \ GPU_ACCELERATED=$GPU_ACCELERATED \ QTWEBENGINE_DISABLE_SANDBOX=1 \ - ANDROID_EMULATOR_WAIT_TIME_BEFORE_KILL=10 + ANDROID_EMULATOR_WAIT_TIME_BEFORE_KILL=10 \ + ANDROID_AVD_HOME=/data # Exporting environment variables for keeping in the path # Android SDK binaries and shared libraries. @@ -62,7 +63,8 @@ EXPOSE 5554 5555 # Initializing the required directories. RUN mkdir /root/.android/ && \ - touch /root/.android/repositories.cfg + touch /root/.android/repositories.cfg && \ + mkdir /data # Exporting ADB keys. #COPY keys/* /root/.android/ diff --git a/README.md b/README.md index b2ff15c..edfed3e 100644 --- a/README.md +++ b/README.md @@ -76,7 +76,6 @@ You can generate one by running `adb keygen adbkey`, that generates 2 files - ad override them inside ./keys directory. - ### Running the container Once the image is built, you can mount your KVM driver on the container and expose its ADB port. @@ -87,6 +86,14 @@ Once the image is built, you can mount your KVM driver on the container and expo docker run -it --rm --device /dev/kvm -p 5555:5555 android-emulator ``` +### Save data/storage after restart (wipe) + +All avd save in docker dir `/data`, name for avd is `android` + +```bash +docker run -it --rm --device /dev/kvm -p 5555:5555 -v ~/android_avd:/data android-emulator +``` + ### Connect ADB to the container The ADB server in the container will be spawned automatically and listen on all interfaces in the container. After a few seconds, once the kernel has booted, you will be able to connect ADB to the container. @@ -142,15 +149,22 @@ docker build \ ``` ### Variables +## Default variables #### Disable animation DISABLE_ANIMATION=false #### Disable hidden policy -DISABLE_HIDDEN_POLICY=true +DISABLE_HIDDEN_POLICY=false -#### skip adb authentication -SKIP_AUTH=false +#### Skip adb authentication +SKIP_AUTH=true + +#### Memory for emulator +MEMORY=8192 + +#### Cores for emulator +CORES=4 ### Mount an external drive in the container diff --git a/docker-compose.yml b/docker-compose.yml index 4df14ef..826cf31 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,7 @@ version: "4" services: android-emulator: - build: + build: context: . args: - API_LEVEL=34 @@ -15,14 +15,17 @@ services: - DISABLE_HIDDEN_POLICY=true - SKIP_AUTH=false #- ANDROID_ADB_SERVER_ADDRESS=host.docker.internal - privileged: true + - MEMORY=16384 + - CORES=16 + privileged: true tty: true stdin_open: true volumes: - ./keys/adbkey:/root/.android/adbkey:ro - ./keys/adbkey.pub:/root/.android/adbkey.pub:ro + - ./android_avd:/data extra_hosts: - - "host.docker.internal:host-gateway" + - "host.docker.internal:host-gateway" android-emulator-cuda: build: @@ -40,14 +43,16 @@ services: - DISABLE_HIDDEN_POLICY=true - SKIP_AUTH=false #- ANDROID_ADB_SERVER_ADDRESS=host.docker.internal - privileged: true + - MEMORY=16384 + - CORES=16 + privileged: true tty: true stdin_open: true volumes: - ./keys/adbkey:/root/.android/adbkey:ro - ./keys/adbkey.pub:/root/.android/adbkey.pub:ro extra_hosts: - - "host.docker.internal:host-gateway" + - "host.docker.internal:host-gateway" deploy: resources: reservations: @@ -72,7 +77,9 @@ services: - DISABLE_HIDDEN_POLICY=true - SKIP_AUTH=false #- ANDROID_ADB_SERVER_ADDRESS=host.docker.internal - privileged: true + - MEMORY=16384 + - CORES=16 + privileged: true tty: true stdin_open: true volumes: @@ -81,7 +88,7 @@ services: # volumes: # - ./:/mnt extra_hosts: - - "host.docker.internal:host-gateway" + - "host.docker.internal:host-gateway" deploy: resources: reservations: @@ -89,4 +96,3 @@ services: - driver: nvidia count: 1 capabilities: [gpu] - \ No newline at end of file diff --git a/scripts/start-emulator.sh b/scripts/start-emulator.sh index 36e1868..da705c5 100644 --- a/scripts/start-emulator.sh +++ b/scripts/start-emulator.sh @@ -4,13 +4,13 @@ set -e source ./emulator-monitoring.sh -# The emulator console port. +# The emulator console port. EMULATOR_CONSOLE_PORT=5554 # The ADB port used to connect to ADB. ADB_PORT=5555 -MEMORY=16048 -CORES=10 -SKIP_AUTH=true +OPT_MEMORY=${MEMORY:-8192} +OPT_CORES=${CORES:-4} +OPT_SKIP_AUTH=${SKIP_AUTH:-true} AUTH_FLAG= # Start ADB server by listening on all interfaces. echo "Starting the ADB server ..." @@ -25,16 +25,21 @@ socat tcp-listen:"$ADB_PORT",bind="$LOCAL_IP",fork tcp:127.0.0.1:"$ADB_PORT" & export USER=root # Creating the Android Virtual Emulator. -echo "Creating the Android Virtual Emulator ..." -echo "Using package '$PACKAGE_PATH', ABI '$ABI' and device '$DEVICE_ID' for creating the emulator" -echo no | avdmanager create avd \ - --force \ - --name android \ - --abi "$ABI" \ - --package "$PACKAGE_PATH" \ - --device "$DEVICE_ID" +TEST_AVD="$(emulator -list-avds | grep android)" +if [ -z "$TEST_AVD" ]; then + echo "Use the exists Android Virtual Emulator ..." +else + echo "Creating the Android Virtual Emulator ..." + echo "Using package '$PACKAGE_PATH', ABI '$ABI' and device '$DEVICE_ID' for creating the emulator" + echo no | avdmanager create avd \ + --force \ + --name android \ + --abi "$ABI" \ + --package "$PACKAGE_PATH" \ + --device "$DEVICE_ID" +fi -if [ "$SKIP_AUTH" == "true" ]; then +if [ "$OPT_SKIP_AUTH" == "true" ]; then AUTH_FLAG="-skip-adb-auth" fi @@ -55,17 +60,18 @@ fi wait_for_boot & # Start the emulator with no audio, no GUI, and no snapshots. -echo "Starting the emulator ... " -echo "OPTIONS: " -echo "GPU - $GPU_MODE" -echo "MEMORY - $MEMORY" -echo "CORES - $CORES" +echo "Starting the emulator ..." +echo "OPTIONS:" +echo "ADB AUTH - $OPT_SKIP_AUTH" +echo "GPU - $GPU_MODE" +echo "MEMORY - $OPT_MEMORY" +echo "CORES - $OPT_CORES" emulator \ -avd android \ -gpu "$GPU_MODE" \ - -memory $MEMORY \ + -memory $OPT_MEMORY \ -no-boot-anim \ - -cores $CORES \ + -cores $OPT_CORES \ -ranchu \ $AUTH_FLAG \ -no-window \ @@ -73,4 +79,4 @@ emulator \ # -qemu \ - # -smp 8,sockets=1,cores=4,threads=2,maxcpus=8 \ No newline at end of file + # -smp 8,sockets=1,cores=4,threads=2,maxcpus=8 \ No newline at end of file