在Mac平台使用Docker搭建AOSP(Android源代码)编译环境

本地环境:macOS 10.12.5
工作目录:~/android-docker/

一.准备大小写敏感的磁盘映像

  1. 创建磁盘映像
    首先,使用下面命令查看磁盘信息,

    diskutil info /

    如果磁盘信息的的 File System Personality 为 Case-sensitive Journaled HFS+,则说明当前文件系统是区分大小写的,不需要创建磁盘映像。否则执行命令:

    hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 100g ~/android-docker/android.dmg

    在当前目录下创建一个大小为100g的大小写敏感的磁盘映像。android官方文档推荐创建40g的磁盘映像,其实是不够用的,建议创建100g。如果创建完映像后,想改变映像大小,可以执行下面命令。

    hdiutil resize -size <new-size-you-want>g ~/android-docker/android.dmg.sparseimage
  2. 挂载磁盘映像
    执行

    hdiutil attach ~/android-docker/android.dmg.sparseimage -mountpoint ~/android-docker/android-fs

    将~/android-docker/android.dmg.sparseimage挂载到~/android-docker/android-fs。
    执行

    hdiutil detach ~/android-docker/android-fs

    卸载磁盘映像。
    为了方便操作,建议大家添加挂载和卸载的函数到bash中。在~/.bash_profile文件末尾添加如下代码:

    
    # mount the android file image  
    
    function mountAndroid { hdiutil attach ${1} -mountpoint ${2}; }  
    
    # unmount the android file image
    
    function umountAndroid() { hdiutil detach ${1}; }

    执行:

    source ~/.bash_profile

    使修改生效。现在就可以通过执行

    mountAndroid ~/android-docker/android.dmg.sparseimage ~/android-docker/android-fs/

    来挂载镜像;执行

    umountAndroid ~/android-docker/android-fs/

    来卸载映像了。

二.下载AOSP源码

  1. 下载repo工具:

    curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo
    chmod +x repo

    repo的运行过程中会尝试访问官方的git源更新自己,建议使用tuna的镜像源进行更新,将如下内容复制到你的~/.bash_profile里

    export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'
  2. 进入~/android-docker/android-fs/,创建一个工作目录,然后在工作目录下执行如下命令初始化仓库。

    repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android_4.4.4_r1

    我下的是4.4.4_r1版本。

三.搭建Docker环境

  1. 下载安装docker
    去docker官网下载并安装docker,这些都是傻瓜式的操作,就不多做介绍了。我下载安装的版本是:

    Version 17.03.1-ce-mac12 (17661)
    Channel: stable
    d1db12684b
  2. 构建docker image
    启动docker(鼠标双击图标),然后下载ubuntu 12.04(官方推荐Android 2.3.x (Gingerbread) - Android 5.x (Lollipop)使用这个版本编译)的image。

    docker pull ubuntu:12.04

    创建目录~/android-docker/aosp-build/,在该目录下创建一个名为Dockerfile的文件,内容如下:

    FROM ubuntu:12.04
    ADD sources.list /etc/apt/sources.list
    ENV DEBIAN_FRONTEND noninteractive
    RUN apt-get -qq update
    RUN apt-get install -y --no-install-recommends apt-utils
    RUN apt-get install -y build-essential g++-multilib
    RUN apt-get install -y file git gnupg flex bison gperf zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 libgl1-mesa-dev mingw32 tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386
    RUN ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
    RUN ln -s /usr/bin/gcc-4.6 /usr/bin/gcc
    RUN ln -s /usr/bin/g++-4.6 /usr/bin/g++
    RUN ln -s /usr/bin/cpp-4.6 /usr/bin/cpp
    RUN ln -s /usr/bin/gcov-4.6 /usr/bin/gcov
    
    WORKDIR /var/aosp

    然后新建文件~/android-docker/aosp-build/sources.list,也就是ubuntu的软件源配置文件,我用的是网易的镜像,内容如下:

    deb http://mirrors.163.com/ubuntu/ precise main restricted universe multiverse
    deb http://mirrors.163.com/ubuntu/ precise-security main restricted universe multiverse
    deb http://mirrors.163.com/ubuntu/ precise-updates main restricted universe multiverse
    deb http://mirrors.163.com/ubuntu/ precise-proposed main restricted universe multiverse
    deb http://mirrors.163.com/ubuntu/ precise-backports main restricted universe multiverse
    deb-src http://mirrors.163.com/ubuntu/ precise main restricted universe multiverse
    deb-src http://mirrors.163.com/ubuntu/ precise-security main restricted universe multiverse
    deb-src http://mirrors.163.com/ubuntu/ precise-updates main restricted universe multiverse
    deb-src http://mirrors.163.com/ubuntu/ precise-proposed main restricted universe multiverse
    deb-src http://mirrors.163.com/ubuntu/ precise-backports main restricted universe multiverse

    在~/android-docker/aosp-build/目录执行:

    docker build -t aosp-build .

    创建一个名字为aosp-build的image。创建完成后,执行:

    docker run -v ~/android-docker/android-fs:/var/aosp -i -t --name aosp aosp-build bash

    创建并启动了一个名为aosp的container,这个container运行了一个ubuntu 12.04的bash shell,并将本地的~/android-docker/android-fs目录和container aosp的/var/aosp目录共享。
    可以通过下面命令再次启动contianer aosp。

    docker start -i -a aosp
  3. 安装jdk6
    现在,coantianer aosp已经启动了一个ubuntu 12.04的bash shell,但这个环境还缺少jdk,下面去oracle官网下载编译android4.4.4需要的jdk-6u45-linux-x64.bin,将其下载到~/android-docker/android-fs。
    在ubuntu 12.04的bash shell(后面的命令都在这个shell下执行)执行下面命令为jdk-6u45-linux-x64.bin增加执行权限。

    chmod u+x /var/aosp/jdk-6u45-linux-x64.bin

    执行下面命令,将JDK6解压到/var/aosp/jdk1.6.0_45目录下。

    cd /var/aosp/
    ./jdk-6u33-linux-i586.bin

    复制jdk1.6.0_45到/usr/lib/jvm目录下。
    在系统配置文件/etc/bash/bash.rc添加如下内容。

    export JAVA_HOME=/usr/lib/jvm/jdk1.6.0_45
    export PATH=$PATH:/$JAVA_HOME/bin
    export CLASSPATH=.:$JAVA_HOME/lib
    export JRE_HOME=$JAVA_HOME/jre

    执行

    source /etc/bash/bash.rc

    使其生效。
    到这里,一个完整的aosp编译环境就搭建完成了。

四.总结

  1. 这样做的好处:
    • 跟本地编译相比,不会因为配置aosp的编译环境而破坏本地开发环境
    • 跟用虚拟机相比,docker更加轻量级,不用安装一个庞大的虚拟系统
  2. 坏处:
    • 编译速度很慢很慢,不知道是我Docker配置有问题,还是因为我的工作磁盘映像在移动硬盘,或者是我的mac太落伍了

你可能感兴趣的:(在Mac平台使用Docker搭建AOSP(Android源代码)编译环境)