在为Android平台开发项目时,即使最小的项目迟早也必须处理开发环境。 除了Android SDK,您还需要最新版本的Kotlin,Gradle,平台工具,构建工具。 而且,如果使用Android Studio IDE在开发人员的机器上解决了所有这些依赖关系,那么在CI / CD服务器上,每次更新都可能令人头疼。 如果在Web开发中,Docker成为解决环境问题的标准解决方案,那为什么不尝试在Android开发中尝试解决类似的问题...
对于那些不知道Docker是什么的人-如果它很简单,那么这就是所谓的创建工具。 包含最低OS内核和必要软件集的“容器”,我们可以将其部署在所需的任何位置,同时保留环境。 Dockerfile中定义了容器中将要包含的内容,然后将其组装成在任何地方启动并具有幂等属性的映像。
Docker的安装过程和基础知识已在其
官方网站上完美描述。 因此,先行一步,这里我们有这样的Dockerfile
# .. Android- Gradle, # Docker- # Gradle FROM gradle:5.4.1-jdk8 # Android SDK # ENV SDK_URL="https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip" \ ANDROID_HOME="/usr/local/android-sdk" \ ANDROID_VERSION=28 \ ANDROID_BUILD_TOOLS_VERSION=28.0.3 # , SDK , # RUN mkdir "$ANDROID_HOME" .android \ && cd "$ANDROID_HOME" \ && curl -o sdk.zip $SDK_URL \ && unzip sdk.zip \ && rm sdk.zip \ # # . . Android # # # && mkdir "$ANDROID_HOME/licenses" || true \ && echo "24333f8a63b6825ea9c5514f83c2829b004d1" > "$ANDROID_HOME/licenses/android-sdk-license" \ && echo "84831b9409646a918e30573bab4c9c91346d8" > "$ANDROID_HOME/licenses/android-sdk-preview-license" # SDK build-tools, platform-tools RUN $ANDROID_HOME/tools/bin/sdkmanager --update RUN $ANDROID_HOME/tools/bin/sdkmanager "build-tools;${ANDROID_BUILD_TOOLS_VERSION}" \ "platforms;android-${ANDROID_VERSION}" \ "platform-tools"
我们将其保存在Android项目的文件夹中,并使用以下命令开始容器的组装
docker build -t android-build:5.4-28-27 .
-t选项指定容器的标签或名称,通常由容器的名称和版本组成。 在我们的例子中,我们将其称为android-build,在版本中,我们指定了gradle,android-sdk和platform-tools的一组版本。 将来,使用此“版本”,我们将更容易按名称搜索所需的图像。
程序集通过后,我们可以在本地使用映像,我们可以使用
docker push命令将其上传到公共或私有映像存储库,以将其下载到其他计算机。
例如,我们在本地收集项目。 为此,请在项目文件夹中执行命令
docker run --rm -v "$PWD":/home/gradle/ -w /home/gradle android-build:5.4.1-28-27 gradle assembleDebug
让我们看看它的含义:
docker run-图像启动命令本身
-rm-表示在停止容器之后,它将在其使用过程中创建的所有内容都自动删除
-v“ $ PWD”:/ home / gradle / -将装有我们Android项目的当前文件夹装入容器的内部文件夹/ home / gradle /
-w / home / gradle-设置容器的工作目录
android-build:5.4.1-28-27-我们收集的容器的名称
gradle assembleDebug-实际上是构建我们的项目的构建团队
如果一切顺利,则在几秒钟/分钟后,您会在屏幕上看到
8m 3s的“ BUILD SUCCESSFUL” ! 并在文件夹app / build / output / apk中将组装该应用程序。
同样,您可以执行其他gradle任务-检查项目,运行测试等。 主要优点是,如果您需要在任何其他计算机上构建项目,则无需担心安装整个环境,这将足以下载所需的映像并在其中运行程序集。
容器不存储任何更改,每个程序集都从头开始,这一方面保证了程序集的身份,无论它在何处启动,另一方面,每次您必须下载所有依赖项并再次编译所有代码时,有时这可能会花费大量时间。 因此,除了通常的“冷”启动之外,我们还可以选择在保持所谓的状态下启动装配。 “缓存”,我们只需将〜/ .gradle文件夹复制到项目的工作文件夹中,即可保存该文件夹,然后在下一个构建的开始时将其返回。 我们将所有复制过程放在单独的脚本中,启动命令本身开始看起来像这样
docker run --rm -v "$PWD":/home/gradle/ -w /home/gradle android-build:5.4.1-28-27 /bin/bash -c "./pre.sh; gradle assembleDebug; ./post.sh"
结果,我们的平均项目组装时间减少了数倍(取决于对项目的依赖数量,但是平均项目因此在1分钟而不是5分钟内开始组装)。
仅当您拥有自己的内部CI / CD服务器时,所有这些本身才有意义。 但是,现在有许多云服务已经解决了所有这些问题,您不必为此担心,也可以在项目设置中指定必要的程序集属性。