├── .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 | [](https://hub.docker.com/r/mingc/android-build-box/)
4 | [](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"
--------------------------------------------------------------------------------