构建Android编译环境(Ubuntu)

编译环境准备

Ubuntu Linux 中编译,需要安装以下工具包:

安装Ubuntu编译LineageOS需要的依赖软件包
sudo apt install bc bison build-essential ccache curl flex g++-multilib gcc-multilib git git-lfs gnupg gperf imagemagick \
                 lib32ncurses5-dev lib32readline-dev lib32z1-dev libelf-dev liblz4-tool libncurses5 libncurses5-dev \
                 libsdl1.2-dev libssl-dev libxml2 libxml2-utils lzop pngcrush rsync \
                 schedtool squashfs-tools xsltproc \
                 zip zlib1g-dev

镜像化

我在 构建Android编译环境(CentOS 8) 采用比较简单的类似 Fedora镜像(采用tini替代systemd) 方式,不过现在改进为 Ubuntu镜像(采用tini替代systemd) (独立卷)

arm64 Ubuntu容器中

我在 Ubuntu镜像(采用tini替代systemd) 基础上构建容器中执行安装依赖软件包报错( aarch64 ):

在ARM架构(aarch64)容器中安装Ubuntu编译LineageOS需要的依赖软件包报错
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Package gcc-multilib is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source

E: Unable to locate package g++-multilib
E: Package 'gcc-multilib' has no installation candidate
E: Unable to locate package lib32ncurses5-dev
E: Unable to locate package lib32readline-dev
E: Unable to locate package lib32z1-dev

参考 Hi, does anyone know why I can’t install the package gcc-multilib on Ubuntu 20.04? It is absolutly necessary for starting a Yocto project. Does anyone know how I can fix this? (see DockerFile in description) Thanks for the support! 原因是在 arm64 平台并不提供 gcc-multilib 软件包,如果需要使用,则应该构建一个 amd64 镜像

备注

我暂时放弃在ARM架构的Docker容器中编译构建Android的编译环境

x86 Ubuntu容器中

备注

这段容器实践是采用 systemd-nspawn 一个 debootstrap 系统,操作是在 zcloud ( HPE ProLiant DL360 Gen9服务器 )

执行 systemd-nspawn 启动 ubuntu-dev 容器(提供独立android和ccache目录)
systemd-nspawn -D  /var/lib/docker/ubuntu-dev \
    --bind=/zpool-data/android:/home/admin/android \
    --bind=/zpool-data/ccache:/home/admin/.ccache

实际上,在 x86 的容器环境中安装编译环境依赖包也是会报错的( systemd-nspawn 容器环境 ):

在X86架构容器( systemd-nspawn )中安装Ubuntu编译LineageOS需要的依赖软件包报错
Reading package lists... Done
Building dependency tree... Done
Note, selecting 'lib32ncurses-dev' instead of 'lib32ncurses5-dev'
Note, selecting 'lz4' instead of 'liblz4-tool'
Package imagemagick is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source

E: Unable to locate package ccache
E: Unable to locate package gperf
E: Package 'imagemagick' has no installation candidate
E: Unable to locate package libncurses5
E: Unable to locate package libsdl1.2-dev
E: Couldn't find any package by glob 'libsdl1.2-dev'
E: Unable to locate package pngcrush
E: Unable to locate package schedtool

后来参考 How to build LineageOS inside a container ,原来容器的apt配置中默认只启用了 main 仓库,要安装依赖软件包,需要修订配置添加 universe 仓库分支:

修订仓库配置文件,jammy-updatesjammy-security 仓库以及 universe 分支
deb http://archive.ubuntu.com/ubuntu jammy main universe
deb http://archive.ubuntu.com/ubuntu jammy-security main universe
deb http://archive.ubuntu.com/ubuntu jammy-updates main universe
  • 执行更新:

修改仓库配置后更新和升级
apt update
apt full-upgrade
  • 安装LineageOS编译依赖:

在容器中安装Ubuntu编译LineageOS需要的依赖软件包
apt install bc bison build-essential ccache curl flex g++-multilib gcc-multilib git gnupg gperf \
    imagemagick lib32ncurses5-dev lib32readline-dev lib32z1-dev liblz4-tool libncurses5 libncurses5-dev \
    libsdl1.2-dev libssl-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools \
    xsltproc zip zlib1g-dev python-is-python3
  • 添加一个普通用户账号,注意这里关闭了密码:

添加一个 admin 账号并切换到这个账号
adduser --disabled-password admin
chown -R admin:admin /home/admin

# 切换到admin账号
su - admin
  • 设置缓存 50G 并且在 admin 账号配置中启动 ccache :

启用 ccache
# 在admin账号身份下执行
ccache -M 50G
echo 'export USE_CCACHE=1' >> ~/.profile

下载安装 platform-tools

从Google下载 最新platform-tools 并解压缩到HOME目录:

将下载的 platform-tools 解压缩
unzip platform-tools_r34.0.5-linux.zip -d ~

并添加路径到 ~/.profile :

添加 platform-tools 工作路径
# add Android SDK platform tools to path
if [ -d "$HOME/platform-tools" ] ; then
    PATH="$HOME/platform-tools:$PATH"
fi

备注

在虚拟机(或容器)环境中不需要 platform-tools ,这个工具主要是为了同步镜像到手机设备,编译时不需要

Java

不同的LineageOS需要不同的JDK(Java Development Kit)版本:

  • LineageOS 18.1+: OpenJDK 11 (included in source download)

  • LineageOS 16.0-17.1: OpenJDK 1.9 (included in source download)

  • LineageOS 14.1-15.1: OpenJDK 1.8 (install openjdk-8-jdk)

对于编译现代最新版本的LineageOS可以不用单独安装OpenJDK,而是由源代码下载时自动完成安装

Python

不同的LineageOS需要不同的Python版本(已经在上文完成):

  • LineageOS 17.1+: Python 3 (install python-is-python3)

  • LineageOS 11.0-16.0: Python 2 (install python-is-python2)

至此,环境准备工作已经完成,可以 为Pixel 4编译LineageOS 20(Android 13)

参考