From 2f980d457dfd7d344790b021132aed3ea24670ae Mon Sep 17 00:00:00 2001 From: ppoffice Date: Wed, 7 Oct 2020 17:58:47 -0400 Subject: [PATCH] initial commit --- .gitignore | 1 + Dockerfile | 52 ++++++++ README.md | 45 +++++++ licenses/android-sdk-license | 2 + licenses/android-sdk-preview-license | 2 + tools/android-accept-licenses.sh | 14 +++ tools/android-env.sh | 44 +++++++ tools/android-sdk-update.sh | 64 ++++++++++ tools/android-wait-for-emulator.sh | 30 +++++ tools/entrypoint.sh | 24 ++++ tools/package-list-minimal.txt | 23 ++++ tools/package-list.txt | 182 +++++++++++++++++++++++++++ 12 files changed, 483 insertions(+) create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 licenses/android-sdk-license create mode 100644 licenses/android-sdk-preview-license create mode 100755 tools/android-accept-licenses.sh create mode 100644 tools/android-env.sh create mode 100755 tools/android-sdk-update.sh create mode 100755 tools/android-wait-for-emulator.sh create mode 100755 tools/entrypoint.sh create mode 100644 tools/package-list-minimal.txt create mode 100644 tools/package-list.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..485dee6 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..0541c7a --- /dev/null +++ b/Dockerfile @@ -0,0 +1,52 @@ +FROM ubuntu:18.04 + +ENV ANDROID_SDK_HOME /opt/android-sdk-linux +ENV ANDROID_SDK_ROOT /opt/android-sdk-linux +ENV ANDROID_HOME /opt/android-sdk-linux +ENV ANDROID_SDK /opt/android-sdk-linux + +ENV PATH "${PATH}:${ANDROID_HOME}/platform-tools:${ANDROID_HOME}/cmdline-tools/tools/bin:${ANDROID_HOME}/emulator:${ANDROID_HOME}/bin" + +ENV DEBIAN_FRONTEND noninteractive + +# Install required tools +# Dependencies to execute Android builds + +RUN dpkg --add-architecture i386 && apt-get update -yqq && apt-get install -y \ + curl \ + expect \ + git \ + libc6:i386 \ + libgcc1:i386 \ + libncurses5:i386 \ + libstdc++6:i386 \ + zlib1g:i386 \ + openjdk-8-jdk \ + wget \ + unzip \ + vim \ + && apt-get clean + +RUN groupadd android && useradd -d /opt/android-sdk-linux -g android android + +COPY tools /opt/tools + +COPY licenses /opt/licenses + +WORKDIR /opt/android-sdk-linux + +RUN /opt/tools/entrypoint.sh built-in + +RUN /opt/android-sdk-linux/cmdline-tools/tools/bin/sdkmanager "cmdline-tools;latest" + +RUN /opt/android-sdk-linux/cmdline-tools/tools/bin/sdkmanager "build-tools;30.0.2" + +RUN /opt/android-sdk-linux/cmdline-tools/tools/bin/sdkmanager "platforms;android-30" + +RUN /opt/android-sdk-linux/cmdline-tools/tools/bin/sdkmanager "platform-tools" + +RUN /opt/android-sdk-linux/cmdline-tools/tools/bin/sdkmanager "emulator" + +RUN /opt/android-sdk-linux/cmdline-tools/tools/bin/sdkmanager "system-images;android-30;google_apis;x86_64" + +CMD /opt/tools/entrypoint.sh built-in diff --git a/README.md b/README.md new file mode 100644 index 0000000..0bb4757 --- /dev/null +++ b/README.md @@ -0,0 +1,45 @@ +# Docker for Android SDK 30 + +Docker for Android SDK 30 with preinstalled build tools and emulator image + +> Edit from [mindrunner/docker-android-sdk](https://github.com/mindrunner/docker-android-sdk) + +**Installed Packages** +```bash +# sdkmanager --list + Path | Version | Description | Location + ------- | ------- | ------- | ------- + build-tools;30.0.2 | 30.0.2 | Android SDK Build-Tools 30.0.2 | build-tools/30.0.2/ + cmdline-tools;latest | 2.1 | Android SDK Command-line Tools (latest) | cmdline-tools/latest/ + emulator | 30.1.5 | Android Emulator | emulator/ + patcher;v4 | 1 | SDK Patch Applier v4 | patcher/v4/ + platform-tools | 30.0.4 | Android SDK Platform-Tools | platform-tools/ + platforms;android-30 | 3 | Android SDK Platform 30 | platforms/android-30/ + system-images;android-30;google_apis;x86_64 | 8 | Google APIs Intel x86 Atom_64 System Image | system-images/android-30/google_apis/x86_64/ +``` + +**Usage** + +- Interactive way + ```bash + $ docker run -it --rm --privileged androidsdk/android-30:latest bash + # check installed packages + $ sdkmanager --list + # create and run emulator + $ avdmanager create avd -n first_avd --abi google_apis/x86_64 -k "system-images;android-30;google_apis;x86_64" + $ emulator -avd first_avd -no-window -no-audio & + $ adb devices + # You can also run other Android platform tools, which are all added to the PATH environment variable + ``` + + To connect the emulator using `adb` on the docker host machine, start the container with `--net=host`. + You could also use [`scrcpy`](https://github.com/Genymobile/scrcpy) to do a screencast of the emulator. + +- Non-interactive way + ```bash + # check installed packages + $ docker run -it --rm androidsdk/android-30:latest sdkmanager --list + # list existing emulators + $ docker run -it --rm androidsdk/android-30:latest avdmanager list avd + # You can also run other Android platform tools, which are all added to the PATH environment variable + ``` \ No newline at end of file diff --git a/licenses/android-sdk-license b/licenses/android-sdk-license new file mode 100644 index 0000000..ff1da21 --- /dev/null +++ b/licenses/android-sdk-license @@ -0,0 +1,2 @@ + +8933bad161af4178b1185d1a37fbf41ea5269c55 diff --git a/licenses/android-sdk-preview-license b/licenses/android-sdk-preview-license new file mode 100644 index 0000000..74069f8 --- /dev/null +++ b/licenses/android-sdk-preview-license @@ -0,0 +1,2 @@ + +84831b9409646a918e30573bab4c9c91346d8abd diff --git a/tools/android-accept-licenses.sh b/tools/android-accept-licenses.sh new file mode 100755 index 0000000..fa3e4a0 --- /dev/null +++ b/tools/android-accept-licenses.sh @@ -0,0 +1,14 @@ +#!/usr/bin/expect -f + +set timeout 1800 +set cmd [lindex $argv 0] +set licenses [lindex $argv 1] + +spawn {*}$cmd +expect { + "(y/N)" { + exp_send "y\r" + exp_continue + } + eof +} diff --git a/tools/android-env.sh b/tools/android-env.sh new file mode 100644 index 0000000..160aba6 --- /dev/null +++ b/tools/android-env.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash + +export ANDROID_HOME=/opt/android-sdk-linux +export ANDROID_SDK_ROOT=${ANDROID_HOME} +export ANDROID_SDK_HOME=${ANDROID_HOME} +export ANDROID_SDK=${ANDROID_HOME} + +export PATH=${PATH}:${ANDROID_HOME}/cmdline-tools/tools/bin:${ANDROID_HOME}/platform-tools:${ANDROID_HOME}/emulator:${ANDROID_HOME}/bin: + +function print_header() { + figlet SBB CFF FFS + figlet welcome to + figlet andep + echo '' + echo '' + echo '' +} + +function help() { + figlet "usage:" + echo "update_sdk: Updates the SDK" + echo "andep: Installs one or more android Packets." + echo " -Example: anddep \"platforms;android-26\"" + echo "help: Shows this help" + echo '' + echo '' + echo '' +} + +function update_sdk() { + android-accept-licenses.sh "sdkmanager --update" +} + +function andep() { + if [ -z ${1} ]; then + help + return 1 + fi + android-accept-licenses.sh "sdkmanager ${1}" +} + +export -f help +export -f update_sdk +export -f andep diff --git a/tools/android-sdk-update.sh b/tools/android-sdk-update.sh new file mode 100755 index 0000000..8481379 --- /dev/null +++ b/tools/android-sdk-update.sh @@ -0,0 +1,64 @@ +#!/bin/bash + +mkdir -p /opt/android-sdk-linux/bin/ +cp /opt/tools/android-env.sh /opt/android-sdk-linux/bin/ +source /opt/android-sdk-linux/bin/android-env.sh + +built_in_sdk=1 + + +echo $# + +echo $1 + +if [ $# -ge 0 ] && [ "$1" == "lazy-dl" ] +then + echo "Using Lazy Download Flavour" + built_in_sdk=0 +elif [ $# -ge 0 ] && [ "$1" == "built-in" ] +then + echo "Using Built-In SDK Flavour" + built_in_sdk=1 +else + echo "Please use either built-in or lazy-dl as parameter" + exit 1 +fi + +cd ${ANDROID_HOME} +echo "Set ANDROID_HOME to ${ANDROID_HOME}" + +if [ -f commandlinetools-linux.zip ] +then + echo "SDK Tools already bootstrapped. Skipping initial setup" +else + echo "Bootstrapping SDK-Tools" + wget -q https://dl.google.com/android/repository/commandlinetools-linux-6609375_latest.zip -O commandlinetools-linux.zip + unzip commandlinetools-linux.zip + mkdir cmdline-tools + mv tools cmdline-tools/ +fi + +echo "Make sure repositories.cfg exists" +mkdir -p ~/.android/ +touch ~/.android/repositories.cfg + +echo "Copying Licences" +cp -rv /opt/licenses ${ANDROID_HOME}/licenses + +echo "Copying Tools" +mkdir -p ${ANDROID_HOME}/bin +cp -v /opt/tools/*.sh ${ANDROID_HOME}/bin + +echo "Installing packages" +if [ $built_in_sdk -eq 1 ] +then + android-accept-licenses.sh "sdkmanager --package_file=/opt/tools/package-list-minimal.txt --verbose" +else + android-accept-licenses.sh "sdkmanager --package_file=/opt/tools/package-list.txt --verbose" +fi + +echo "Updating SDK" +update_sdk + +echo "Accepting Licenses" +android-accept-licenses.sh "sdkmanager --licenses --verbose" diff --git a/tools/android-wait-for-emulator.sh b/tools/android-wait-for-emulator.sh new file mode 100755 index 0000000..0219687 --- /dev/null +++ b/tools/android-wait-for-emulator.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +set +e + +bootcomplete="" +failcounter=0 +timeout=600 +sleeptime=10 +maxfail=$((timeout / sleeptime)) + +until [[ "${bootcomplete}" =~ "1" ]]; do + bootcomplete=`adb -e shell getprop dev.bootcomplete 2>&1 &` + if [[ "${bootcomplete}" =~ "" ]]; then + ((failcounter += 1)) + echo "Waiting for emulator to start" + if [[ ${failcounter} -gt ${maxfail} ]]; then + echo "Timeout ($timeout seconds) reached; failed to start emulator" + while pkill -9 "emulator" >/dev/null 2>&1; do + echo "Killing emulator proces...." + pgrep "emulator" + done + echo "Process terminated" + pgrep "emulator" + exit 1 + fi + fi + sleep ${sleeptime} +done + +echo "Emulator is ready" diff --git a/tools/entrypoint.sh b/tools/entrypoint.sh new file mode 100755 index 0000000..74a629b --- /dev/null +++ b/tools/entrypoint.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +function checkbin() { + type -P su-exec +} + +function su_mt_user() { + su android -c '"$0" "$@"' -- "$@" +} + +chown android:android /opt/android-sdk-linux + +if checkbin; then + exec su-exec android:android /opt/tools/android-sdk-update.sh "$@" +else + su_mt_user /opt/tools/android-sdk-update.sh ${1} +fi + + + + + + + diff --git a/tools/package-list-minimal.txt b/tools/package-list-minimal.txt new file mode 100644 index 0000000..3cf9455 --- /dev/null +++ b/tools/package-list-minimal.txt @@ -0,0 +1,23 @@ +add-ons;addon-google_apis-google-26 +add-ons;addon-google_apis-google-27 +build-tools;26.0.3 +build-tools;27.0.0 +cmake;3.6.4111459 +emulator +extras;android;gapid;1 +extras;android;gapid;3 +extras;android;m2repository +extras;google;auto +extras;google;google_play_services +extras;google;instantapps +extras;google;m2repository +extras;google;market_apk_expansion +extras;google;market_licensing +extras;google;simulators +extras;google;webdriver +extras;m2repository;com;android;support;constraint;constraint-layout;1.0.2 +extras;m2repository;com;android;support;constraint;constraint-layout-solver;1.0.2 +lldb;2.3 +platforms;android-26 +platforms;android-27 +tools diff --git a/tools/package-list.txt b/tools/package-list.txt new file mode 100644 index 0000000..60709b2 --- /dev/null +++ b/tools/package-list.txt @@ -0,0 +1,182 @@ +add-ons;addon-google_apis-google-15 +add-ons;addon-google_apis-google-16 +add-ons;addon-google_apis-google-17 +add-ons;addon-google_apis-google-18 +add-ons;addon-google_apis-google-19 +add-ons;addon-google_apis-google-21 +add-ons;addon-google_apis-google-22 +add-ons;addon-google_apis-google-23 +add-ons;addon-google_apis-google-24 +add-ons;addon-google_gdk-google-19 +build-tools;19.1.0 +build-tools;20.0.0 +build-tools;21.1.2 +build-tools;22.0.1 +build-tools;23.0.1 +build-tools;23.0.2 +build-tools;23.0.3 +build-tools;24.0.0 +build-tools;24.0.1 +build-tools;24.0.2 +build-tools;24.0.3 +build-tools;25.0.0 +build-tools;25.0.1 +build-tools;25.0.2 +build-tools;25.0.3 +build-tools;26.0.0 +build-tools;26.0.2 +build-tools;26.0.3 +build-tools;27.0.0 +cmake;3.6.4111459 +emulator +extras;android;gapid;1 +extras;android;gapid;3 +extras;android;m2repository +extras;google;auto +extras;google;google_play_services +extras;google;instantapps +extras;google;m2repository +extras;google;market_apk_expansion +extras;google;market_licensing +extras;google;simulators +extras;google;webdriver +extras;m2repository;com;android;support;constraint;constraint-layout;1.0.0 +extras;m2repository;com;android;support;constraint;constraint-layout;1.0.0-alpha2 +extras;m2repository;com;android;support;constraint;constraint-layout;1.0.0-alpha3 +extras;m2repository;com;android;support;constraint;constraint-layout;1.0.0-alpha4 +extras;m2repository;com;android;support;constraint;constraint-layout;1.0.0-alpha5 +extras;m2repository;com;android;support;constraint;constraint-layout;1.0.0-alpha6 +extras;m2repository;com;android;support;constraint;constraint-layout;1.0.0-alpha7 +extras;m2repository;com;android;support;constraint;constraint-layout;1.0.0-alpha8 +extras;m2repository;com;android;support;constraint;constraint-layout;1.0.0-alpha9 +extras;m2repository;com;android;support;constraint;constraint-layout;1.0.0-beta1 +extras;m2repository;com;android;support;constraint;constraint-layout;1.0.0-beta2 +extras;m2repository;com;android;support;constraint;constraint-layout;1.0.0-beta3 +extras;m2repository;com;android;support;constraint;constraint-layout;1.0.0-beta4 +extras;m2repository;com;android;support;constraint;constraint-layout;1.0.0-beta5 +extras;m2repository;com;android;support;constraint;constraint-layout;1.0.1 +extras;m2repository;com;android;support;constraint;constraint-layout;1.0.2 +extras;m2repository;com;android;support;constraint;constraint-layout-solver;1.0.0 +extras;m2repository;com;android;support;constraint;constraint-layout-solver;1.0.0-alpha2 +extras;m2repository;com;android;support;constraint;constraint-layout-solver;1.0.0-alpha3 +extras;m2repository;com;android;support;constraint;constraint-layout-solver;1.0.0-alpha4 +extras;m2repository;com;android;support;constraint;constraint-layout-solver;1.0.0-alpha5 +extras;m2repository;com;android;support;constraint;constraint-layout-solver;1.0.0-alpha6 +extras;m2repository;com;android;support;constraint;constraint-layout-solver;1.0.0-alpha7 +extras;m2repository;com;android;support;constraint;constraint-layout-solver;1.0.0-alpha8 +extras;m2repository;com;android;support;constraint;constraint-layout-solver;1.0.0-alpha9 +extras;m2repository;com;android;support;constraint;constraint-layout-solver;1.0.0-beta1 +extras;m2repository;com;android;support;constraint;constraint-layout-solver;1.0.0-beta2 +extras;m2repository;com;android;support;constraint;constraint-layout-solver;1.0.0-beta3 +extras;m2repository;com;android;support;constraint;constraint-layout-solver;1.0.0-beta4 +extras;m2repository;com;android;support;constraint;constraint-layout-solver;1.0.0-beta5 +extras;m2repository;com;android;support;constraint;constraint-layout-solver;1.0.1 +extras;m2repository;com;android;support;constraint;constraint-layout-solver;1.0.2 +lldb;2.3 +platforms;android-10 +platforms;android-11 +platforms;android-12 +platforms;android-13 +platforms;android-14 +platforms;android-15 +platforms;android-16 +platforms;android-17 +platforms;android-18 +platforms;android-19 +platforms;android-20 +platforms;android-21 +platforms;android-22 +platforms;android-23 +platforms;android-24 +platforms;android-25 +platforms;android-26 +platforms;android-7 +platforms;android-8 +platforms;android-9 +sources;android-15 +sources;android-16 +sources;android-17 +sources;android-18 +sources;android-19 +sources;android-20 +sources;android-21 +sources;android-22 +sources;android-23 +sources;android-24 +sources;android-25 +sources;android-26 +sources;android-27 +system-images;android-10;default;armeabi-v7a +system-images;android-10;default;x86 +system-images;android-10;google_apis;armeabi-v7a +system-images;android-10;google_apis;x86 +system-images;android-14;default;armeabi-v7a +system-images;android-15;default;armeabi-v7a +system-images;android-15;default;mips +system-images;android-15;default;x86 +system-images;android-15;google_apis;armeabi-v7a +system-images;android-15;google_apis;x86 +system-images;android-16;default;armeabi-v7a +system-images;android-16;default;mips +system-images;android-16;default;x86 +system-images;android-16;google_apis;x86 +system-images;android-17;default;armeabi-v7a +system-images;android-17;default;mips +system-images;android-17;default;x86 +system-images;android-17;google_apis;armeabi-v7a +system-images;android-17;google_apis;x86 +system-images;android-18;default;armeabi-v7a +system-images;android-18;default;x86 +system-images;android-18;google_apis;armeabi-v7a +system-images;android-18;google_apis;x86 +system-images;android-19;default;armeabi-v7a +system-images;android-19;default;x86 +system-images;android-19;google_apis;armeabi-v7a +system-images;android-19;google_apis;x86 +system-images;android-21;android-tv;armeabi-v7a +system-images;android-21;android-tv;x86 +system-images;android-21;default;armeabi-v7a +system-images;android-21;default;x86 +system-images;android-21;default;x86_64 +system-images;android-21;google_apis;armeabi-v7a +system-images;android-21;google_apis;x86 +system-images;android-21;google_apis;x86_64 +system-images;android-22;android-tv;armeabi-v7a +system-images;android-22;android-tv;x86 +system-images;android-22;default;armeabi-v7a +system-images;android-22;default;armeabi-v7a +system-images;android-22;default;x86 +system-images;android-22;default;x86_64 +system-images;android-22;google_apis;armeabi-v7a +system-images;android-22;google_apis;x86 +system-images;android-22;google_apis;x86_64 +system-images;android-23;android-tv;armeabi-v7a +system-images;android-23;android-tv;x86 +system-images;android-23;android-wear;armeabi-v7a +system-images;android-23;android-wear;x86 +system-images;android-23;default;x86 +system-images;android-23;default;x86_64 +system-images;android-23;google_apis;armeabi-v7a +system-images;android-23;google_apis;x86 +system-images;android-23;google_apis;x86_64 +system-images;android-24;android-tv;x86 +system-images;android-24;default;arm64-v8a +system-images;android-24;default;armeabi-v7a +system-images;android-24;default;x86 +system-images;android-24;default;x86_64 +system-images;android-24;google_apis;arm64-v8a +system-images;android-24;google_apis;armeabi-v7a +system-images;android-24;google_apis_playstore;x86 +system-images;android-24;google_apis;x86 +system-images;android-24;google_apis;x86_64 +system-images;android-25;android-tv;x86 +system-images;android-25;android-wear;armeabi-v7a +system-images;android-25;android-wear;x86 +system-images;android-25;google_apis;armeabi-v7a +system-images;android-25;google_apis;x86 +system-images;android-25;google_apis;x86_64 +system-images;android-26;android-tv;x86 +system-images;android-26;android-wear;x86 +system-images;android-26;google_apis_playstore;x86 +system-images;android-26;google_apis;x86 +tools