构建Android编译环境(Ubuntu)
编译环境准备
在 Ubuntu Linux 中编译,需要安装以下工具包:
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
):
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 容器:
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 容器环境 ):
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-updates
和 jammy-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编译依赖:
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目录:
unzip platform-tools_r34.0.5-linux.zip -d ~
并添加路径到 ~/.profile
:
# 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)