Docker在Android中的应用
Docker在Android中的应用
测试环境基于xOS 10.14.5,2019/07/27
Docker 是什么?
- https://www.docker.com/
- Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
- 可能这么说比较抽象,做Android开发的都知道Java有所谓的“一次编译到处运行”,正是依赖于跨平台的JVM虚拟机。在这里docker的身份相当于JVM虚拟机,为我们屏蔽不同平台的差异化,我们只用专心写业务代码--编写通用Dockerfile即可。
Android为什么使用Docker
- 作为Android开发,我们平时工作的流程可能是:编写代码->测试->打包->发布;
- 但是有一个问题就是只能是Android开发者去做这个事情,如果是运营或者运维想要直接编译我们的代码去发布,就比较难。
- 因为Android的环境其实还是相当麻烦的:java环境、Android环境(编译环境)、kotlin环境(基本现在标配)、gradle环境(可选,可直接远程下载)
- 其实上述环境配置还好,也就一个个去下载,中途各种可能遇到的问题,下来基本半天就过去了。最关键的是,每个人想要编译打包我们的代码都要走这个流程。要是因为系统环境不一致,可能又会有各种问题。
- Docker就是解决这些痛点的,一次配置,到处运行。一般全自动。是不是很熟悉?
配置本地Docker环境
这里只是拿mac举例,其它支持Docker的系统都可以
- 下载安装Docker(可能会有点慢)
brew cask install docker
- 或者直接下载安装:https://www.docker.com/
- 查看Docker版本:
docker -v
基于Docker构建编译自己的项目
这里直接使用我创建的一个基于centos的镜像构建我们的项目,而不是上来讲如何创建镜像,会降低学习的难度。假设你已经配置好自己的Docker环境。按照下面步骤理论上不存在失败的情况...
-
在自己的android项目根目录中创建文件
Dockerfile
,内容如下FROM registry.cn-shanghai.aliyuncs.com/wgyscsf/docker_buildandroid:0.0.1 MAINTAINER wgyscsf "414850132@qq.com" # 编译当前项目 ENV PROJECT /project RUN mkdir $PROJECT WORKDIR $PROJECT ADD . $PROJECT RUN chmod +x ./gradlew RUN echo "sdk.dir=$ANDROID_HOME" > local.properties ## 这里是你打包的程序,下面是美团https://github.com/Meituan-Dianping/walle打包命令 根据自己的需求进行修改 RUN ./gradlew clean assembleReleaseChannels
-
在项目根目录执行:
docker build -f Dockerfile -t gy/buildtemp:0.0.1 .
-
等待构建...
-
查看所有镜像:
imagedocker images
-
这个时候你会发现自己项目的目录下不会出现任何变化,没有打包好的apk文件,也没有
"sdk.dir=$ANDROID_HOME"
写到local.properties文件中。这就是Docker的厉害之处:不会影响本项目任何代码;并且完全不依赖本地任何环境。它的原理是把本地代码copy一份到gy/buildtemp:0.0.1
这个本地容器中,然后在你这个本地容器中进行构建,所有的处理都是基于这一份镜像文件进行操作的。 -
现在我们进度容器中查看我们编译好的代码:
imagedocker run -it gy/buildtemp:0.0.1
-
注意:现在我们进入了基于centos的安卓编译环境,所有的操作都是基于这个环境的,换句话说,你现在在centos系统中。
-
cd到我们配置的打包目录下看是否打包成功文件:
image -
可以看出已经打包成功
-
后续你想将打包好的文件上传分发等操作都可以基于此进行,非常方便...而最重要的是,不管是否是Android开发人员都可以构建我们的项目...
Docker的Android编译环境配置
下面讲解如何基于centos制作一个Android编译环境
步骤:1. 安装Docker->基于centos构建自己的Android编译环境->制作镜像并上传远程仓库->基于该镜像编译自己的Android项目打包->结束
配置如下环境:1.jdk8环境 2.Android编译环境 3. kotlin环境 4.git环境 5.其它常用命令:curl、wget、zip、unzip、tar、lsof、which
这里有一份我制作好的编译环境,你可以fork一份测试,不要用github,有文件大小限制,会有些问题:https://code.aliyun.com/414850132/docker_buildandroid
-
我们现在要基于
centos:7.2.1511
构建自己的Android编译环境 -
下载基于centos的jdk8(现在还要注册oracle账号,贼坑...):
jdk-8u221-linux-x64.rpm
https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html -
下载基于centos的Android的Command line tools(需要科学上网):
sdk-tools-linux-4333796.zip
https://developer.android.com/studio/index.html#command-tools -
为什么上述两步要下载安装包不是直接远程下载依赖?一是安装包太大并且jdk需要登录才能下载;需要科学上网太麻烦,直接下载好安装包方便使用。
-
创建一个文件夹,假设叫:docker_buildandroid文件夹,创建Dockerfile文件和file文件夹,将刚下载的jdk和commandline文件放到file文件夹内
image -
编写Dockerfile文件,注意kotlin环境,之前按照网上资料配置一直出现各种问题,注意
chmod a+x "$HOME/.sdkman/bin/sdkman-init.sh"
# 基于centos基础镜像 FROM centos:7.2.1511 # 安装常用命令 RUN yum install -y curl \ && yum install -y wget \ && yum install -y zip \ && yum install -y unzip \ && yum install -y tar \ && yum install -y lsof \ && yum install -y git \ && yum install -y which #设置工作目录 WORKDIR /home # 拷贝JDK安装包到容器中 COPY file/jdk-8u211-linux-x64.rpm /home # 安装JDK RUN rpm --rebuilddb && yum install -y jdk-8u211-linux-x64.rpm \ && java -version # 设置JAVA_HOME环境变量 ENV JAVA_HOME /usr/java/jdk1.8.0_211-amd64 # kotlin编译环境 RUN curl -s https://get.sdkman.io | bash RUN chmod a+x "$HOME/.sdkman/bin/sdkman-init.sh" RUN source "$HOME/.sdkman/bin/sdkman-init.sh" && sdk install kotlin # 拷贝android tools到容器中 COPY file/sdk-tools-linux-4333796.zip /home # 解压android tools RUN mkdir -p /opt/app/android-sdk RUN unzip -d /opt/app/android-sdk sdk-tools-linux-4333796.zip # 安装需要的platforms和build-tools版本 RUN yes | /opt/app/android-sdk/tools/bin/sdkmanager "platforms;android-28" RUN yes | /opt/app/android-sdk/tools/bin/sdkmanager "build-tools;28.0.3" # 设置JAVA_HOME环境变量 ENV ANDROID_HOME /opt/app/android-sdk
-
编译构建该docker文件:进入
docker_buildandroid
文件夹执行docker build -t groupname/docker_buildandroid:0.0.1 .
-
等待会看到一些信息,说明构建成功
image -
在自己的android项目根目录中创建文件
Dockerfile
,内容如下FROM groupname/docker_buildandroid:0.0.1 MAINTAINER wgyscsf "414850132@qq.com" # 编译当前项目 ENV PROJECT /project RUN mkdir $PROJECT WORKDIR $PROJECT ADD . $PROJECT RUN chmod +x ./gradlew RUN echo "sdk.dir=$ANDROID_HOME" > local.properties ## 这里是你打包的程序,下面是美团https://github.com/Meituan-Dianping/walle打包命令 根据自己的需求进行修改 RUN ./gradlew clean assembleReleaseChannels
-
在项目根目录执行:
docker build -f Dockerfile -t gy/buildtemp:0.0.1 .
-
等待构建...
制作公共镜像
为什么要制作镜像?为了方便、复用,下次使用不用在经过漫长的编译过程,可以拉取下载直接使用。
- fork https://code.aliyun.com/414850132/docker_buildandroid
- 注册ali的镜像服务:https://cr.console.aliyun.com/cn-shanghai/instances/repositories
-
创建镜像仓库
image
- 选择构建
[图片上传失败...(image-421516-1564221251688)]
-
构建成功,可能会比较慢
image
-
直接拉取整个地址就可以直接应用整个Android编译环境编译打包我们的应用
image
总结
- 用Docker编译打包我们的应用的流程:基于
FROM centos:7.2.1511
安装各种安卓编译相关的文件->构建该环境制作镜像docker build -t groupname/docker_buildandroid:0.0.1 .
->每次都构建麻烦,上传到远程库->公开的远程仓库FROM registry.cn-shanghai.aliyuncs.com/wgyscsf/docker_buildandroid:0.0.1
->基于此打包安卓应用 - Docker的设计有点类似于Java的继承,FROM AAA->构建出基于AAA的一个镜像BBB->FROM BBB->构建出基于BBB的CCC...
- 这样设计可以保证容器环境的干净和统一,特别对于后端系统的部署,不用再因为环境问题需要长时间部署导致各种问题。移动端使用可以方便运维人员在不用了解移动端知识的前提下编译打包移动端程序,更多的进行自动化构建工作。