├── .dockerignore ├── .github ├── dependabot.yml └── workflows │ ├── docker-image.yml │ └── stale-issues-and-prs.yml ├── .gitignore ├── .travis.yml ├── CHANGELOG.md ├── COMPATIBILITY.md ├── Dockerfile ├── Gemfile ├── LICENSE ├── README.md ├── howto.txt ├── sdk └── licenses │ ├── android-googletv-license │ ├── android-sdk-license │ ├── android-sdk-preview-license │ ├── google-gdk-license │ ├── intel-android-extra-license │ └── mips-android-sysimage-license ├── tagged_sdk_packages_list.txt └── test_projects └── SampleProject ├── .gitignore ├── .java-version ├── Gemfile ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── github │ │ └── mingchen │ │ └── sampleproject │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── github │ │ │ └── mingchen │ │ │ └── sampleproject │ │ │ └── MainActivity.kt │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ └── ic_launcher_background.xml │ │ ├── layout │ │ └── activity_main.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── github │ └── mingchen │ └── sampleproject │ └── ExampleUnitTest.kt ├── build.gradle ├── fastlane ├── Appfile └── Fastfile ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.dockerignore: -------------------------------------------------------------------------------- 1 | #.dockerignore 2 | 3 | # Ignore all .md files, except README.md 4 | *.md 5 | !README.md 6 | 7 | # Ignore the license 8 | LICENSE 9 | 10 | # Ignore git 11 | .git 12 | 13 | # Ignore Github Stuff 14 | .github 15 | 16 | # Ignore test projects 17 | test_projects 18 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # GitHub's Dependabot Config 2 | 3 | version: 2 4 | updates: 5 | 6 | # Set update schedule for GitHub Actions 7 | - package-ecosystem: "github-actions" 8 | directory: "/" 9 | schedule: 10 | # Check for updates to GitHub Actions every month 11 | interval: "monthly" 12 | commit-message: 13 | # Prefix all commit messages with "CI: " 14 | prefix: "CI: " 15 | include: "scope" 16 | -------------------------------------------------------------------------------- /.github/workflows/docker-image.yml: -------------------------------------------------------------------------------- 1 | name: Docker Image CI 2 | 3 | on: 4 | workflow_dispatch: # manual trigger 5 | schedule: 6 | # ┌───────────── minute (0 - 59) 7 | # │ ┌───────────── hour (0 - 23) 8 | # │ │ ┌───────────── day of the month (1 - 31) 9 | # │ │ │ ┌───────────── month (1 - 12 or JAN-DEC) 10 | # │ │ │ │ ┌───────────── day of the week (0 - 6 or SUN-SAT) 11 | # │ │ │ │ │ 12 | # │ │ │ │ │ 13 | # │ │ │ │ │ 14 | # * * * * * 15 | - cron: '0 0 * * 1' # build every Monday 16 | push: 17 | branches: [ master, dev ] 18 | tags: 19 | - '*.*.*' 20 | paths-ignore: 21 | - '*.md' 22 | - 'howto.txt' 23 | - 'LICENSE' 24 | pull_request: 25 | branches: [ master ] 26 | paths-ignore: 27 | - '*.md' 28 | - 'howto.txt' 29 | - 'LICENSE' 30 | 31 | 32 | jobs: 33 | 34 | build: 35 | 36 | runs-on: ubuntu-latest 37 | env: 38 | IMAGE_NAME: mingc/android-build-box 39 | TAG: $GITHUB_SHA 40 | 41 | steps: 42 | - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 43 | 44 | - name: Docker meta 45 | id: meta 46 | uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 47 | with: 48 | images: mingc/android-build-box 49 | labels: | 50 | org.opencontainers.image.url=https://hub.docker.com/r/mingc/android-build-box 51 | org.opencontainers.image.vendor=Ming Chen 52 | 53 | - name: Set up QEMU 54 | uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 55 | with: 56 | platforms: amd64,arm64 57 | 58 | - name: Available platforms 59 | run: echo ${{ steps.qemu.outputs.platforms }} 60 | 61 | - name: Set up Docker Buildx 62 | uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 63 | with: 64 | driver: docker 65 | 66 | - name: Pre build 67 | run: | 68 | # possible ref examples: 69 | # refs/pull/138/merge 70 | # refs/heads/master 71 | # refs/tags/1.25.0 72 | echo "GITHUB_REF: $GITHUB_REF" 73 | 74 | # possible event name examples: 75 | # push 76 | # pull_request 77 | echo "GITHUB_EVENT_NAME: $GITHUB_EVENT_NAME" 78 | echo "GITHUB_EVENT_PATH: $GITHUB_EVENT_PATH" 79 | echo "GITHUB_WORKFLOW: $GITHUB_WORKFLOW" 80 | echo "GITHUB_WORKSPACE: $GITHUB_WORKSPACE" 81 | echo "GITHUB_HEAD_REF: $GITHUB_HEAD_REF" 82 | echo "GITHUB_ACTION: $GITHUB_ACTION" 83 | echo "GITHUB_JOB: $GITHUB_JOB" 84 | 85 | uname -a 86 | df -h 87 | docker images 88 | docker ps -a 89 | echo "GITHUB_SHA: $GITHUB_SHA" 90 | 91 | # Set up env.TAG 92 | echo "TAG=$GITHUB_SHA" >> $GITHUB_ENV 93 | echo "TAG: $TAG" 94 | 95 | # Remove exist images to free disk space 96 | docker rmi $(docker image ls -a | grep -vE 'ubuntu.*22\.04|moby/buildkit' | awk 'NR>1 {print $3}') 97 | #docker rmi $(docker images | grep -v IMAGE | awk '{print $3}') 98 | docker images 99 | 100 | # Remove unneeded and installed software to free up space 101 | sudo rm -rf /usr/local/lib/android/sdk 102 | sudo rm -rf /opt/hostedtoolcache 103 | 104 | # check disk space one more time 105 | df -h 106 | 107 | - name: Build and load local docker image for PRs or Not Tags 108 | uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1 109 | if: github.event_name == 'pull_request' || !startsWith(github.ref, 'refs/tags/') 110 | with: 111 | context: . 112 | load: true 113 | tags: ${{ env.IMAGE_NAME}}:${{ env.TAG}} 114 | 115 | - name: Build and load local docker image for Not PRs and Tags 116 | uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1 117 | if: github.event_name != 'pull_request' && startsWith(github.ref, 'refs/tags/') 118 | with: 119 | context: . 120 | load: true 121 | tags: ${{ env.IMAGE_NAME}}:${{ env.TAG}} 122 | build-args: | 123 | ANDROID_SDK_TOOLS_TAGGED=tagged 124 | ANDROID_SDKS=tagged 125 | NDK_TAGGED=tagged 126 | NODE_TAGGED=tagged 127 | BUNDLETOOL_TAGGED=tagged 128 | FLUTTER_TAGGED=tagged 129 | JENV_TAGGED=tagged 130 | 131 | - name: Inspect local docker image 132 | run: | 133 | docker images 134 | docker inspect ${{ env.IMAGE_NAME}}:${{ env.TAG}} 135 | 136 | - name: Test 137 | run: | 138 | docker run --rm ${{ env.IMAGE_NAME}}:${{ env.TAG}} env 139 | docker run --rm ${{ env.IMAGE_NAME}}:${{ env.TAG}} flutter --version 140 | 141 | echo "Show current java version" 142 | docker run --rm ${{ env.IMAGE_NAME}}:${{ env.TAG}} java -version 143 | 144 | echo "Set java env to 8" 145 | docker run --rm ${{ env.IMAGE_NAME}}:${{ env.TAG}} bash -c '. $HOME/.bash_profile && jenv local 1.8 && java -version' 146 | 147 | echo "Test jenv recognizes Java 11" 148 | docker run --rm ${{ env.IMAGE_NAME}}:${{ env.TAG}} bash -c 'jenv local 11 && java -version' 149 | 150 | echo "Test jenv recognizes Java 17" 151 | docker run --rm ${{ env.IMAGE_NAME}}:${{ env.TAG}} bash -c 'jenv local 17 && java -version' 152 | 153 | echo "Test jenv recognizes Java 21" 154 | docker run --rm ${{ env.IMAGE_NAME}}:${{ env.TAG}} bash -c 'jenv local 21 && java -version' 155 | 156 | docker run -v `pwd`:/project --rm ${{ env.IMAGE_NAME}}:${{ env.TAG}} bash -c 'echo "Current directory: $PWD"' 157 | 158 | docker run --rm ${{ env.IMAGE_NAME}}:${{ env.TAG}} bash -c 'ls -l $ANDROID_SDK_HOME' 159 | docker run --rm ${{ env.IMAGE_NAME}}:${{ env.TAG}} bash -c 'ls -l $ANDROID_NDK_HOME' 160 | docker run --rm ${{ env.IMAGE_NAME}}:${{ env.TAG}} bash -c 'ls -l /opt/android-sdk/ndk/' 161 | 162 | # Test Node 163 | echo "Test Node installation" 164 | docker run --rm ${{ env.IMAGE_NAME}}:${{ env.TAG}} bash -c 'curl -fsSL https://deb.nodesource.com/test | bash -' 165 | 166 | cd test_projects/SampleProject/ 167 | docker run --rm -v `pwd`:/project ${{ env.IMAGE_NAME}}:${{ env.TAG}} bash -c './gradlew build' 168 | 169 | - name: Login to DockerHub 170 | # if: github.event_name != 'pull_request' && github.ref == 'refs/heads/master' 171 | if: github.event_name != 'pull_request' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags/')) 172 | uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 173 | with: 174 | username: ${{ secrets.DOCKERHUB_USERNAME }} 175 | password: ${{ secrets.DOCKERHUB_TOKEN }} 176 | 177 | - name: Build and push - for Not PRs and Not Tags 178 | uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1 179 | if: github.event_name != 'pull_request' && !startsWith(github.ref, 'refs/tags/') 180 | with: 181 | context: . 182 | platforms: linux/amd64 183 | push: ${{ startsWith(github.ref, 'refs/heads/master') }} 184 | tags: mingc/android-build-box:latest, ${{ steps.meta.outputs.tags }} 185 | labels: ${{ steps.meta.outputs.labels }} 186 | 187 | - name: Build and push - for Not PRs and Tags 188 | uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1 189 | if: github.event_name != 'pull_request' && startsWith(github.ref, 'refs/tags/') 190 | with: 191 | context: . 192 | platforms: linux/amd64 193 | push: ${{ startsWith(github.ref, 'refs/tags/') }} 194 | tags: ${{ steps.meta.outputs.tags }} 195 | labels: ${{ steps.meta.outputs.labels }} 196 | build-args: | 197 | ANDROID_SDK_TOOLS_TAGGED=tagged 198 | ANDROID_SDKS=tagged 199 | NDK_TAGGED=tagged 200 | NODE_TAGGED=tagged 201 | BUNDLETOOL_TAGGED=tagged 202 | FLUTTER_TAGGED=tagged 203 | JENV_TAGGED=tagged 204 | 205 | - name: Modify Readme to list latest software 206 | if: github.event_name != 'pull_request' && (github.ref == 'refs/heads/master') 207 | run: | 208 | printf "\n\n \"Latest\" Tag Software:\n\n" >> README.md 209 | TEMP=$(docker run --rm ${{ env.IMAGE_NAME}}:${{ env.TAG}} cat '/root/installed-versions.txt') 210 | echo "$TEMP" | tail --lines=+2 >> README.md 211 | 212 | - name: Update Docker Hub Description 213 | if: github.event_name != 'pull_request' && (github.ref == 'refs/heads/master') 214 | uses: peter-evans/dockerhub-description@432a30c9e07499fd01da9f8a49f0faf9e0ca5b77 215 | with: 216 | username: ${{ secrets.DOCKERHUB_USERNAME }} 217 | password: ${{ secrets.DOCKERHUB_TOKEN }} 218 | repository: mingc/android-build-box 219 | enable-url-completion: true 220 | -------------------------------------------------------------------------------- /.github/workflows/stale-issues-and-prs.yml: -------------------------------------------------------------------------------- 1 | name: 'Close stale issues and PRs' 2 | on: 3 | workflow_dispatch: # manual trigger 4 | schedule: 5 | - cron: '0 1 * * *' # Run at 1:00 everyday. 6 | 7 | jobs: 8 | stale: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/stale@v8 12 | with: 13 | stale-issue-message: 'This issue is stale because it has been open 45 days with no activity. Remove stale label or comment or this will be closed in 7 days.' 14 | days-before-stale: 45 15 | days-before-close: 7 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore settings for JetBrains IDEs (e.g., IntelliJ, PyCharm, WebStorm) 2 | .idea/ -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: bash 2 | 3 | services: 4 | - docker 5 | 6 | # 7 | # https://docs.travis-ci.com/user/environment-variables/ 8 | # 9 | env: 10 | # All the env variables need put into a single line. 11 | - IMAGE_NAME=mingc/android-build-box SOURCE_BRANCH=$TRAVIS_BRANCH SOURCE_COMMIT=$TRAVIS_COMMIT DOCKER_TAG=latest 12 | 13 | before_install: 14 | - ./hooks/pre_build 15 | 16 | # Wait 50 minutes to avoid travis timeout. 17 | # https://docs.travis-ci.com/user/common-build-problems/#Build-times-out-because-no-output-was-received 18 | - travis_wait 50 ./hooks/build 19 | 20 | script: 21 | - docker run -it --rm $IMAGE_NAME flutter --version 22 | 23 | after_script: 24 | - ./hooks/post_build 25 | - docker rmi $IMAGE_NAME 26 | 27 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | Here be the changes. 4 | 5 | ## 1.27.0 6 | 7 | - PR #173: Upgrade Flutter to 3.16.9 @master-bob 8 | - PR #164: Upgrade to Ubuntu 22.04 LTS @master-bob 9 | 10 | ## 1.26.0 11 | 12 | - Close #140: Update README about jenv usage 13 | PR #132: Adds build tools 33.0.1 and 33.0.2 @master-bob 14 | - PR #129: CI: Fix dockerhub-description password 15 | - PR #124: Multi stage build 16 | - PR #123: CI: Streamline docker build @master-bob 17 | - Update Bundletool to 1.14.0 18 | - Remove python2.7 19 | - Upgrade to Flutter 3.7.7 20 | - Upgrade node to 18.x 21 | 22 | ## 1.25.0 23 | 24 | * Add Java 17. @master-bob 25 | * Android SDK 33 and Newer Implementation @master-bob, @blacix, @hanibalsk 26 | * Add support for SDK version 32 @ramdroid 27 | * Upgrade flutter from 2.10.3 to 3.0.4 @rishavmehra 28 | * Upgrade Node.js to Version 16 @wwmun 29 | * Added pip @iBobik 30 | * Add git-lfs @LeonDevLifeLog 31 | 32 | ## 1.24.0 33 | 34 | * PR #76: Tidy up to reduce image size @ozmium 35 | * Remove Android Platform 25 36 | 37 | ## 1.23.1 38 | 39 | * Remove JDK 16, Android build not support JDK 16 yet. 40 | 41 | ## 1.23.0 42 | 43 | **NOTE**: missed this tag in DockerHub due to a github action error, should use `1.23.1` instead. 44 | 45 | * Upgrade Flutter 2.2.0 to 2.5.1 46 | * PR #71: Ubuntu 20.04, JDK 16, gradle 7.2 @sedwards 47 | * Fix #57: Correct repositories.cfg path 48 | * Add jenv to choose java version 49 | 50 | ## 1.22.0 51 | 52 | * Upgrade Nodejs from 12.x to 14.x 53 | * Push image to docker hub from github action directly. 54 | 55 | ## 1.21.1 56 | 57 | * Update dockerhub build hook. 58 | 59 | ## 1.21.0 60 | 61 | * Upgrade Flutter to 2.2.0 62 | * CI switched from travis-ci to Github Action. 63 | * PR #63: Add cache gradle to README @dewijones92 64 | * PR #62: Make the Android SDK directory writeable @DanDevine 65 | * Fix #60: Remove BUNDLE_GEMFILE env. 66 | * PR #59: Fix #58: Updated README: Run emulator with ADB_INSTALL_TIMEOUT @felHR85 67 | 68 | ## 1.20.0 69 | 70 | * Upgrade Flutter to 1.22.0 71 | * Upgrade NDK to r21d 72 | 73 | ## 1.19.0 74 | 75 | * PR #50: Remove all the "extras" items of local libraries in the Android SDK @ozmium 76 | * Fix #48: Add timezone setting 77 | 78 | ## 1.18.0 79 | 80 | * Add platform sdk 30 and build build 30.0.0 81 | * PR #47: Remove old Build Tools (versions 24-17), and old Android Platform versions (versions 24-16), and old Google APIs (versions 24-16) @ozmium 82 | 83 | ## 1.17.0 84 | 85 | * Add build-tools;29.0.3 86 | 87 | ## 1.16.0 88 | 89 | * Upgrade Flutter to 1.17.1. 90 | 91 | ## 1.15.0 92 | 93 | * PR #41: Update Dockerfile to install Yarn, fastlane using bundler. @mayankkapoor 94 | 95 | ## 1.14.0 96 | 97 | * Upgrade NDK to r21. 98 | * Upgrade nodejs to 12.x. 99 | 100 | ## 1.13.0 101 | 102 | * Upgrade flutter to v1.12.13+hotfix.8. 103 | 104 | ## 1.12.0 105 | 106 | * Add bundler for fastlane. 107 | * Add Android Platform 29 108 | 109 | ## 1.11.2 110 | 111 | * Fix #34: Add android sdk level 29 license. 112 | 113 | ## 1.11.1 114 | 115 | * Add file, less and tiny-vim 116 | 117 | ## 1.11.0 118 | 119 | * Upgrade NDK from r19 to r20. 120 | 121 | ## 1.10.0 122 | 123 | * Upgrade Flutter from 1.2.1 to 1.5.4. 124 | 125 | ## 1.9.0 126 | 127 | * Upgrade Ubuntu from 17.10 to 18.04. 128 | 129 | ## 1.8.0 130 | 131 | * Upgrade Flutter from 1.0.0 to 1.2.1. 132 | 133 | ## 1.7.0 134 | 135 | * Upgrade ndk from 18b to 19. 136 | 137 | ## 1.6.0 138 | 139 | * Upgrade nodejs from 8.x to 10.x 140 | 141 | ## 1.5.1 142 | 143 | * Do not send flutter analytics 144 | 145 | ## 1.5.0 146 | 147 | * Add Flutter 1.0 148 | 149 | ## 1.4.0 150 | 151 | * Add kotlin 1.3 support. 152 | 153 | ## 1.3.0 154 | 155 | * PR #21: Update sdk to 28. 156 | 157 | ## 1.2.0 158 | 159 | * PR #17: Update sdk to 27. 160 | * PR #20: Fix issue #18 Remove pre-installed x86_64 emulator. Explain how to create and launch an ARM emulator. 161 | 162 | ## 1.1.2 163 | 164 | * Fix License for package not accepted issue 165 | 166 | 167 | ## 1.1.1 168 | 169 | * Fix environment variable concatenation 170 | 171 | 172 | ## 1.1.0 173 | 174 | * Update to latest sdk 25.2.3 and ndk 13b; add build tools 21.1.2 22.0.1 23.0.1 23.0.2 23.0.3 24 24.0.1 24.0.2 24.0.3 25 25.0.1 25.0.2 25.2.3 175 | * nodejs 7.x and react-native support 176 | * fastlane support 177 | 178 | 179 | ## 1.0.0 180 | 181 | * Initial release 182 | * Android SDK 16,17,18,19.20,21,22,23,24 183 | * Android build tool 24.0.2 184 | * Android NDK r13 185 | * extra-android-m2repository 186 | * extra-google-google\_play\_services 187 | * extra-google-m2repository 188 | -------------------------------------------------------------------------------- /COMPATIBILITY.md: -------------------------------------------------------------------------------- 1 | 2 | # Compatibility Matrices 3 | 4 | A bunch of matrices which show the various versions of software installed for compatibility purposes. Separate matrices are present for [Java](#Installed-Java-Versions-Matrix), the [Android SDK](#Android-Platform-SDK-Versions-Matrix), the [Android Build Tools](#Android-Build-Tools-Matrix), and [all the other software](#Various-Installed-Software-Versions-Matrix). 5 | 6 | Note: 1.23.0 is *not* on Docker Hub. 7 | 8 | ## Installed Java Versions Matrix 9 | 10 | Java 8 (1.8), Java 11, Java 17, and Java 21 are installed. 11 | 12 | | docker-android-build-box version | Date released | Java default | 8 | 11 | 16 | 17 | 21 | 13 | |:--------------------------------:|:---------------------------------:|:------------:|:-:|:-:|:-:|:-:|:-:| 14 | | ≤1.19 | 2 July 2020
and earlier | 8 | ✅ | ❌ | ❌ | ❌ | ❌ | 15 | | 1.20
-
1.22 | 7 August 2020
-
23 Aug 2021 | 8 | ✅ | ✅ | ❌ | ❌ | ❌ | 16 | | 1.23.0 | 23 Sept 2021 | 11 | ✅ | ✅ | ✅ | ❌ | ❌ | 17 | | 1.23.1 | 28 September 2021 | 11 | ✅ | ✅ | ❌ | ❌ | ❌ | 18 | | 1.25.0 | 21 February 2023 | 17 | ✅ | ✅ | ❌ | ✅ | ❌ | 19 | | 1.29.0 | TBD | 21 | ✅ | ✅ | ❌ | ✅ | ✅ | 20 | 21 | 22 | ## Android Platform SDK Versions Matrix 23 | 24 | A matrix of the various versions of the Android Platform SDK installed and this docker-android-build-box version. 25 | 26 | [//]: # (Following is a copy pastable stuff for this table: 27 | | x.x.x | yyyy-mm-dd | ✅❌ | ✅❌ | ✅❌ | ✅❌ | ✅❌ | ✅❌ | ✅❌ | ✅❌ | ✅❌ | ✅❌ | ✅❌ | ✅❌ | ✅❌ | ✅❌ | ✅❌ | ✅❌ | ✅❌ | ✅❌ | ✅❌ | 28 | Leave preceeding and trailing line of this comment **blank**. 29 | ) 30 | 31 | | docker-android-build-box version | Date released | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | DABB Ver. | 35 | 32 | |:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:| 33 | | 1.0.0 | 2017-01-24 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 1.0.0 | ❌ | 34 | | 1.1.0 | 2017-11-03 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 1.1.0 | ❌ | 35 | | 1.1.1 | 2017-11-15 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 1.1.1 | ❌ | 36 | | 1.1.2 | 2018-01-16 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 1.1.2 | ❌ | 37 | | 1.2.0 | 2018-10-12 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 1.2.0 | ❌ | 38 | | 1.3.0 | 2018-11-03 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 1.3.0 | ❌ | 39 | | 1.4.0 | 2018-11-03 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 1.4.0 | ❌ | 40 | | 1.5.0 | 2019-01-07 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 1.5.0 | ❌ | 41 | | 1.5.1 | 2019-01-08 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 1.5.1 | ❌ | 42 | | 1.6.0 | 2019-02-02 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 1.6.0 | ❌ | 43 | | 1.7.0 | 2019-02-08 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 1.7.0 | ❌ | 44 | | 1.8.0 | 2019-03-04 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 1.8.0 | ❌ | 45 | | 1.9.0 | 2019-03-08 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 1.9.0 | ❌ | 46 | | 1.10.0 | 2019-03-28 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 1.10.0 | ❌ | 47 | | 1.11.0 | 2019-06-22 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 1.11.0 | ❌ | 48 | | 1.11.1 | 2019-08-31 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 1.11.1 | ❌ | 49 | | 1.12.0 | 2019-09-13 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | 1.12.0 | ❌ | 50 | | 1.13.0 | 2020-03-03 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | 1.13.0 | ❌ | 51 | | 1.14.0 | 2020-03-07 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | 1.14.0 | ❌ | 52 | | 1.15.0 | 2020-03-21 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | 1.15.0 | ❌ | 53 | | **DABB Ver.** | **Date released** | **16** | **17** | **18** | **19** | **20** | **21** | **22** | **23** | **24** | **25** | **26** | **27** | **28** | **29** | **30** | **31** | **32** | **33** | **34** | **DABB Ver.** | **35** | 54 | | 1.16.0 | 2020-05-15 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | 1.16.0 | ❌ | 55 | | 1.17.0 | 2020-05-30 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | 1.17.0 | ❌ | 56 | | 1.18.0 | 2020-06-20 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | 1.18.0 | ❌ | 57 | | 1.19.0 | 2020-07-02 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | 1.19.0 | ❌ | 58 | | 1.20.0 | 2020-10-01 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | 1.20.0 | ❌ | 59 | | 1.21.0 | 2021-05-21 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | 1.21.0 | ❌ | 60 | | 1.21.1 | 2021-06-02 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | 1.21.1 | ❌ | 61 | | 1.22.0 | 2021-08-23 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | 1.22.0 | ❌ | 62 | | 1.23.0 | 2021-09-23 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | 1.23.0 | ❌ | 63 | | 1.23.1 | 2021-09-28 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | 1.23.1 | ❌ | 64 | | 1.24.0 | 2021-11-22 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | 1.24.0 | ❌ | 65 | | 1.25.0 | 2023-02-21 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | 1.25.0 | ❌ | 66 | | 1.26.0 | 2023-09-03 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | 1.26.0 | ❌ | 67 | | 1.27.0 | 2024-02-27 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | latest | ❌ | 68 | | 1.28.0 | TBD | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | latest | ❌ | 69 | | latest | 2024-03-04 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | latest | ❌ | 70 | 71 | ## Android Build Tools Matrix 72 | 73 | [//]: # ( 74 | | x.x.x | yyyy-mm-dd | ✅❌ | ✅❌ | ✅❌ | ✅❌ | ✅❌ | ✅❌ | ✅❌ | ✅❌ | ✅❌ | ✅❌ | ✅❌ | x.x.x | ✅❌ | ✅❌ | ✅❌ | ✅❌ | ✅❌ | ✅❌ | ✅❌ | ✅❌ | ✅❌ | ❌ | ✅❌ | ✅❌ | ✅❌ | ✅❌ | ✅❌ | x.x.x | ✅❌ | ✅❌ | ✅❌ | ✅❌ | ✅❌ | ✅❌ | ✅❌ | ✅❌ | ✅❌ | ✅❌ | ✅❌ | ❌ | ✅❌ | ❌ | 75 | Leave preceeding and trailing line of this comment **blank**. 76 | ) 77 | 78 | | docker-android-build-box
version | Date released | 17.0.0 | 18.1.1 | 19.1.0 | 20.0.0 | 21.1.2 | 22.0.1 | 23.0.1 | 23.0.2 | 23.0.3 | 24.0.0 | 24.0.1 | DABB Ver. | 24.0.2 | 24.0.3 | 25.0.0 | 25.0.1 | 25.0.2 | 25.0.3 | 26.0.0 | 26.0.1 | 26.0.2 | 27.0.0 | 27.0.1 | 27.0.2 | 27.0.3 | 28.0.2 | 28.0.3 | DABB Ver. | 29.0.0 | 29.0.2 | 29.0.3 | 30.0.0 | 30.0.2 | 30.0.3 | 31.0.0 | 32.0.0 | 33.0.0 | 33.0.1 | 33.0.2 | 33.0.3 | 34.0.0 | 35.0.0 | 79 | |---|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:| 80 | | 1.0.0 | 2017-01-24 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 1.0.0 | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 1.0.0 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 81 | | 1.1.0 | 2017-11-03 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.1.0 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 1.1.0 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 82 | | 1.1.1 | 2017-11-15 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.1.1 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 1.1.1 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 83 | | 1.1.2 | 2018-01-16 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.1.2 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 1.1.2 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 84 | | 1.2.0 | 2018-10-12 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.2.0 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ❌ | ❌ | 1.2.0 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 85 | | 1.3.0 | 2018-11-03 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.3.0 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.3.0 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 86 | | 1.4.0 | 2018-11-03 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.4.0 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.4.0 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 87 | | 1.5.0 | 2019-01-07 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.5.0 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.5.0 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 88 | | 1.5.1 | 2019-01-08 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.5.1 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.5.1 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 89 | | 1.6.0 | 2019-02-02 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.6.0 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.6.0 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 90 | | 1.7.0 | 2019-02-04 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.7.0 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.7.0 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 91 | | 1.8.0 | 2019-03-04 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.8.0 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.8.0 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 92 | | 1.9.0 | 2019-03-08 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.9.0 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.9.0 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 93 | | 1.10.0 | 2019-03-28 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.10.0 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.10.0 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 94 | | 1.11.0 | 2019-06-22 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.11.0 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.11.0 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 95 | | 1.11.1 | 2019-08-31 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.11.1 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.11.1 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 96 | | 1.12.0 | 2019-09-27 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.12.0 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.12.0 | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 97 | | 1.13.0 | 2020-03-03 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.13.0 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.13.0 | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 98 | | 1.14.0 | 2020-03-04 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.14.0 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.14.0 | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 99 | | 1.15.0 | 2020-03-21 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.15.0 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.15.0 | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 100 | | **DABB Ver.** | **Date released** | **17.0.0** | **18.1.1** | **19.1.0** | **20.0.0** | **21.1.2** | **22.0.1** | **23.0.1** | **23.0.2** | **23.0.3** | **24.0.0** | **24.0.1** | **DABB Ver.** | **24.0.2** | **24.0.3** | **25.0.0** | **25.0.1** | **25.0.2** | **25.0.3** | **26.0.0** | **26.0.1** | **26.0.2** | **27.0.0** | **27.0.1** | **27.0.2** | **27.0.3** | **28.0.2** | **28.0.3** | **DABB Ver.** | **29.0.0** | **29.0.2** | **29.0.3** | **30.0.0** | **30.0.2** | **30.0.3** | **31.0.0** | **32.0.0** | **33.0.0** | **33.0.1** | **33.0.2** | **33.0.3** | **34.0.0** | **35.0.0** | 101 | | 1.16.0 | 2020-05-15 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.16.0 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.16.0 | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 102 | | 1.17.0 | 2020-05-30 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.17.0 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.17.0 | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 103 | | 1.18.0 | 2020-06-20 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 1.18.0 | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.18.0 | ❌ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 104 | | 1.19.0 | 2020-07-02 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 1.19.0 | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.19.0 | ❌ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 105 | | 1.20.0 | 2020-10-01 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 1.20.0 | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.20.0 | ❌ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 106 | | 1.21.0 | 2021-05-21 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 1.21.0 | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.21.0 | ❌ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 107 | | 1.21.1 | 2021-06-02 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 1.21.1 | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.21.1 | ❌ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 108 | | 1.22.0 | 2021-08-23 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 1.22.0 | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.22.0 | ❌ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 109 | | 1.23.0 | 2021-09-23 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 1.23.0 | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.23.0 | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 110 | | 1.23.1 | 2021-09-28 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 1.23.1 | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.23.1 | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 111 | | 1.24.0 | 2021-11-22 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 1.24.0 | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.24.0 | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 112 | | 1.25.0 | 2023-02-21 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 1.25.0 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.25.0 | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | 113 | | 1.26.0 | 2023-09-03 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 1.26.0 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.26.0 | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | 114 | | 1.27.0 | 2024-02-27 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 1.27.0 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.27.0 | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | 115 | | 1.28.0 | TBD | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 1.28.0 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | 1.28.0 | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | 116 | | latest | 2024-03-04 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | latest | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | latest | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | 117 | 118 | ## Various Installed Software Versions Matrix 119 | 120 | [//]: # ( 121 | | x.x.x | yyyy-mm-dd | | | | | | | 122 | Leave preceeding and trailing line of this comment **blank**. 123 | ) 124 | 125 | | docker-android-build-box
version | Date released | Ubuntu
version | Android SDK CLI Tools
version | Android NDK
version | Flutter
version | NodeJS
version | bundletool
version | 126 | |:--|:-:|--:|--:|--:|--:|--:|--:| 127 | | 1.0.0 | 2016-19-27 | 16.04 | ❌ | r13 | ❌ | ❌ | ❌ | 128 | | 1.1.0 | 2017-11-03 | 17.10 | 3859397 | r15c | ❌ | 8.x | ❌ | 129 | | 1.1.1 | 2017-11-15 | 17.10 | 3859397 | r15c | ❌ | 8.x | ❌ | 130 | | 1.1.2 | 2018-01-16 | 17.10 | 3859397 | r15c | ❌ | 8.x | ❌ | 131 | | 1.2.0 | 2018-01-16 | 17.10 | 3859397 | r15c | ❌ | 8.x | ❌ | 132 | | 1.3.0 | 2018-11-03 | 17.10 | 4333796 | r18b | ❌ | 8.x | ❌ | 133 | | 1.4.0 | 2018-11-03 | 17.10 | 4333796 | r18b | ❌ | 8.x | ❌ | 134 | | 1.5.0 | 2019-01-07 | 17.10 | 4333796 | r18b | 1.0.0 | 8.x | ❌ | 135 | | 1.5.1 | 2019-01-08 | 17.10 | 4333796 | r18b | 1.0.0 | 8.x | ❌ | 136 | | 1.6.0 | 2019-02-02 | 17.10 | 4333796 | r18b | 1.0.0 | 10.x | ❌ | 137 | | 1.7.0 | 2019-02-04 | 17.10 | 4333796 | r19 | 1.0.0 | 10.x | ❌ | 138 | | 1.8.0 | 2019-03-04 | 17.10 | 4333796 | r19 | 1.2.1 | 10.x | ❌ | 139 | | 1.9.0 | 2019-03-08 | 18.04 | 4333796 | r19 | 1.2.1 | 10.x | ❌ | 140 | | 1.10.0 | 2019-03-28 | 18.04 | 4333796 | r19 | 1.5.4-hotfix.2 | 10.x | ❌ | 141 | | 1.11.0 | 2019-06-22 | 18.04 | 4333796 | r20 | 1.5.4-hotfix.2 | 10.x | ❌ | 142 | | 1.11.1 | 2019-08-31 | 18.04 | 4333796 | r20 | 1.5.4-hotfix.2 | 10.x | ❌ | 143 | | 1.12.0 | 2019-09-27 | 18.04 | 4333796 | r20 | 1.5.4-hotfix.2 | 10.x | ❌ | 144 | | 1.13.0 | 2020-03-03 | 18.04 | 4333796 | r20 | 1.12.13+hotfix.8 | 10.x | ❌ | 145 | | 1.14.0 | 2020-03-04 | 18.04 | 4333796 | r21 | 1.12.13+hotfix.8 | 12.x | ❌ | 146 | | 1.15.0 | 2020-03-21 | 18.04 | 4333796 | r21 | 1.12.13+hotfix.8 | 12.x | ❌ | 147 | | **DABB
Ver.** | **Date released** | **Ubuntu
version** | **Android SDK CLI Tools
version** | **Android NDK
version** | **Flutter
version** | **NodeJS
version** | **bundletool
version** | 148 | | 1.16.0 | 2020-05-15 | 18.04 | 4333796 | r21 | 1.17.1 | 12.x | ❌ | 149 | | 1.17.0 | 2020-05-30 | 18.04 | 4333796 | r21 | 1.17.1 | 12.x | ❌ | 150 | | 1.18.0 | 2020-06-20 | 18.04 | 4333796 | r21c | 1.17.1 | 12.x | ❌ | 151 | | 1.19.0 | 2020-07-02 | 18.04 | 4333796 | r21c | 1.17.1 | 12.x | ❌ | 152 | | 1.20.0 | 2020-10-01 | 18.04 | 4333796 | r21d | 1.22.0 | 12.x | ❌ | 153 | | 1.21.0 | 2021-05-21 | 18.04 | 4333796 | r21d | 2.2.0 | 12.x | ❌ | 154 | | 1.21.1 | 2021-06-02 | 18.04 | 4333796 | r21d | 2.2.0 | 12.x | ❌ | 155 | | 1.22.0 | 2021-08-23 | 18.04 | 4333796 | r21d | 2.2.0 | 14.x | ❌ | 156 | | 1.23.0 | 2021-09-23 | 20.04 | 4333796 | latest | 2.5.1 | 14.x | ❌ | 157 | | 1.23.1 | 2021-09-28 | 20.04 | 4333796 | r23 | 2.5.1 | 14.x | ❌ | 158 | | 1.24.0 | 2021-11-22 | 20.04 | 4333796 | r23b | 2.5.1 | 14.x | ❌ | 159 | | 1.25.0 | 2023-02-21 | 20.04 | 9123335 | r25c | 3.0.4 | 16.x | 1.9.1 | 160 | | 1.26.0 | 2023-09-03 | 20.04 | 9123335 | r25c | 3.7.7 | 18.x | 1.14.0 | 161 | | 1.27.0 | 2024-02-27 | 22.04 | 9123335 | r25c | 3.16.9 | 18.x | 1.14.0 | 162 | | 1.28.0 | TBD | 22.04 | 11076708 | r26c | 3.19.2 | 20.x | 1.15.6 | 163 | | latest | 2024-03-04 | 22.04 | 11076708 | r26c | 3.19.2 | 20.x | 1.15.6 | 164 | 165 | Note: As of 1.23.0 the latest released Android NDK at the build time is used. This means that the latest Android NDK on the release date of 1.24.0 was r22 and thus that is used. However, if one where to build 1.24.0 on 2023-02-21 (1.25.0 release date), then r25c would be installed. 166 | 167 | Note: As 1.23.0 is not on Docker Hub the NDK version is listed as "latest". 168 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # Installed Software Versions 2 | # Most _TAGGED can be "latest" or "tagged" 3 | # when _TAGGED is "tagged" the version in _VERSION will be used. 4 | # _TAGGED is used to handle the build stages 5 | 6 | # "13114758" as of 2025/04/04 7 | ARG ANDROID_SDK_TOOLS_TAGGED="latest" 8 | ARG ANDROID_SDK_TOOLS_VERSION="13114758" 9 | 10 | # Valid values are "last8" or "tagged" 11 | # "last8" will grab the last 8 android-sdks, including extensions and 12 | # any potential future build tool release candidates 13 | ARG ANDROID_SDKS="last8" 14 | 15 | ARG NDK_TAGGED="latest" 16 | ARG NDK_VERSION="28.0.13004108" 17 | 18 | ARG NODE_TAGGED="latest" 19 | ARG NODE_VERSION="22.x" 20 | 21 | ARG BUNDLETOOL_TAGGED="latest" 22 | ARG BUNDLETOOL_VERSION="1.18.1" 23 | 24 | ARG FLUTTER_TAGGED="latest" 25 | ARG FLUTTER_VERSION="3.24.5" 26 | 27 | ARG JENV_TAGGED="latest" 28 | ARG JENV_RELEASE="0.5.6" 29 | 30 | #----------~~~~~~~~~~**********~~~~~~~~~~~-----------# 31 | # PRELIMINARY STAGES 32 | #----------~~~~~~~~~~**********~~~~~~~~~~~-----------# 33 | # All following stages should have their root as either these two stages, 34 | # ubuntu and base. 35 | 36 | #----------~~~~~~~~~~***** 37 | # build stage: ubuntu 38 | #----------~~~~~~~~~~***** 39 | FROM ubuntu:22.04 as ubuntu 40 | # Ensure ARGs are in this build context 41 | ARG ANDROID_SDK_TOOLS_VERSION 42 | ARG NDK_VERSION 43 | ARG NODE_VERSION 44 | ARG BUNDLETOOL_VERSION 45 | ARG FLUTTER_VERSION 46 | ARG JENV_RELEASE 47 | 48 | ARG DIRWORK="/tmp" 49 | ARG FINAL_DIRWORK="/project" 50 | 51 | ARG INSTALLED_TEMP="${DIRWORK}/.temp_version" 52 | ARG INSTALLED_VERSIONS="/root/installed-versions.txt" 53 | 54 | ARG SDK_PACKAGES_LIST="${DIRWORK}/packages.txt" 55 | 56 | ENV ANDROID_HOME="/opt/android-sdk" \ 57 | ANDROID_SDK_HOME="/opt/android-sdk" \ 58 | ANDROID_NDK="/opt/android-sdk/ndk/latest" \ 59 | ANDROID_NDK_ROOT="/opt/android-sdk/ndk/latest" \ 60 | FLUTTER_HOME="/opt/flutter" \ 61 | JENV_ROOT="/opt/jenv" 62 | ENV ANDROID_SDK_MANAGER=${ANDROID_HOME}/cmdline-tools/latest/bin/sdkmanager 63 | 64 | ENV TZ=America/Los_Angeles 65 | 66 | # Set locale 67 | ENV LANG="en_US.UTF-8" \ 68 | LANGUAGE="en_US.UTF-8" \ 69 | LC_ALL="en_US.UTF-8" 70 | 71 | # Variables must be references after they are created 72 | ENV ANDROID_SDK_HOME="$ANDROID_HOME" 73 | ENV ANDROID_NDK_HOME="$ANDROID_NDK" 74 | 75 | ENV PATH="${JENV_ROOT}/shims:${JENV_ROOT}/bin:$JAVA_HOME/bin:$PATH:$ANDROID_SDK_HOME/emulator:$ANDROID_SDK_HOME/cmdline-tools/latest/bin:$ANDROID_SDK_HOME/tools:$ANDROID_SDK_HOME/platform-tools:$ANDROID_NDK:$FLUTTER_HOME/bin:$FLUTTER_HOME/bin/cache/dart-sdk/bin" 76 | 77 | #----------~~~~~~~~~~***** 78 | # build stage: base 79 | #----------~~~~~~~~~~***** 80 | FROM ubuntu as pre-base 81 | ARG TERM=dumb \ 82 | DEBIAN_FRONTEND=noninteractive 83 | 84 | WORKDIR ${DIRWORK} 85 | 86 | RUN uname -a && uname -m 87 | 88 | # support amd64 and arm64 89 | RUN JDK_PLATFORM=$(if [ "$(uname -m)" = "aarch64" ]; then echo "arm64"; else echo "amd64"; fi) && \ 90 | echo export JDK_PLATFORM=$JDK_PLATFORM >> /etc/jdk.env && \ 91 | echo export JAVA_HOME="/usr/lib/jvm/java-17-openjdk-$JDK_PLATFORM/" >> /etc/jdk.env && \ 92 | echo . /etc/jdk.env >> /etc/bash.bashrc && \ 93 | echo . /etc/jdk.env >> /etc/profile 94 | 95 | RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections && \ 96 | apt-get clean && \ 97 | apt-get update -qq && \ 98 | apt-get install -qq -y apt-utils locales && \ 99 | locale-gen $LANG 100 | 101 | # Installing packages 102 | RUN apt-get update -qq > /dev/null && \ 103 | apt-get install -qq --no-install-recommends \ 104 | autoconf \ 105 | build-essential \ 106 | cmake \ 107 | ninja-build \ 108 | curl \ 109 | file \ 110 | git \ 111 | git-lfs \ 112 | gpg-agent \ 113 | less \ 114 | libc6-dev \ 115 | libgmp-dev \ 116 | libmpc-dev \ 117 | libmpfr-dev \ 118 | libxslt-dev \ 119 | libxml2-dev \ 120 | m4 \ 121 | ncurses-dev \ 122 | ocaml \ 123 | openjdk-8-jdk \ 124 | openjdk-11-jdk \ 125 | openjdk-17-jdk \ 126 | openjdk-21-jdk \ 127 | openssh-client \ 128 | pkg-config \ 129 | ruby-full \ 130 | software-properties-common \ 131 | tzdata \ 132 | unzip \ 133 | vim-tiny \ 134 | wget \ 135 | zip \ 136 | zipalign \ 137 | s3cmd \ 138 | python3-pip \ 139 | zlib1g-dev > /dev/null && \ 140 | git lfs install > /dev/null && \ 141 | echo "JVM directories: `ls -l /usr/lib/jvm/`" && \ 142 | . /etc/jdk.env && \ 143 | echo "Java version (default):" && \ 144 | java -version && \ 145 | echo "set timezone" && \ 146 | ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && \ 147 | apt-get -y clean && apt-get -y autoremove && rm -rf /var/lib/apt/lists/* && \ 148 | rm -rf ${DIRWORK}/* /var/tmp/* && \ 149 | echo 'debconf debconf/frontend select Dialog' | debconf-set-selections 150 | 151 | # preliminary base-base stage 152 | # Install Android SDK CLI 153 | FROM pre-base as base-base 154 | RUN echo '# Installed Versions of Specified Software' >> ${INSTALLED_VERSIONS} 155 | 156 | FROM base-base as base-tagged 157 | RUN echo "sdk tools ${ANDROID_SDK_TOOLS_VERSION}" && \ 158 | wget --quiet --output-document=sdk-tools.zip \ 159 | "https://dl.google.com/android/repository/commandlinetools-linux-${ANDROID_SDK_TOOLS_VERSION}_latest.zip" && \ 160 | echo "ANDROID_SDK_TOOLS_VERSION=${ANDROID_SDK_TOOLS_VERSION}" >> ${INSTALLED_VERSIONS} 161 | 162 | FROM base-base as base-latest 163 | RUN TEMP=$(curl -S https://developer.android.com/studio/index.html) && \ 164 | ANDROID_SDK_TOOLS_VERSION=$(echo "$TEMP" | grep commandlinetools-linux | tail -n 1 | cut -d \- -f 3 | tr -d _latest.zip\\<\/p\>) && \ 165 | echo "sdk tools $ANDROID_SDK_TOOLS_VERSION" && \ 166 | wget --quiet --output-document=sdk-tools.zip \ 167 | "https://dl.google.com/android/repository/commandlinetools-linux-"$ANDROID_SDK_TOOLS_VERSION"_latest.zip" && \ 168 | echo "ANDROID_SDK_TOOLS_VERSION=$ANDROID_SDK_TOOLS_VERSION" >> ${INSTALLED_VERSIONS} 169 | 170 | FROM base-${ANDROID_SDK_TOOLS_TAGGED} as base 171 | RUN mkdir --parents "$ANDROID_HOME" && \ 172 | unzip -q sdk-tools.zip -d "$ANDROID_HOME" && \ 173 | cd "$ANDROID_HOME" && \ 174 | mv cmdline-tools latest && \ 175 | mkdir cmdline-tools && \ 176 | mv latest cmdline-tools && \ 177 | rm --force ${DIRWORK}/sdk-tools.zip 178 | 179 | # Copy sdk license agreement files. 180 | RUN mkdir -p $ANDROID_HOME/licenses 181 | COPY sdk/licenses/* $ANDROID_HOME/licenses/ 182 | 183 | #----------~~~~~~~~~~**********~~~~~~~~~~~-----------# 184 | # INTERMEDIARY STAGES 185 | #----------~~~~~~~~~~**********~~~~~~~~~~~-----------# 186 | # build stages used to craft the targets for deployment to production 187 | 188 | #----------~~~~~~~~~~***** 189 | # build stage: jenv-final 190 | #----------~~~~~~~~~~***** 191 | # jenv 192 | # Add jenv to control which version of java to use, default to 17. 193 | FROM base as jenv-base 194 | RUN echo '#!/usr/bin/env bash' >> ~/.bash_profile && \ 195 | echo 'eval "$(jenv init -)"' >> ~/.bash_profile 196 | 197 | FROM jenv-base as jenv-tagged 198 | RUN git clone --depth 1 --branch ${JENV_RELEASE} https://github.com/jenv/jenv.git ${JENV_ROOT} && \ 199 | echo "JENV_RELEASE=${JENV_RELEASE}" >> ${INSTALLED_TEMP} 200 | 201 | FROM jenv-base as jenv-latest 202 | RUN git clone https://github.com/jenv/jenv.git ${JENV_ROOT} && \ 203 | cd ${JENV_ROOT} && echo "JENV_RELEASE=$(git describe --tags HEAD)" >> ${INSTALLED_TEMP} 204 | 205 | FROM jenv-${JENV_TAGGED} as jenv-final 206 | RUN . ~/.bash_profile && \ 207 | . /etc/jdk.env && \ 208 | java -version && \ 209 | jenv add /usr/lib/jvm/java-8-openjdk-$JDK_PLATFORM && \ 210 | jenv add /usr/lib/jvm/java-11-openjdk-$JDK_PLATFORM && \ 211 | jenv add /usr/lib/jvm/java-17-openjdk-$JDK_PLATFORM && \ 212 | jenv add /usr/lib/jvm/java-21-openjdk-$JDK_PLATFORM && \ 213 | jenv versions && \ 214 | jenv global 21 && \ 215 | java -version 216 | 217 | #----------~~~~~~~~~~***** 218 | # build stage: stage2 219 | #----------~~~~~~~~~~***** 220 | # Create some jenkins required directory to allow this image run with Jenkins 221 | FROM ubuntu as stage2 222 | WORKDIR ${DIRWORK} 223 | RUN mkdir -p /var/lib/jenkins/workspace && \ 224 | mkdir -p /home/jenkins && \ 225 | chmod 777 /home/jenkins && \ 226 | chmod 777 /var/lib/jenkins/workspace 227 | 228 | #----------~~~~~~~~~~***** 229 | # build stage: pre-minimal 230 | #----------~~~~~~~~~~***** 231 | FROM base as pre-minimal 232 | ARG DEBUG 233 | # The `yes` is for accepting all non-standard tool licenses. 234 | RUN mkdir --parents "$ANDROID_HOME/.android/" && \ 235 | echo '### User Sources for Android SDK Manager' > \ 236 | "$ANDROID_HOME/.android/repositories.cfg" && \ 237 | . /etc/jdk.env && \ 238 | yes | $ANDROID_SDK_MANAGER --licenses > /dev/null 239 | 240 | # List all available packages. 241 | # redirect to a temp file ${SDK_PACKAGES_LIST} for later use and avoid show progress 242 | RUN . /etc/jdk.env && \ 243 | $ANDROID_SDK_MANAGER --list > ${SDK_PACKAGES_LIST} && \ 244 | cat ${SDK_PACKAGES_LIST} | grep -v '=' 245 | 246 | RUN echo "platform tools" && \ 247 | . /etc/jdk.env && \ 248 | yes | $ANDROID_SDK_MANAGER ${DEBUG:+--verbose} \ 249 | "platform-tools" > /dev/null 250 | 251 | #----------~~~~~~~~~~***** 252 | # build stage: stage1-final 253 | #----------~~~~~~~~~~***** 254 | # installs the intended android SDKs 255 | # 256 | # https://developer.android.com/studio/command-line/sdkmanager.html 257 | FROM pre-minimal as stage1-independent-base 258 | WORKDIR ${DIRWORK} 259 | ARG PACKAGES_FILENAME="android-sdks.txt" 260 | 261 | FROM --platform=linux/amd64 stage1-independent-base as stage1-base 262 | RUN echo "emulator" && \ 263 | . /etc/jdk.env && \ 264 | yes | $ANDROID_SDK_MANAGER "emulator" > /dev/null 265 | 266 | FROM --platform=linux/arm64 stage1-independent-base as stage1-base 267 | # seems there is no emulator on arm64 268 | # Warning: Failed to find package emulator 269 | 270 | FROM stage1-base as stage1-tagged 271 | COPY tagged_sdk_packages_list.txt $PACKAGES_FILENAME 272 | 273 | FROM stage1-base as stage1-last8 274 | ARG LAST8_PACKAGES=$PACKAGES_FILENAME 275 | # Get last 8 platforms 276 | # Extract platform version numbers. 277 | # for each (while) platform number find any extensions 278 | # for each (while) platform number get all the build-tools 279 | # lastly get any potential build-tools for next platform release 280 | RUN cat ${SDK_PACKAGES_LIST} | grep "platforms;android-[[:digit:]][[:digit:]]\+ " | tail -n8 | awk '{print $1}' \ 281 | >> $LAST8_PACKAGES && \ 282 | PLATFORM_NUMBERS=$(cat $LAST8_PACKAGES | grep -o '[0-9][0-9]\+' | sort -u) && \ 283 | i=$(echo "$PLATFORM_NUMBERS" | head -n1) && \ 284 | end=$(echo "$PLATFORM_NUMBERS" | tail -n1) && \ 285 | while [ $i -le $end ]; do \ 286 | cat ${SDK_PACKAGES_LIST} | grep "platforms;android-$i-" | awk '{print $1}' >> $LAST8_PACKAGES; \ 287 | cat ${SDK_PACKAGES_LIST} | grep "build-tools;$i" | awk '{print $1}' >> $LAST8_PACKAGES; \ 288 | i=$(($i+1)); \ 289 | done; \ 290 | cat ${SDK_PACKAGES_LIST} | grep "build-tools;$i" | awk '{print $1}' >> $LAST8_PACKAGES 291 | 292 | FROM stage1-${ANDROID_SDKS} as stage1-final 293 | RUN echo "installing: $(cat $PACKAGES_FILENAME)" && \ 294 | . /etc/jdk.env && \ 295 | yes | ${ANDROID_SDK_MANAGER} ${DEBUG:+--verbose} --package_file=$PACKAGES_FILENAME > /dev/null 296 | 297 | #----------~~~~~~~~~~***** 298 | # build stage: bundletool-final 299 | #----------~~~~~~~~~~***** 300 | # bundletool 301 | FROM pre-minimal as bundletool-base 302 | WORKDIR ${DIRWORK} 303 | RUN echo "bundletool" 304 | 305 | FROM bundletool-base as bundletool-tagged 306 | RUN wget -q https://github.com/google/bundletool/releases/download/${BUNDLETOOL_VERSION}/bundletool-all-${BUNDLETOOL_VERSION}.jar -O $ANDROID_SDK_HOME/cmdline-tools/latest/bundletool.jar && \ 307 | echo "BUNDLETOOL_VERSION=${BUNDLETOOL_VERSION}" >> ${INSTALLED_TEMP} 308 | 309 | FROM bundletool-base as bundletool-latest 310 | RUN TEMP=$(curl -s https://api.github.com/repos/google/bundletool/releases/latest) && \ 311 | echo "$TEMP" | grep "browser_download_url.*jar" | cut -d : -f 2,3 | tr -d \" | wget -O $ANDROID_SDK_HOME/cmdline-tools/latest/bundletool.jar -qi - && \ 312 | TAG_NAME=$(echo "$TEMP" | grep "tag_name" | cut -d : -f 2,3 | tr -d \"\ ,) && \ 313 | echo "BUNDLETOOL_VERSION=$TAG_NAME" >> ${INSTALLED_TEMP} 314 | 315 | FROM bundletool-${BUNDLETOOL_TAGGED} as bundletool-final 316 | RUN echo "bundletool finished" 317 | 318 | #----------~~~~~~~~~~***** 319 | # build stage: ndk-final 320 | #----------~~~~~~~~~~***** 321 | # NDK (side-by-side) 322 | FROM pre-minimal as ndk-base 323 | WORKDIR ${DIRWORK} 324 | RUN echo "NDK" 325 | 326 | FROM ndk-base as ndk-tagged 327 | RUN echo "Installing ${NDK_VERSION}" && \ 328 | . /etc/jdk.env && \ 329 | yes | $ANDROID_SDK_MANAGER ${DEBUG:+--verbose} "ndk;${NDK_VERSION}" > /dev/null && \ 330 | ln -sv $ANDROID_HOME/ndk/${NDK_VERSION} ${ANDROID_NDK} 331 | 332 | FROM ndk-base as ndk-latest 333 | RUN NDK=$(grep 'ndk;' ${SDK_PACKAGES_LIST} | sort | tail -n1 | awk '{print $1}') && \ 334 | NDK_VERSION=$(echo $NDK | awk -F\; '{print $2}') && \ 335 | echo "Installing $NDK" && \ 336 | . /etc/jdk.env && \ 337 | yes | $ANDROID_SDK_MANAGER ${DEBUG:+--verbose} "$NDK" > /dev/null && \ 338 | ln -sv $ANDROID_HOME/ndk/$NDK_VERSION ${ANDROID_NDK} 339 | 340 | FROM ndk-${NDK_TAGGED} as ndk-final 341 | RUN echo "NDK finished" 342 | 343 | #----------~~~~~~~~~~***** 344 | # build stage: flutter-final 345 | #----------~~~~~~~~~~***** 346 | # Flutter 347 | FROM --platform=linux/amd64 base as flutter-base 348 | WORKDIR ${DIRWORK} 349 | FROM flutter-base as flutter-tagged 350 | RUN git clone --depth 1 --branch ${FLUTTER_VERSION} https://github.com/flutter/flutter.git ${FLUTTER_HOME} && \ 351 | echo "FLUTTER_VERSION=${FLUTTER_VERSION}" >> ${INSTALLED_TEMP} 352 | 353 | FROM flutter-base as flutter-latest 354 | RUN git clone --depth 5 -b stable https://github.com/flutter/flutter.git ${FLUTTER_HOME} && \ 355 | cd ${FLUTTER_HOME} && echo "FLUTTER_VERSION="$(git describe --tags HEAD) >> ${INSTALLED_TEMP} 356 | 357 | FROM flutter-${FLUTTER_TAGGED} as flutter-final 358 | RUN flutter config --no-analytics 359 | 360 | #----------~~~~~~~~~~***** 361 | # build stage: stage3 362 | #----------~~~~~~~~~~***** 363 | # ruby gems 364 | FROM pre-minimal as stage3 365 | WORKDIR ${DIRWORK} 366 | COPY Gemfile /Gemfile 367 | 368 | RUN echo "fastlane" && \ 369 | cd / && \ 370 | gem install bundler --quiet --no-document > /dev/null && \ 371 | mkdir -p /.fastlane && \ 372 | chmod 777 /.fastlane && \ 373 | bundle install --quiet && \ 374 | TEMP=$(bundler exec fastlane --version) && \ 375 | BUNDLER_VERSION=$(bundler --version | cut -d ' ' -f 3) && \ 376 | RAKE_VERSION=$(bundler exec rake --version | cut -d ' ' -f 3) && \ 377 | FASTLANE_VERSION=$(echo "$TEMP" | grep fastlane | tail -n 1 | tr -d 'fastlane\ ') && \ 378 | echo "BUNDLER_VERSION=$BUNDLER_VERSION" >> ${INSTALLED_TEMP} && \ 379 | echo "RAKE_VERSION=$RAKE_VERSION" >> ${INSTALLED_TEMP} && \ 380 | echo "FASTLANE_VERSION=$FASTLANE_VERSION" >> ${INSTALLED_TEMP} 381 | 382 | #----------~~~~~~~~~~***** 383 | # build stage: node-final 384 | #----------~~~~~~~~~~***** 385 | # node 386 | FROM stage3 as node-base 387 | ENV NODE_ENV=production 388 | RUN echo "nodejs, npm, cordova, ionic, react-native" && \ 389 | echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections 390 | 391 | # Install Node 392 | FROM node-base as node-tagged 393 | RUN curl -sL -k https://deb.nodesource.com/setup_${NODE_VERSION} | bash - > /dev/null 394 | 395 | FROM node-base as node-latest 396 | RUN curl -sL -k https://deb.nodesource.com/setup_lts.x | bash - > /dev/null 397 | 398 | FROM node-${NODE_TAGGED} as node-final 399 | RUN apt-get install -qq nodejs > /dev/null && \ 400 | echo "node version: `node -v`" && \ 401 | curl -sS -k https://dl.yarnpkg.com/debian/pubkey.gpg \ 402 | | apt-key add - > /dev/null && \ 403 | echo "deb https://dl.yarnpkg.com/debian/ stable main" \ 404 | | tee /etc/apt/sources.list.d/yarn.list > /dev/null && \ 405 | apt-get update -qq > /dev/null && \ 406 | apt-get install -qq yarn > /dev/null && \ 407 | rm -rf /var/lib/apt/lists/ && \ 408 | npm install --quiet -g npm > /dev/null && \ 409 | echo "npm version: `npm -v`" && \ 410 | npm install --quiet -g \ 411 | bower \ 412 | cordova \ 413 | eslint \ 414 | gulp-cli \ 415 | @ionic/cli \ 416 | jshint \ 417 | karma-cli \ 418 | mocha \ 419 | node-gyp \ 420 | npm-check-updates \ 421 | @react-native-community/cli > /dev/null && \ 422 | npm cache clean --force > /dev/null && \ 423 | apt-get -y clean && apt-get -y autoremove && rm -rf /var/lib/apt/lists/* && \ 424 | echo 'debconf debconf/frontend select Dialog' | debconf-set-selections && \ 425 | NODE_VERSION=$(node --version) && \ 426 | YARN_VERSION=$(yarn --version) && \ 427 | echo "NODE_VERSION=$NODE_VERSION" >> ${INSTALLED_TEMP} && \ 428 | echo "YARN_VERSION=$YARN_VERSION" >> ${INSTALLED_TEMP} && \ 429 | echo "Globally Installed NPM Packages:" >> ${INSTALLED_TEMP} && \ 430 | echo "$(npm list -g)" >> ${INSTALLED_TEMP} 431 | 432 | #----------~~~~~~~~~~**********~~~~~~~~~~~-----------# 433 | # FINAL BUILD TARGETS 434 | #----------~~~~~~~~~~**********~~~~~~~~~~~-----------# 435 | # All stages which follow are intended to be used as a final target 436 | # for use by users. Otherwise known as production ready. 437 | 438 | #----------~~~~~~~~~~***** 439 | # build target: minimal 440 | #----------~~~~~~~~~~***** 441 | # intended as a functional bare-bones installation 442 | FROM pre-minimal as minimal 443 | COPY --from=stage2 /var/lib/jenkins/workspace /var/lib/jenkins/workspace 444 | COPY --from=stage2 /home/jenkins /home/jenkins 445 | COPY --from=jenv-final ${JENV_ROOT} ${JENV_ROOT} 446 | COPY --from=jenv-final ${INSTALLED_TEMP} ${DIRWORK}/.jenv_version 447 | COPY --from=jenv-final /root/.bash_profile /root/.bash_profile 448 | 449 | RUN chmod 775 -R $ANDROID_HOME && \ 450 | git config --global --add safe.directory ${JENV_ROOT} && \ 451 | cat ${DIRWORK}/.jenv_version >> ${INSTALLED_VERSIONS} && \ 452 | rm -rf ${DIRWORK}/* && \ 453 | echo "Android SDKs, Build tools, etc Installed: " >> ${INSTALLED_VERSIONS} && \ 454 | . /etc/jdk.env && \ 455 | ${ANDROID_SDK_MANAGER} --list_installed | tail --lines=+2 >> ${INSTALLED_VERSIONS} 456 | 457 | WORKDIR ${FINAL_DIRWORK} 458 | 459 | #----------~~~~~~~~~~***** 460 | # build target: complete 461 | #----------~~~~~~~~~~***** 462 | FROM node-final as complete 463 | COPY --from=stage1-final --chmod=775 ${ANDROID_HOME} ${ANDROID_HOME} 464 | COPY --from=stage2 /var/lib/jenkins/workspace /var/lib/jenkins/workspace 465 | COPY --from=stage2 /home/jenkins /home/jenkins 466 | COPY --from=bundletool-final $ANDROID_SDK_HOME/cmdline-tools/latest/bundletool.jar $ANDROID_SDK_HOME/cmdline-tools/latest/bundletool.jar 467 | COPY --from=ndk-final --chmod=775 ${ANDROID_NDK_ROOT}/../ ${ANDROID_NDK_ROOT}/../ 468 | COPY --from=jenv-final ${JENV_ROOT} ${JENV_ROOT} 469 | COPY --from=jenv-final /root/.bash_profile /root/.bash_profile 470 | 471 | COPY --from=bundletool-final ${INSTALLED_TEMP} ${DIRWORK}/.bundletool_version 472 | COPY --from=jenv-final ${INSTALLED_TEMP} ${DIRWORK}/.jenv_version 473 | 474 | COPY README.md /README.md 475 | 476 | RUN chmod 775 $ANDROID_HOME $ANDROID_NDK_ROOT/../ && \ 477 | git config --global --add safe.directory ${JENV_ROOT} && \ 478 | cat ${DIRWORK}/.*_version >> ${INSTALLED_VERSIONS} && \ 479 | rm -rf ${DIRWORK}/* && \ 480 | echo "Android SDKs, Build tools, etc Installed: " >> ${INSTALLED_VERSIONS} && \ 481 | . /etc/jdk.env && \ 482 | ${ANDROID_SDK_MANAGER} --list_installed | tail --lines=+2 >> ${INSTALLED_VERSIONS} && \ 483 | ls -l $ANDROID_HOME && \ 484 | ls -l $ANDROID_HOME/ndk && \ 485 | ls -l $ANDROID_HOME/ndk/* && \ 486 | du -sh $ANDROID_HOME 487 | 488 | WORKDIR ${FINAL_DIRWORK} 489 | 490 | #----------~~~~~~~~~~***** 491 | # build target: complete-flutter 492 | #----------~~~~~~~~~~***** 493 | FROM --platform=linux/amd64 complete as complete-flutter 494 | COPY --from=flutter-final ${FLUTTER_HOME} ${FLUTTER_HOME} 495 | COPY --from=flutter-final /root/.flutter /root/.flutter 496 | COPY --from=flutter-final /root/.config/flutter /root/.config/flutter 497 | COPY --from=flutter-final ${INSTALLED_TEMP} ${DIRWORK}/.flutter_version 498 | 499 | RUN git config --global --add safe.directory ${FLUTTER_HOME} && \ 500 | cat ${DIRWORK}/.flutter_version >> ${INSTALLED_VERSIONS} && \ 501 | rm -rf ${DIRWORK}/* 502 | 503 | # labels, see http://label-schema.org/ 504 | LABEL maintainer="Ming Chen" 505 | LABEL org.label-schema.schema-version="1.0" 506 | LABEL org.label-schema.name="mingc/android-build-box" 507 | LABEL org.label-schema.version="${DOCKER_TAG}" 508 | LABEL org.label-schema.usage="/README.md" 509 | LABEL org.label-schema.docker.cmd="docker run --rm -v `pwd`:${FINAL_DIRWORK} mingc/android-build-box bash -c './gradlew build'" 510 | LABEL org.label-schema.build-date="${BUILD_DATE}" 511 | LABEL org.label-schema.vcs-ref="${SOURCE_COMMIT}@${SOURCE_BRANCH}" 512 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | gem "rake" 4 | gem "fastlane" 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 Ming Chen 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Docker Android Build Box 2 | 3 | [![docker icon](https://dockeri.co/image/mingc/android-build-box)](https://hub.docker.com/r/mingc/android-build-box/) 4 | [![Docker Image CI](https://github.com/mingchen/docker-android-build-box/actions/workflows/docker-image.yml/badge.svg)](https://github.com/mingchen/docker-android-build-box/actions/workflows/docker-image.yml) 5 | 6 | ## Introduction 7 | 8 | An optimized **Docker** image that includes the **Android SDK** and **Flutter SDK**. 9 | 10 | ## What Is Inside 11 | 12 | The *latest* image will always have the latest software installed, including the last 8 Android SDKs for platforms and associated build tools. 13 | The Dockerhub description, accessible by clicking the Docker badge above, has an always up-to-date listing of the software installed on the *latest* image. 14 | Please also see the [matrixes](COMPATIBILITY.md) file for details on the various software installed on the tagged release and the *latest* image. 15 | 16 | The last **tagged** release includes the following components: 17 | 18 | * Ubuntu 22.04 19 | * Java - OpenJDK 20 | * 8 (1.8) 21 | * 11 22 | * 17 23 | * 21 24 | * Android SDKs for platforms: 25 | * 28 26 | * 29 27 | * 30 28 | * 31 29 | * 32 30 | * 33 31 | * 34 32 | * 35 33 | * Android build tools: 34 | * 28.0.1 28.0.2 28.0.3 35 | * 29.0.2 29.0.3 36 | * 30.0.0 30.0.2 30.0.3 37 | * 31.0.0 38 | * 32.0.0 39 | * 33.0.0 33.0.1 33.0.2 33.0.3 40 | * 34.0.0 41 | * 35.0.0 42 | * Android NDK - r28c 43 | * [Android bundletool](https://github.com/google/bundletool) 44 | * Android Emulator 45 | * cmake 46 | * TestNG 47 | * Python 3.8.10 48 | * Node.js 22, npm, React Native 49 | * Ruby, RubyGems 50 | * fastlane 51 | * Flutter 3.16.9 52 | * [jEnv](https://www.jenv.be) 53 | 54 | 55 | ## Pull Docker Image 56 | 57 | The docker image is automatically built publicly on *Github Action* based on the `Dockerfile` in this repo, there is no hidden stuff in it. 58 | 59 | To pull the latest docker image: 60 | 61 | ```sh 62 | docker pull mingc/android-build-box:latest 63 | ``` 64 | 65 | **Hint:** You can use a tag to a specific stable version, 66 | rather than `latest` of docker image, to avoid breaking your build. 67 | e.g. `mingc/android-build-box:1.25.0`. 68 | 69 | Take a look at the [**Tags List**](https://github.com/mingchen/docker-android-build-box/tags) to see all the available tags, the [Changelog](CHANGELOG.md) to see the changes between tags, and the [Compatibility Matrices](COMPATIBILITY.md) to see matrices of the various software available, that is tag `1.2.0` has SDKs x, y, and z... etc. 70 | 71 | ## Usage 72 | 73 | ### Use the image to build an Android project 74 | 75 | Please see the [caches section](#caches) for how to use caching. 76 | 77 | You can use this docker image to build your Android project with a single docker command: 78 | 79 | ```sh 80 | cd # change working directory to your project root directory. 81 | docker run --rm -v `pwd`:/project mingc/android-build-box bash -c 'cd /project; ./gradlew build' 82 | ``` 83 | 84 | To build `.aab` bundle release, use `./gradlew bundleRelease`: 85 | 86 | ```sh 87 | cd # change working directory to your project root directory. 88 | docker run --rm -v `pwd`:/project mingc/android-build-box bash -c 'cd /project; ./gradlew bundleRelease' 89 | ``` 90 | 91 | Run docker image with interactive bash shell: 92 | 93 | ```sh 94 | docker run -v `pwd`:/project -it mingc/android-build-box bash -l 95 | ``` 96 | 97 | ### Caches 98 | 99 | Please be aware that caching will not reduce the total disk space needed, but will increase it. For example, with the [Android SDK](#android-sdk-cache) this will potentially double the amound of space. First there is the space needed for the image itself, and then the space needed for the cache. For example for `1.25.0`, the image needs 16.2GB of space and then if one where to cache the SDK, without any changes, then there would be an additional 6GB of space needed; 16.2GB (raw image) + SDK Cache (6GB by default). 100 | 101 | #### jEnv Cache 102 | 103 | To allow for the global java setting via jEnv, the file `/root/.jenv/version`, to be cached the simplest way is to cache the complete jEnv folder, `/root/.jenv/`. 104 | 105 | First create the directory on the host where jEnv will be cached. For this example it will be in `~/.dockercache/jenv/`: 106 | ```sh 107 | # mkdir ~/.dockercache/jenv 108 | ``` 109 | 110 | Second create a *named volume*, named `jenv-cache`. A *named volume* is necessary to allow the container's contents of jEnv to remain. The simplest manner is as follows: 111 | ```sh 112 | # docker volume create --driver local --opt type=none --opt device=~/.dockercache/jenv/ --opt o=bind jenv-cache 113 | ``` 114 | 115 | And finally when you create / run the container, be sure to include the *named volume* by adding the following to the command: 116 | ```sh 117 | -v jenv-cache:"/root/.jenv/" 118 | ``` 119 | e.g. 120 | ```sh 121 | # docker run --rm -v jenv-cache:"/root/.jenv/" mingc/android-build-box bash -l `echo "Hello World"` 122 | ``` 123 | 124 | #### Gradle Cache 125 | 126 | Add the following arguments to the docker command to cache the home gradle folder: 127 | ```sh 128 | -v "$HOME/.dockercache/gradle":"/root/.gradle" 129 | ``` 130 | e.g. 131 | ```sh 132 | docker run --rm -v `pwd`:/project -v "$HOME/.dockercache/gradle":"/root/.gradle" mingc/android-build-box bash -c 'cd /project; ./gradlew build' 133 | ``` 134 | 135 | The final step is to turn caching on by adding: 136 | ```sh 137 | org.gradle.caching=true 138 | ``` 139 | to your `gradle.properties`. Either the project's `gradle.properties` or the global `gradle.properties` in `$HOME/.dockercache/gradle/gradle.properties`. 140 | 141 | #### Android SDK Cache 142 | 143 | The benefit of caching the SDK is it allows for SDK platforms / build-tools to be updated / removed in the image. For example, in `1.25.0` one could drop SDKs 27, 28, and 29; as well as adding build-tools 34. As of `1.25.0` `/opt/android-sdk/` will need about 6G of disk space. 144 | 145 | As with the [jEnv cache](#jenv-cache) a named volume will be needed. 146 | 147 | First create the directory on the host where the SDKs will be cached. For this example it will be in `~/.dockercache/android-sdk/`: 148 | ```sh 149 | # mkdir ~/.dockercache/android-sdk 150 | ``` 151 | 152 | Second create a named volume, named `android-sdk-cache`. A *named volume* is necessary to allow the container's contents to remain. The simplest manner is as follows: 153 | ```sh 154 | # docker volume create --driver local --opt type=none --opt device=~/.dockercache/android-sdk/ --opt o=bind android-sdk-cache 155 | android-sdk-cache 156 | ``` 157 | 158 | And finally when you create / run the container, be sure to include the *named volume* by adding the following to the command: 159 | ```sh 160 | -v android-sdk-cache:"/opt/android-sdk/" 161 | ``` 162 | e.g. 163 | ```sh 164 | # docker run --rm -v android-sdk-cache:"/opt/android-sdk/" mingc/android-build-box bash -l 165 | ``` 166 | 167 | Now within the container one may interact with the sdkmanager to install build tools, platforms, etc as needed. Some brief commands... 168 | to list what is installed: 169 | ```sh 170 | # sdkmanager --list_installed 171 | ``` 172 | To uninstall a platform: 173 | ```sh 174 | # sdkmanager --uninstall 'platforms;android-26' 175 | ``` 176 | To install a platform: 177 | ```sh 178 | # sdkmanager --install 'platforms;android-26' 179 | ``` 180 | Both the `--install` and `--uninstall` flags allow for a list to be passed, that is: 181 | ```sh 182 | # sdkmanager --uninstall 'platforms;android-26' 'platforms;android-27' 183 | ``` 184 | 185 | Full documentation is available [here](https://developer.android.com/studio/command-line/sdkmanager). 186 | ### Suggested gradle.properties 187 | 188 | Setting the following `jvmargs` for gradle are suggested: 189 | * `-Xmx8192m` 190 | * Sets the max memory the JVM may use to 8192m, values of g, that is gb, are supported. 191 | * `-XX:MaxMetaspaceSize=1024m` 192 | * Must set due to gradle bug gradle/gradle#19750, else is unbounded. 193 | * `-XX:+UseContainerSupport` 194 | * Allow JVM to know it's in a container, optional as is default. 195 | * `-XX:MaxRAMPercentage=97.5` 196 | * Allow JVM to use at most 97.5% of the RAM in container, can be set to 1. 197 | 198 | The total memory available to the container should be greater than the Xmx value + the MaxMetaspaceSize. For example, if 10gb is allocated to the container, and using the already listed values, then we have 10gb = 8gb (Xmx) + 1gb (MaxMetaspaceSize) + 1gb (overhead / buffer / other). If the container has 4gb of memory available than the following would be reasonable settings: 4gb = 3072m (Xmx) + 756m (MaxMetaspaceSize) + 256mb (overhead / etc). 199 | 200 | In total the `gradle.properties` would be: 201 | ```sh 202 | org.gradle.jvmargs=-Xmx8192m -XX:MaxMetaspaceSize=1024m -XX:+UseContainerSupport -XX:MaxRAMPercentage=97.5 203 | ``` 204 | or 205 | ```sh 206 | org.gradle.jvmargs=-Xmx3072m -XX:MaxMetaspaceSize=756m -XX:+UseContainerSupport -XX:MaxRAMPercentage=97.5 207 | ``` 208 | 209 | ### Build an Android project with [Bitbucket Pipelines](https://bitbucket.org/product/features/pipelines) 210 | 211 | If you have an Android project in a Bitbucket repository and want to use the pipeline feature to build it, 212 | you can simply specify this docker image. 213 | Here is an example of `bitbucket-pipelines.yml`: 214 | 215 | ```yml 216 | image: mingc/android-build-box:latest 217 | 218 | pipelines: 219 | default: 220 | - step: 221 | caches: 222 | - gradle 223 | - gradle-wrapper 224 | - android-emulator 225 | script: 226 | - . ~/.bash_profile 227 | - jenv global 11 # switch java version 228 | - bash ./gradlew assemble 229 | definitions: 230 | caches: 231 | gradle-wrapper: ~/.gradle/wrapper 232 | android-emulator: $ANDROID_HOME/system-images/android-21 233 | ``` 234 | 235 | The caches are used to [store downloaded dependencies](https://confluence.atlassian.com/bitbucket/caching-dependencies-895552876.html) from previous builds, to speed up the next builds. 236 | 237 | ### Build a Flutter project with [Github Actions](https://github.com/features/actions) 238 | 239 | Here is an example `.github/workflows/main.yml` to build a Flutter project with this docker image: 240 | 241 | ```yml 242 | name: CI 243 | 244 | on: [push] 245 | 246 | jobs: 247 | build: 248 | 249 | runs-on: ubuntu-20.04 250 | container: mingc/android-build-box:latest 251 | 252 | steps: 253 | - uses: actions/checkout@v3 254 | - uses: actions/cache@v3 255 | with: 256 | path: /root/.gradle/caches 257 | key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }} 258 | restore-keys: | 259 | ${{ runner.os }}-gradle- 260 | - name: Build 261 | run: | 262 | echo "Work dir: $(pwd)" 263 | echo "User: $(whoami)" 264 | flutter --version 265 | flutter analyze 266 | flutter build apk 267 | - name: Archive apk 268 | uses: actions/upload-artifact@v3 269 | with: 270 | name: apk 271 | path: build/app/outputs/apk 272 | - name: Test 273 | run: flutter test 274 | - name: Clean build to avoid action/cache error 275 | run: rm -fr build 276 | ``` 277 | 278 | Note: For improved security reference the action directly by commit hash and not tag. Please see our own [action](.github/workflows/docker-image.yml) for an examples. 279 | 280 | ### Run an Android emulator in the Docker build machine 281 | 282 | Using guidelines from... 283 | 284 | * https://medium.com/@AndreSand/android-emulator-on-docker-container-f20c49b129ef 285 | * https://spin.atomicobject.com/2016/03/10/android-test-script/ 286 | * https://paulemtz.blogspot.com/2013/05/android-testing-in-headless-emulator.html 287 | 288 | ...You can write a script to create and launch an ARM emulator, which can be used for running integration tests or instrumentation tests or unit tests: 289 | 290 | ```sh 291 | #!/bin/bash 292 | 293 | # Arm emulators can be quite slow. For this reason it is convenient 294 | # to increase the adb timeout to avoid errors. 295 | export ADB_INSTALL_TIMEOUT=30 296 | 297 | # Download an ARM system image to create an ARM emulator. 298 | sdkmanager "system-images;android-22;default;armeabi-v7a" 299 | 300 | # Create an ARM AVD emulator, with a 100 MB SD card storage space. Echo "no" 301 | # because it will ask if you want to use a custom hardware profile, and you don't. 302 | # https://medium.com/@AndreSand/android-emulator-on-docker-container-f20c49b129ef 303 | echo "no" | avdmanager create avd \ 304 | -n Android_5.1_API_22 \ 305 | -k "system-images;android-22;default;armeabi-v7a" \ 306 | -c 100M \ 307 | --force 308 | 309 | # Launch the emulator in the background 310 | $ANDROID_HOME/emulator/emulator -avd Android_5.1_API_22 -no-skin -no-audio -no-window -no-boot-anim -gpu off & 311 | 312 | # Note: You will have to add a suitable time delay, to wait for the emulator to launch. 313 | ``` 314 | 315 | Note that x86_64 emulators are not currently supported. See [Issue #18](https://github.com/mingchen/docker-android-build-box/issues/18) for details. 316 | 317 | ### Choose the system Java version 318 | 319 | As of `1.23.0`, `jenv` is used to switch `java` versions. Versions prior to `1.23.0` used `update-alternatives`; brief documentation is available [here](https://github.com/mingchen/docker-android-build-box/tree/95fde4a765cecf6d43b084190394fd43bef5bfd1#choose-the-system-java-version). 320 | 321 | Please also see the [installed java versions matrix](COMPATIBILITY.md#Installed-Java-Versions-Matrix) for the installed java versions and [jEnv Cache](#jenv-cache) on how to cache the *global* java version. 322 | 323 | To allow `jenv` work properly, please run following command before any `jenv` command: 324 | 325 | ```sh 326 | . ~/.bash_profile 327 | ``` 328 | 329 | The following documentation is for `jenv`. Please note that if the container is removed, that is run with the `--rm` flag, *global* changes will not persist unless jEnv is cached. 330 | 331 | List all the available `java` versions: 332 | 333 | ```sh 334 | # jenv versions 335 | system 336 | 11 337 | 11.0 338 | 11.0.17 339 | 17 340 | * 17.0 (set by /root/.jenv/version) 341 | 17.0.5 342 | 1.8 343 | 1.8.0.352 344 | openjdk64-11.0.17 345 | openjdk64-17.0.5 346 | openjdk64-1.8.0.352 347 | ``` 348 | 349 | Switch *global* `java` version to **Java 8**: 350 | 351 | ```sh 352 | root@f7e7773edb7f:/project# jenv global 1.8 353 | root@f7e7773edb7f:/project# java -version 354 | openjdk version "1.8.0_352" 355 | OpenJDK Runtime Environment (build 1.8.0_352-8u352-ga-1~20.04-b08) 356 | OpenJDK 64-Bit Server VM (build 25.352-b08, mixed mode) 357 | ``` 358 | 359 | Switch *global* `java` version to **Java 11**: 360 | 361 | ```sh 362 | root@f7e7773edb7f:/project# jenv global 11 363 | root@f7e7773edb7f:/project# java -version 364 | openjdk version "11.0.17" 2022-10-18 365 | OpenJDK Runtime Environment (build 11.0.17+8-post-Ubuntu-1ubuntu220.04) 366 | OpenJDK 64-Bit Server VM (build 11.0.17+8-post-Ubuntu-1ubuntu220.04, mixed mode, sharing) 367 | ``` 368 | 369 | Switch local, that is current folder, `java` version to **Java 1.8**: 370 | 371 | ```sh 372 | root@f7e7773edb7f:/project# jenv local 1.8 373 | root@f7e7773edb7f:/project# java -version 374 | openjdk version "1.8.0_352" 375 | OpenJDK Runtime Environment (build 1.8.0_352-8u352-ga-1~20.04-b08) 376 | OpenJDK 64-Bit Server VM (build 25.352-b08, mixed mode) 377 | root@f7e7773edb7f:/project# cd .. 378 | root@f7e7773edb7f:/# java -version 379 | openjdk version "17.0.5" 2022-10-18 380 | OpenJDK Runtime Environment (build 17.0.5+8-Ubuntu-2ubuntu120.04) 381 | OpenJDK 64-Bit Server VM (build 17.0.5+8-Ubuntu-2ubuntu120.04, mixed mode, sharing) 382 | ``` 383 | 384 | This can also be done by creating a `.java-version` file in the directory. See the SampleProject file [here](test_projects/SampleProject/.java-version) for an example. 385 | 386 | ## Build the Docker Image 387 | 388 | Check your free disk space before building it as the image can be anywhere from ~10GB - ~16GB in size. 389 | 390 | Docker buildx is used so at a minimum Docker Engine version 19.03 or later is required. 391 | 392 | If you want to build the docker image by yourself, you can use following command. 393 | 394 | ```sh 395 | docker buildx build -t android-build-box . 396 | ``` 397 | 398 | There are three build targets. The default is `complete-flutter`. The other two targets available are `minimal` and `complete`. 399 | 400 | | Build Target | SDK CLI Tools | jEnv | platform-tools; | platforms / build-tools | bundletool | NDK | Fastlane / Rake | Node, etc | Flutter | 401 | |:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:| 402 | | minimal | ✅ | ✅ | ✅ | ❌ | ❌ |❌ | ❌ | ❌ | ❌ | 403 | | complete | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | 404 | | complete-flutter | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 405 | 406 | No matter the build target chosen, the default will be to grab the latest software. This means the latest SDK CLI tools, jEnv, etc. With regards to the platforms; / build-tools the last 8 platforms are used as well as all associated build tools and any extensions. 407 | 408 | If you wish to use the version of software specified in the file in the `_TAGGED` build argument must be set to `tagged`. If you wish to specifiy the software version to be installed, then the `_TAGGED` argument must be set as mentioned, and the `_VERSION` build argument must be set to the desired version. 409 | 410 | For example, build target of `minimal` with SDK CLI tool `4333796` and jEnv `0.5.6`: 411 | ```sh 412 | docker buildx build --target minimal --build-arg ANDROID_SDK_TOOLS_TAGGED="tagged" --build-arg ANDROID_SDK_TOOLS_VERSION="4333796" --build-arg JENV_TAGGED="tagged" --build-arg JENV_RELEASE="0.5.6" 413 | ``` 414 | 415 | Please see the [Dockerfile](Dockerfile) for all the variable names. Also note, that jEnv is special so the version is specified by the argument `JENV_RELEASE`. 416 | 417 | ## Changelog 418 | 419 | Please see the dedicated changelog [here](CHANGELOG.md). 420 | 421 | ## Compatibility 422 | 423 | Please see the compatibility matrices [here](COMPATIBILITY.md). 424 | 425 | ## Contribution 426 | 427 | If you want to enhance this docker image or fix something, 428 | feel free to send a [pull request](https://github.com/mingchen/docker-android-build-box/pull/new/master). 429 | 430 | Please also preface commits with `DOCS:` when editing any documentation and `CI:` when editing `.github/workflows/`. 431 | 432 | Also note that building / testing can use up a lot of space. After developing a feature and prune-ing, routinely 100GB of space is freed. 433 | 434 | ## References 435 | 436 | * [Dockerfile reference](https://docs.docker.com/engine/reference/builder/) 437 | * [Best practices for writing Dockerfiles](https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/) 438 | * [Build your own image](https://docs.docker.com/engine/getstarted/step_four/) 439 | * [uber android build environment](https://hub.docker.com/r/uber/android-build-environment/) 440 | * [Refactoring a Dockerfile for image size](https://blog.replicated.com/refactoring-a-dockerfile-for-image-size/) 441 | * [Label Schema](http://label-schema.org/) 442 | -------------------------------------------------------------------------------- /howto.txt: -------------------------------------------------------------------------------- 1 | # short how to use this repo to build docker image from scratch and use 2 | 3 | # build image and assign it a name of android-sdk 4 | docker build -t android-sdk . 5 | 6 | # See gradlew tasks for project 7 | docker run --rm -v ${PWD}:/project -v "$HOME/.dockercache/gradle":"/root/.gradle" android-sdk bash -c 'cd /project; ./gradlew tasks' 8 | 9 | # build app using the assembleRelease task 10 | docker run --rm -v ${PWD}:/project -v "$HOME/.dockercache/gradle":"/root/.gradle" android-sdk bash -c 'cd /project &&\ 11 | ./gradlew assembleRelease' 12 | -------------------------------------------------------------------------------- /sdk/licenses/android-googletv-license: -------------------------------------------------------------------------------- 1 | 2 | 601085b94cd77f0b54ff86406957099ebe79c4d6 -------------------------------------------------------------------------------- /sdk/licenses/android-sdk-license: -------------------------------------------------------------------------------- 1 | 8933bad161af4178b1185d1a37fbf41ea5269c55 2 | d56f5187479451eabf01fb78af6dfcb131a6481e 3 | 24333f8a63b6825ea9c5514f83c2829b004d1fee 4 | -------------------------------------------------------------------------------- /sdk/licenses/android-sdk-preview-license: -------------------------------------------------------------------------------- 1 | 2 | 84831b9409646a918e30573bab4c9c91346d8abd -------------------------------------------------------------------------------- /sdk/licenses/google-gdk-license: -------------------------------------------------------------------------------- 1 | 2 | 33b6a2b64607f11b759f320ef9dff4ae5c47d97a -------------------------------------------------------------------------------- /sdk/licenses/intel-android-extra-license: -------------------------------------------------------------------------------- 1 | 2 | d975f751698a77b662f1254ddbeed3901e976f5a -------------------------------------------------------------------------------- /sdk/licenses/mips-android-sysimage-license: -------------------------------------------------------------------------------- 1 | 2 | e9acab5b5fbb560a72cfaecce8946896ff6aab9d -------------------------------------------------------------------------------- /tagged_sdk_packages_list.txt: -------------------------------------------------------------------------------- 1 | platforms;android-35 2 | platforms;android-34 3 | platforms;android-33 4 | platforms;android-32 5 | platforms;android-31 6 | platforms;android-30 7 | platforms;android-29 8 | platforms;android-28 9 | build-tools;35.0.0 10 | build-tools;34.0.0 11 | build-tools;33.0.3 12 | build-tools;33.0.2 13 | build-tools;33.0.1 14 | build-tools;33.0.0 15 | build-tools;32.0.0 16 | build-tools;31.0.0 17 | build-tools;30.0.3 18 | build-tools;30.0.2 19 | build-tools;30.0.0 20 | build-tools;29.0.3 21 | build-tools;29.0.2 22 | build-tools;28.0.3 23 | build-tools;28.0.2 24 | -------------------------------------------------------------------------------- /test_projects/SampleProject/.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | .cxx 15 | /Gemfile.lock 16 | /fastlane/README.md 17 | /fastlane/report.xml 18 | -------------------------------------------------------------------------------- /test_projects/SampleProject/.java-version: -------------------------------------------------------------------------------- 1 | 1.8 2 | # Sets the java version to use via jenv 3 | # First line must be a java version installed and recognized by `jenv versions` 4 | # Valid versions are always: 1.8, 11, 11.0, 17, or 17.0 5 | # Valid versions are sometimes: 1.8.0.352, 11.0.17, 17.0.5 6 | -------------------------------------------------------------------------------- /test_projects/SampleProject/Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | gem "fastlane" 4 | -------------------------------------------------------------------------------- /test_projects/SampleProject/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /test_projects/SampleProject/app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'kotlin-android' 3 | apply plugin: 'kotlin-android-extensions' 4 | 5 | android { 6 | compileSdkVersion 29 7 | buildToolsVersion "29.0.3" 8 | 9 | defaultConfig { 10 | applicationId "com.github.mingchen.sampleproject" 11 | minSdkVersion 23 12 | targetSdkVersion 29 13 | versionCode 1 14 | versionName "1.0" 15 | 16 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 17 | } 18 | 19 | buildTypes { 20 | release { 21 | minifyEnabled false 22 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 23 | } 24 | } 25 | } 26 | 27 | dependencies { 28 | implementation fileTree(dir: "libs", include: ["*.jar"]) 29 | implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" 30 | implementation 'androidx.core:core-ktx:1.1.0' 31 | implementation 'androidx.appcompat:appcompat:1.1.0' 32 | implementation 'androidx.constraintlayout:constraintlayout:1.1.3' 33 | testImplementation 'junit:junit:4.12' 34 | androidTestImplementation 'androidx.test.ext:junit:1.1.1' 35 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' 36 | 37 | } -------------------------------------------------------------------------------- /test_projects/SampleProject/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /test_projects/SampleProject/app/src/androidTest/java/com/github/mingchen/sampleproject/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.github.mingchen.sampleproject 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 22 | assertEquals("com.github.mingchen.sampleproject", appContext.packageName) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /test_projects/SampleProject/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /test_projects/SampleProject/app/src/main/java/com/github/mingchen/sampleproject/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.github.mingchen.sampleproject 2 | 3 | import androidx.appcompat.app.AppCompatActivity 4 | import android.os.Bundle 5 | 6 | class MainActivity : AppCompatActivity() { 7 | override fun onCreate(savedInstanceState: Bundle?) { 8 | super.onCreate(savedInstanceState) 9 | setContentView(R.layout.activity_main) 10 | } 11 | } -------------------------------------------------------------------------------- /test_projects/SampleProject/app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 15 | 18 | 21 | 22 | 23 | 24 | 30 | 31 | -------------------------------------------------------------------------------- /test_projects/SampleProject/app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /test_projects/SampleProject/app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /test_projects/SampleProject/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /test_projects/SampleProject/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /test_projects/SampleProject/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingchen/docker-android-build-box/bd4d4c5bd5b011814510cc76a22aa961bdcac35d/test_projects/SampleProject/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /test_projects/SampleProject/app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingchen/docker-android-build-box/bd4d4c5bd5b011814510cc76a22aa961bdcac35d/test_projects/SampleProject/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /test_projects/SampleProject/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingchen/docker-android-build-box/bd4d4c5bd5b011814510cc76a22aa961bdcac35d/test_projects/SampleProject/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /test_projects/SampleProject/app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingchen/docker-android-build-box/bd4d4c5bd5b011814510cc76a22aa961bdcac35d/test_projects/SampleProject/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /test_projects/SampleProject/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingchen/docker-android-build-box/bd4d4c5bd5b011814510cc76a22aa961bdcac35d/test_projects/SampleProject/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /test_projects/SampleProject/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingchen/docker-android-build-box/bd4d4c5bd5b011814510cc76a22aa961bdcac35d/test_projects/SampleProject/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /test_projects/SampleProject/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingchen/docker-android-build-box/bd4d4c5bd5b011814510cc76a22aa961bdcac35d/test_projects/SampleProject/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /test_projects/SampleProject/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingchen/docker-android-build-box/bd4d4c5bd5b011814510cc76a22aa961bdcac35d/test_projects/SampleProject/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /test_projects/SampleProject/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingchen/docker-android-build-box/bd4d4c5bd5b011814510cc76a22aa961bdcac35d/test_projects/SampleProject/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /test_projects/SampleProject/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingchen/docker-android-build-box/bd4d4c5bd5b011814510cc76a22aa961bdcac35d/test_projects/SampleProject/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /test_projects/SampleProject/app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #6200EE 4 | #3700B3 5 | #03DAC5 6 | 7 | -------------------------------------------------------------------------------- /test_projects/SampleProject/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Sample Project 3 | -------------------------------------------------------------------------------- /test_projects/SampleProject/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /test_projects/SampleProject/app/src/test/java/com/github/mingchen/sampleproject/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package com.github.mingchen.sampleproject 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | */ 12 | class ExampleUnitTest { 13 | @Test 14 | fun addition_isCorrect() { 15 | assertEquals(4, 2 + 2) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /test_projects/SampleProject/build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | buildscript { 3 | ext.kotlin_version = "1.3.72" 4 | repositories { 5 | google() 6 | jcenter() 7 | } 8 | dependencies { 9 | classpath "com.android.tools.build:gradle:4.0.1" 10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 11 | 12 | // NOTE: Do not place your application dependencies here; they belong 13 | // in the individual module build.gradle files 14 | } 15 | } 16 | 17 | allprojects { 18 | repositories { 19 | google() 20 | jcenter() 21 | } 22 | } 23 | 24 | task clean(type: Delete) { 25 | delete rootProject.buildDir 26 | } -------------------------------------------------------------------------------- /test_projects/SampleProject/fastlane/Appfile: -------------------------------------------------------------------------------- 1 | json_key_file("") # Path to the json secret file - Follow https://docs.fastlane.tools/actions/supply/#setup to get one 2 | package_name("com.github.mingchen.sampleproject") # e.g. com.krausefx.app 3 | -------------------------------------------------------------------------------- /test_projects/SampleProject/fastlane/Fastfile: -------------------------------------------------------------------------------- 1 | # This file contains the fastlane.tools configuration 2 | # You can find the documentation at https://docs.fastlane.tools 3 | # 4 | # For a list of all available actions, check out 5 | # 6 | # https://docs.fastlane.tools/actions 7 | # 8 | # For a list of all available plugins, check out 9 | # 10 | # https://docs.fastlane.tools/plugins/available-plugins 11 | # 12 | 13 | # Uncomment the line if you want fastlane to automatically update itself 14 | # update_fastlane 15 | 16 | default_platform(:android) 17 | 18 | platform :android do 19 | desc "Build project" 20 | lane :build do 21 | gradle(task: "build") 22 | end 23 | 24 | desc "Runs all the tests" 25 | lane :test do 26 | gradle(task: "test") 27 | end 28 | 29 | desc "Submit a new Beta Build to Crashlytics Beta" 30 | lane :beta do 31 | gradle(task: "clean assembleRelease") 32 | crashlytics 33 | 34 | # sh "your_script.sh" 35 | # You can also use other beta testing services here 36 | end 37 | 38 | desc "Deploy a new version to the Google Play" 39 | lane :deploy do 40 | gradle(task: "clean assembleRelease") 41 | upload_to_play_store 42 | end 43 | end 44 | -------------------------------------------------------------------------------- /test_projects/SampleProject/gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | org.gradle.jvmargs=-Xmx2048m 10 | # When configured, Gradle will run in incubating parallel mode. 11 | # This option should only be used with decoupled projects. More details, visit 12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 13 | # org.gradle.parallel=true 14 | # AndroidX package structure to make it clearer which packages are bundled with the 15 | # Android operating system, and which are packaged with your app"s APK 16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn 17 | android.useAndroidX=true 18 | # Automatically convert third-party libraries to use AndroidX 19 | android.enableJetifier=true 20 | # Kotlin code style for this project: "official" or "obsolete": 21 | kotlin.code.style=official 22 | -------------------------------------------------------------------------------- /test_projects/SampleProject/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingchen/docker-android-build-box/bd4d4c5bd5b011814510cc76a22aa961bdcac35d/test_projects/SampleProject/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /test_projects/SampleProject/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Aug 07 07:07:17 PDT 2020 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip 7 | -------------------------------------------------------------------------------- /test_projects/SampleProject/gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Attempt to set APP_HOME 10 | # Resolve links: $0 may be a link 11 | PRG="$0" 12 | # Need this for relative symlinks. 13 | while [ -h "$PRG" ] ; do 14 | ls=`ls -ld "$PRG"` 15 | link=`expr "$ls" : '.*-> \(.*\)$'` 16 | if expr "$link" : '/.*' > /dev/null; then 17 | PRG="$link" 18 | else 19 | PRG=`dirname "$PRG"`"/$link" 20 | fi 21 | done 22 | SAVED="`pwd`" 23 | cd "`dirname \"$PRG\"`/" >/dev/null 24 | APP_HOME="`pwd -P`" 25 | cd "$SAVED" >/dev/null 26 | 27 | APP_NAME="Gradle" 28 | APP_BASE_NAME=`basename "$0"` 29 | 30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 31 | DEFAULT_JVM_OPTS="" 32 | 33 | # Use the maximum available, or set MAX_FD != -1 to use that value. 34 | MAX_FD="maximum" 35 | 36 | warn () { 37 | echo "$*" 38 | } 39 | 40 | die () { 41 | echo 42 | echo "$*" 43 | echo 44 | exit 1 45 | } 46 | 47 | # OS specific support (must be 'true' or 'false'). 48 | cygwin=false 49 | msys=false 50 | darwin=false 51 | nonstop=false 52 | case "`uname`" in 53 | CYGWIN* ) 54 | cygwin=true 55 | ;; 56 | Darwin* ) 57 | darwin=true 58 | ;; 59 | MINGW* ) 60 | msys=true 61 | ;; 62 | NONSTOP* ) 63 | nonstop=true 64 | ;; 65 | esac 66 | 67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 68 | 69 | # Determine the Java command to use to start the JVM. 70 | if [ -n "$JAVA_HOME" ] ; then 71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 72 | # IBM's JDK on AIX uses strange locations for the executables 73 | JAVACMD="$JAVA_HOME/jre/sh/java" 74 | else 75 | JAVACMD="$JAVA_HOME/bin/java" 76 | fi 77 | if [ ! -x "$JAVACMD" ] ; then 78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 79 | 80 | Please set the JAVA_HOME variable in your environment to match the 81 | location of your Java installation." 82 | fi 83 | else 84 | JAVACMD="java" 85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 86 | 87 | Please set the JAVA_HOME variable in your environment to match the 88 | location of your Java installation." 89 | fi 90 | 91 | # Increase the maximum file descriptors if we can. 92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 93 | MAX_FD_LIMIT=`ulimit -H -n` 94 | if [ $? -eq 0 ] ; then 95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 96 | MAX_FD="$MAX_FD_LIMIT" 97 | fi 98 | ulimit -n $MAX_FD 99 | if [ $? -ne 0 ] ; then 100 | warn "Could not set maximum file descriptor limit: $MAX_FD" 101 | fi 102 | else 103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 104 | fi 105 | fi 106 | 107 | # For Darwin, add options to specify how the application appears in the dock 108 | if $darwin; then 109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 110 | fi 111 | 112 | # For Cygwin, switch paths to Windows format before running java 113 | if $cygwin ; then 114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 116 | JAVACMD=`cygpath --unix "$JAVACMD"` 117 | 118 | # We build the pattern for arguments to be converted via cygpath 119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 120 | SEP="" 121 | for dir in $ROOTDIRSRAW ; do 122 | ROOTDIRS="$ROOTDIRS$SEP$dir" 123 | SEP="|" 124 | done 125 | OURCYGPATTERN="(^($ROOTDIRS))" 126 | # Add a user-defined pattern to the cygpath arguments 127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 129 | fi 130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 131 | i=0 132 | for arg in "$@" ; do 133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 135 | 136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 138 | else 139 | eval `echo args$i`="\"$arg\"" 140 | fi 141 | i=$((i+1)) 142 | done 143 | case $i in 144 | (0) set -- ;; 145 | (1) set -- "$args0" ;; 146 | (2) set -- "$args0" "$args1" ;; 147 | (3) set -- "$args0" "$args1" "$args2" ;; 148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 154 | esac 155 | fi 156 | 157 | # Escape application args 158 | save () { 159 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 160 | echo " " 161 | } 162 | APP_ARGS=$(save "$@") 163 | 164 | # Collect all arguments for the java command, following the shell quoting and substitution rules 165 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 166 | 167 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong 168 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then 169 | cd "$(dirname "$0")" 170 | fi 171 | 172 | exec "$JAVACMD" "$@" 173 | -------------------------------------------------------------------------------- /test_projects/SampleProject/gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS= 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | 53 | :win9xME_args 54 | @rem Slurp the command line arguments. 55 | set CMD_LINE_ARGS= 56 | set _SKIP=2 57 | 58 | :win9xME_args_slurp 59 | if "x%~1" == "x" goto execute 60 | 61 | set CMD_LINE_ARGS=%* 62 | 63 | :execute 64 | @rem Setup the command line 65 | 66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 67 | 68 | @rem Execute Gradle 69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 70 | 71 | :end 72 | @rem End local scope for the variables with windows NT shell 73 | if "%ERRORLEVEL%"=="0" goto mainEnd 74 | 75 | :fail 76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 77 | rem the _cmd.exe /c_ return code! 78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 79 | exit /b 1 80 | 81 | :mainEnd 82 | if "%OS%"=="Windows_NT" endlocal 83 | 84 | :omega 85 | -------------------------------------------------------------------------------- /test_projects/SampleProject/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | rootProject.name = "Sample Project" --------------------------------------------------------------------------------