Docker容器Awesome Docker

Docker在Android中的应用

2019-07-27  本文已影响9人  wgyscsf

Docker在Android中的应用

测试环境基于xOS 10.14.5,2019/07/27

Docker 是什么?

Android为什么使用Docker

配置本地Docker环境

这里只是拿mac举例,其它支持Docker的系统都可以

  1. 下载安装Docker(可能会有点慢)
  2. 查看Docker版本:docker -v
image

基于Docker构建编译自己的项目

这里直接使用我创建的一个基于centos的镜像构建我们的项目,而不是上来讲如何创建镜像,会降低学习的难度。假设你已经配置好自己的Docker环境。按照下面步骤理论上不存在失败的情况...

  1. 在自己的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
    
  2. 在项目根目录执行:docker build -f Dockerfile -t gy/buildtemp:0.0.1 .

  3. 等待构建...

  4. 查看所有镜像:docker images

    image
  5. 这个时候你会发现自己项目的目录下不会出现任何变化,没有打包好的apk文件,也没有"sdk.dir=$ANDROID_HOME"写到local.properties文件中。这就是Docker的厉害之处:不会影响本项目任何代码;并且完全不依赖本地任何环境。它的原理是把本地代码copy一份到gy/buildtemp:0.0.1这个本地容器中,然后在你这个本地容器中进行构建,所有的处理都是基于这一份镜像文件进行操作的。

  6. 现在我们进度容器中查看我们编译好的代码:docker run -it gy/buildtemp:0.0.1

    image
  7. 注意:现在我们进入了基于centos的安卓编译环境,所有的操作都是基于这个环境的,换句话说,你现在在centos系统中。

  8. cd到我们配置的打包目录下看是否打包成功文件:


    image
  9. 可以看出已经打包成功

  10. 后续你想将打包好的文件上传分发等操作都可以基于此进行,非常方便...而最重要的是,不管是否是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

  1. 我们现在要基于centos:7.2.1511构建自己的Android编译环境

  2. 下载基于centos的jdk8(现在还要注册oracle账号,贼坑...):jdk-8u221-linux-x64.rpmhttps://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

  3. 下载基于centos的Android的Command line tools(需要科学上网):sdk-tools-linux-4333796.ziphttps://developer.android.com/studio/index.html#command-tools

  4. 为什么上述两步要下载安装包不是直接远程下载依赖?一是安装包太大并且jdk需要登录才能下载;需要科学上网太麻烦,直接下载好安装包方便使用。

  5. 创建一个文件夹,假设叫:docker_buildandroid文件夹,创建Dockerfile文件和file文件夹,将刚下载的jdk和commandline文件放到file文件夹内


    image
  6. 编写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
    
  7. 编译构建该docker文件:进入docker_buildandroid文件夹执行 docker build -t groupname/docker_buildandroid:0.0.1 .

  8. 等待会看到一些信息,说明构建成功


    image
  9. 在自己的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
    
  10. 在项目根目录执行:docker build -f Dockerfile -t gy/buildtemp:0.0.1 .

  11. 等待构建...

制作公共镜像

为什么要制作镜像?为了方便、复用,下次使用不用在经过漫长的编译过程,可以拉取下载直接使用。

  1. fork https://code.aliyun.com/414850132/docker_buildandroid
  2. 注册ali的镜像服务:https://cr.console.aliyun.com/cn-shanghai/instances/repositories
  3. 创建镜像仓库


    image
image
  1. 选择构建
    [图片上传失败...(image-421516-1564221251688)]
image
  1. 构建成功,可能会比较慢


    image
  1. 直接拉取整个地址就可以直接应用整个Android编译环境编译打包我们的应用


    image

总结

  1. 用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->基于此打包安卓应用
  2. Docker的设计有点类似于Java的继承,FROM AAA->构建出基于AAA的一个镜像BBB->FROM BBB->构建出基于BBB的CCC...
  3. 这样设计可以保证容器环境的干净和统一,特别对于后端系统的部署,不用再因为环境问题需要长时间部署导致各种问题。移动端使用可以方便运维人员在不用了解移动端知识的前提下编译打包移动端程序,更多的进行自动化构建工作。

参考

  1. https://www.docker.com/
  2. https://www.runoob.com/docker/macos-docker-install.html
  3. https://www.jianshu.com/p/eb9030989393
上一篇 下一篇

猜你喜欢

热点阅读