用Docker容器来生成quick-x/cocos2d-x游戏apk包

原文请戳这里:http://galoisplusplus.coding....php

前段时间本渣在作服务器端开发时,采用了Docker做为解决方案的一部分,最初的动机主要是想用namespace作环境隔离、用cgroups作资源限制,却也切身体会到Docker所带来的构建上的便利。故而本渣也回头去想以前cocos2d-x客户端的开发工做是否也能Docker化,很快就找到了一个很适合采用Docker的场景,那就是打apk包。从以前搭建cocos2d-x游戏开发环境的博文中不难发现,要搭建打包环境特别麻烦,不只须要下一堆软件包,并且安装Android SDK和NDK时还会遇到GFW的问题。也正是由于这个缘故,咱们团队只有最开始的三位老司机在开发机上搭好了这套环境,以后陆陆续续来的新人都没作过这项工做,因此平时打包也基本是在这几台开发机上。这简直太应该Docker化了!有了一套配好打包环境的Docker image,不再用担忧小鲜肉跑来要求打包、占用开发机了!并且还能够扔到服务器上去作,多省心啊!想一想就excited,因而本渣立刻就折腾起Dockerfile来了!java

首先要肯定基础镜像。本渣一开始觉得,配置Linux下的cocos2d-x打包环境须要在执行cocos2d-x代码里的build/install-deps-linux.sh,而这个脚本须要用到Debian系的包管理器,因此就选了Ubuntu做为基础镜像。python

配置apk打包环境天然少不了下载须要的软件包。Ubuntuapt-get install会询问用户是否安装软件包,在Dockerfile中须要把这一交互性去掉,最好采用:linux

RUN DEBIAN_FRONTEND=noninteractive apt-get install -y

有些人喜欢把DEBIAN_FRONTEND设成ENV,这样ENV下面的命令就不用重复打DEBIAN_FRONTEND=noninteractiveandroid

ENV DEBIAN_FRONTEND noninteractive
RUN apt-get install -y

但根据Deploying Python with Docker的说法,这种作法是不推荐的,由于这会影响到容器使用,最好仍是对每条须要的命令单独设置环境变量。nginx

安装的几个软件包中少不了Java,我用的是Oracle的而非openjdk,因此须要用add-apt-repository把Oracle的ppa加上,这又须要先安装add-apt-repositoryc++

# 更新软件包列表
RUN DEBIAN_FRONTEND=noninteractive apt-get update -qq

# 安装add-apt-repository
RUN DEBIAN_FRONTEND=noninteractive apt-get -y install python-software-properties software-properties-common

# 安装Oracle Java
RUN echo "debconf shared/accepted-oracle-license-v1-1 select true" | debconf-set-selections
RUN echo "debconf shared/accepted-oracle-license-v1-1 seen true" | debconf-set-selections
RUN DEBIAN_FRONTEND=noninteractive add-apt-repository ppa:webupd8team/java \
    && apt-get update -qq
RUN DEBIAN_FRONTEND=noninteractive apt-get -y oracle-java6-installer

打包还须要ant、以后下载SDK等须要wgetcurl,这些软件包能够写在这句apt-get -y后面,由于咱们不但愿Docker image有太多layer。git

接下来就是下载Android SDK和设置相应的环境变量了。Android SDK和NDK的google下载连接是被墙的,能够换成国内相关镜像的连接。本渣是先下好这些包,而后在咱们内网nginx起了一个简单的静态页面,咱们内部再经过这个页面去下载就灰常快了XDgithub

# Install Android SDK
ENV ANDROID_SDK_ROOT /opt/android-sdk-linux

RUN cd /opt && wget -q https://dl.google.com/android/android-sdk_r24.4.1-linux.tgz -O android-sdk.tgz \
    && tar -zxvf android-sdk.tgz \
    && rm -f android-sdk.tgz

ENV PATH ${PATH}:${ANDROID_SDK_ROOT}:${ANDROID_SDK_ROOT}/tools

RUN echo y | android update sdk --no-ui --all --filter platform-tools | grep 'package installed'
RUN echo y | android update sdk --no-ui --all --filter extra-android-support | grep 'package installed'
RUN echo y | android update sdk --no-ui --all --filter android-20 | grep 'package installed'
RUN echo y | android update sdk --no-ui --all --filter build-tools-20.0.0 | grep 'package installed'

若是你须要用代理来绕过GFW,能够这么写:web

# NOTE: google is blocked by GFW in China,
# So I use the proxy: http://android-mirror.bugly.qq.com:8080.
# You can remove `--proxy-host android-mirror.bugly.qq.com --proxy-port 8080 -s`
# in the following commands if you don't have to worry about this issue.
RUN echo y | android update sdk --no-ui --all --filter platform-tools --proxy-host android-mirror.bugly.qq.com --proxy-port 8080 -s | grep 'package installed'
RUN echo y | android update sdk --no-ui --all --filter extra-android-support --proxy-host android-mirror.bugly.qq.com --proxy-port 8080 -s | grep 'package installed'
RUN echo y | android update sdk --no-ui --all --filter android-20 --proxy-host android-mirror.bugly.qq.com --proxy-port 8080 -s | grep 'package installed'
RUN echo y | android update sdk --no-ui --all --filter build-tools-20.0.0 --proxy-host android-mirror.bugly.qq.com --proxy-port 8080 -s | grep 'package installed'

接下来就是安装Android NDK了,和SDK差很少。

# Install Android NDK
ENV ANDROID_NDK_ROOT /opt/android-ndk-r10e
ENV NDK_ROOT /opt/android-ndk-r10e

RUN cd /opt && wget -q http://dl.google.com/android/repository/android-ndk-r10e-linux-x86_64.zip -O android-ndk.zip \
    && unzip -q android-ndk.zip \
    && rm -f android-ndk.zip

ENV PATH ${PATH}:${ANDROID_NDK_ROOT}

最后别忘了清理安装的软件包:

RUN apt-get clean

到了这一步,本渣就能够先把Docker image构建起来,把cocos2d-x代码、quick-x代码和客户端代码做为host的三个volumn挂载到Docker container里了。经试验发现还须要作以下配置:

  • PATH里加入cocos2d-console/bin的目录才能使用cocos命令。
  • cocos2d-console须要安装python
  • 须要把quick-x代码所在目录配在QUICK_V3_ROOT环境变量中。
  • quick-x用到php,须要安装。
  • 须要装上32位系统的软件包lib32stdc++6lib32z1才能正常打包。

因而本渣就能够相应地在Dockerfile中继续添加了,虽然试验的过程有点繁琐,但能够保证生成的Docker image只包含须要的软件包,让image尽量小。

接下来就是如何继续优化了,例如以上须要从host挂载cocos2d-x代码和quick-x代码的volumn仍是比较烦。其中咱们彻底不必把整份cocos2d-x代码挂载进来,由于建立cocos2d-x项目时会把须要的源代码文件拷到项目目录里,因此咱们只须要其中的cocos2d-console,配置好cocos所在的目录到环境变量PATH便可。最后我把cocos2d-consolequick-x的代码打包,放到以前的内网网页中,这样就有了一份只须要挂载项目代码目录就能进行apk打包的Dockerfile啦!

还记得前面所提到的cocos2d-x代码里的build/install-deps-linux.sh脚本吗?其实这个脚本仍是有交互,因此我也把它所实现的功能挪到了Dockerfile中,其实也不外乎用apt-get下载一些软件包和下载glfw编译安装罢了。既然这个脚本并不是必须,那么基础镜像也就不必定非要Debian系的系统了,小巧的Alpine无疑才是更理想的基础镜像。不过,目前咱们主要是内网开发用,尚未压缩Docker image体积的需求,本渣也就不打算从新用Alpine折腾一遍了XD

Update:

我把一份通用的Dockerfile放到了Github上,你也能够在Docker Hub拉取对应的Docker镜像:

docker pull galoisplusplus/quick-x-apk-docker

这一Docker镜像对不采用quick-x的cocos2d-x游戏打包也是能够用的,只须要把Dockerfile中quick-x的部分去掉后进行构建便可。

相关文章
相关标签/搜索