用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的部分去掉後進行構建便可。

相關文章
相關標籤/搜索