这篇文章以Android SDK 26.1.1 和gradle 6.0.1为例,介绍如何安卓应用构建的容器化方式,前面文章介绍了gradle wrapper的使用方式,而本文方式则是固定gradle版本在镜像之中的方式,如果需要变动直接调整镜像的FROM生成新的构建镜像即可。
############################################################################### # #IMAGE: Android SDK #VERSION: 26.1.1 # Gradle: 6.0.1 # JDK 1.8 # ############################################################################### FROM liumiaocn/gradle:jdk8.6.0.1 ############################################################################### #MAINTAINER ############################################################################### MAINTAINER LiuMiao ############################################################################### #ENVIRONMENT VARS ############################################################################### ENV ANDROID_HOME /usr/local/android ENV PATH ${PATH}:${ANDROID_HOME}/tools:${ANDROID_HOME}/tools/bin:${ANDROID_HOME}/platform-tools ############################################################################### # install gradle ############################################################################### ARG SDK_ZIP_FILE=sdk-tools-linux-4333796.zip ARG SDK_TOOLS_URL=https://dl.google.com/android/repository/${SDK_ZIP_FILE} RUN set -o errexit -o nounset \ && wget ${SDK_TOOLS_URL} \ && unzip ${SDK_ZIP_FILE} \ && mkdir -p ${ANDROID_HOME} \ && mv tools ${ANDROID_HOME} \ && cd ${ANDROID_HOME}/tools/bin \ && mkdir -p /root/.android \ && touch /root/.android/repositories.cfg \ && yes | sdkmanager --licenses \ && ./sdkmanager platform-tools "platforms;android-29" "build-tools;29.0.2"
Dockerfile说明:
- 在前文SDK的镜像构建方法之中已经说明:https://liumiaocn.blog.csdn.net/article/details/103640872
- FROM:是唯一的不同之处,前面SDK镜像只是用OPENJDK作为基础镜像,而本文示例则使用Gradle 6.0.1的镜像作为基础镜像。
下载命令:docker pull liumiaocn/android:sdk.26.1.1.gradle.6.0.1
版本确认liumiaocn:android liumiao$ docker run --rm liumiaocn/android:sdk.26.1.1.gradle.6.0.1 gradle --version ------------------------------------------------------------ Gradle 6.0.1 ------------------------------------------------------------ Build time: 2019-11-18 20:25:01 UTC Revision: fad121066a68c4701acd362daf4287a7c309a0f5 Kotlin: 1.3.50 Groovy: 2.5.8 Ant: Apache Ant(TM) version 1.10.7 compiled on September 1 2019 JVM: 1.8.0_232 (AdoptOpenJDK 25.232-b09) OS: Linux 4.9.184-linuxkit amd64 liumiaocn:android liumiao$Demo应用
此镜像与前文的gradlew使用方式的镜像有所区别,gradlew更像是一个带着gradle安装程序的配置文件方式,所以需要一个包含gradlew配置的工程在镜像之中,本文的镜像更为纯粹,就是Android工程的构建环境:Android SDK + Gradle,所使用的代码工程如下所示:
- https://github.com/liumiaocn/easypack/tree/master/containers/standard/android/Demo
使用时通过-v将待构建的内容挂载到容器中,然后执行构建即可
liumiaocn:Demo liumiao$ ls Demo.iml build.gradle gradle.properties gradlew.bat local.properties app gradle gradlew keyReleaseV2.jks settings.gradle liumiaocn:Demo liumiao$ find . -type f |grep apk liumiaocn:Demo liumiao$ docker run --rm -v `pwd`:/data/Demo liumiaocn/android:sdk.26.1.1.gradle.6.0.1 gradle -b /data/Demo/build.gradle assembleRelease Starting a Gradle Daemon (subsequent builds will be faster) > Task :app:preBuild UP-TO-DATE > Task :app:preReleaseBuild UP-TO-DATE > Task :app:compileReleaseAidl NO-SOURCE > Task :app:checkReleaseManifest > Task :app:compileReleaseRenderscript NO-SOURCE > Task :app:generateReleaseBuildConfig > Task :app:javaPreCompileRelease > Task :app:mainApkListPersistenceRelease > Task :app:generateReleaseResValues > Task :app:generateReleaseResources > Task :app:createReleaseCompatibleScreenManifests > Task :app:processReleaseManifest > Task :app:mergeReleaseResources > Task :app:processReleaseResources > Task :app:compileReleaseJavaWithJavac > Task :app:compileReleaseSources > Task :app:prepareLintJar > Task :app:lintVitalRelease Calling mockable JAR artifact transform to create file: /home/gradle/.gradle/caches/transforms-2/files-2.1/9b93ae36d1d5a1d11f3fe6311b0e3a13/android.jar with input /usr/local/android/platforms/android-29/android.jar > Task :app:checkReleaseDuplicateClasses > Task :app:transformClassesWithDexBuilderForRelease > Task :app:mergeReleaseShaders > Task :app:compileReleaseShaders > Task :app:generateReleaseAssets > Task :app:mergeReleaseAssets > Task :app:processReleaseJavaRes NO-SOURCE > Task :app:validateSigningRelease > Task :app:signingConfigWriterRelease > Task :app:mergeExtDexRelease > Task :app:mergeReleaseJniLibFolders > Task :app:mergeReleaseNativeLibs > Task :app:stripReleaseDebugSymbols > Task :app:mergeReleaseJavaResource > Task :app:mergeDexRelease > Task :app:packageRelease > Task :app:assembleRelease Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0. Use '--warning-mode all' to show the individual deprecation warnings. See https://docs.gradle.org/6.0.1/userguide/command_line_interface.html#sec:command_line_warnings BUILD SUCCESSFUL in 2m 2s 26 actionable tasks: 26 executed liumiaocn:Demo liumiao$ liumiaocn:Demo liumiao$ find . -type f |grep apk ./app/build/intermediates/apk_list/release/mainApkListPersistenceRelease/apk-list.gson ./app/build/outputs/apk/release/output.json ./app/build/outputs/apk/release/app-release.apk liumiaocn:Demo liumiao$