Android13源码编译

记录wsl2 ubuntu2204 通过 docker 编译安卓13源码

下载源码

新建源码目录

mkdir ~/android13 && cd ~/android13

南方用户 先去中科大 按照aosp镜像使用帮助 下载底包

image-20231130161314364

wget -c https://mirrors.ustc.edu.cn/aosp-monthly/aosp-latest.tar

验证一下底包md5看看是否完整 比如当前下载的 a1366894d0ddfbf32db9a719929bdcd7 aosp-20231101.tar

md5sum aosp-latest.tar

解压源码

tar xvf aosp-latest.tar

配置git

sudo apt-get install git
git config --global user.email xxx@qq.com
git config --global user.name 'abc'

下载 repo 工具。

mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
## 如果上述 URL 不可访问,可以用下面的:
## curl -sSL  'https://gerrit-googlesource.proxy.ustclug.org/git-repo/+/master/repo?format=TEXT' |base64 -d > ~/bin/repo
chmod a+x ~/bin/repo
## 替换repo里的源为中科大的源,这样不用代理,下载源码
export REPO_URL = 'https://gerrit-googlesource.proxy.ustclug.org/git-repo'

初始化仓库某个特定的 Android 版本

repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-13.0.0_r16

## 开始下载源码
repo sync

同步时可能出现错误需要拉取仓库源码,不然无法合并

ls -al        ## 在源码目录中看到隐藏的.repo
cd .repo/repo ## 仓库目录
git pull      ## 拉取源码
cd ../../     ## 回到源码根目录
repo sync     ##再次同步

编译源码

在源码根目录下新建apt.conf文件(用于配置代理的服务器)

Acquire::https::proxy "http://172.28.176.1:7890";
Acquire::https::proxy "https://172.28.176.1:7890";

在源码根目录下新建sources.list文件(用于配置pip的源)

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

在源码根目录下新建Dockerfile文件(用于生成docker的环境)

FROM ubuntu:20.04

ARG userid
ARG groupid
ARG username

COPY apt.conf /etc/apt/apt.conf

COPY sources.list etc/apt/sources.list

ENV DEBIAN_FRONTEND noninteractive

RUN apt-get update \
    && echo "install package for building AOSP" \
    && apt-get install -y git-core gnupg flex bison build-essential zip curl zlib1g-dev \
        gcc-multilib g++-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev \
        libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig \
    && echo "install utils" \
    && apt-get install -y sudo rsync \
    && echo "install packages for build mesa3d or meson related" \
    && apt-get install -y python3-pip pkg-config python3-dev ninja-build \
    && mkdir -p ~/.pip \
    && echo "[global]" > ~/.pip/pip.conf \
    && echo "index-url = https://mirrors.aliyun.com/pypi/simple" >> ~/.pip/pip.conf \
    && pip3 install mako meson \
    && echo "packages for legacy mesa3d (< 22.0.0)" \
    && apt-get install -y python2 python-mako python-is-python2 python-enum34 gettext

RUN groupadd -g $groupid $username \
    && useradd -m -u $userid -g $groupid $username \
    && echo "$username ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers \
    && echo $username >/root/username \
    && echo "$username:$username" | chpasswd && adduser $username sudo

ENV HOME=/home/$username \
    USER=$username \
    PATH=/src/.repo/repo:/src/prebuilts/jdk/jdk8/linux-x86/bin/:$PATH

ENTRYPOINT chroot --userspec=$(cat /root/username):$(cat /root/username) / /bin/bash -i

创建编译的docker 镜像

docker build --build-arg userid=$(id -u) --build-arg groupid=$(id -g) --build-arg username=$(id -un) -t asop_build_android13 .

运行docker镜像

docker run -it --rm --hostname asop_build_android13 --name asop_build_android13 -v ~/android13:/src asop_build_android13

cd /src

source build/envsetup.sh ## 初始化编译环境

make clean ## 删除out目录下所有文件

lunch ## 选择设备内核和编译版本 lunch sdk_phone_x86_64-userdebug

m ##开始编译

在Window上运行

上面使用emulator命令是在Ubuntu中运行模拟器,会比较卡,画面也不停闪烁。建议在Windows系统中使用Android Studio创建的模拟器运行。

先打包Android镜像:

Android13以下使用命令:

make sdk sdk_repo

在Android13及以上使用命令:

make emu_img_zip

打包完成后会生成sdk-repo-linux-system-images为前缀的 AVD 映像 zip 文件,比如我的路径是: Aosp/out/target/product/emulator64_x86_64/sdk-repo-linux-system-images-eng.devnn.zip

将其就地解压或者拷贝到Window系统的某个文件夹下再解压。

笔者选择拷贝到D盘,解压后的位置是:D:\Downloads\sdk-repo-linux-system-images-eng.devnn

然后在Android Studio中创建一个模拟器,随便取个名字为 Pixel_5_WSL

在windows命令行中启动模拟器并加载刚才打包的Android系统:

emulator -avd Pixel_5_WSL -sysdir D:\Downloads\sdk-repo-linux-system-images-eng.devnn\x86_64 -dns-server 8.8.8.8,114.114.114.114 -verbose

## 需要先用android studio 创建一个名为 Pixel_5_WSL的模拟器,才可以启动成功
emulator -list-avds ## 查看创建的名字
##上面这个emulator命令是android sdk的tools目录下的。已将tools目录添到环境变量path中。

源码导入AndroidStudio中

mmm development/tools/idegen ## 执行会在 out/host/linux-x86/framework/目录下生成idegen.jar文件

development/tools/idegen/idegen.sh ## 源码根目录会生成android.iml和android.ipr两个工程配置文件

错误 ninja failed with: signal: killed

需要添加swapfile交换空间

检查当前的交换空间状态:运行以下命令查看当前交换空间的情况: sudo swapon –show

创建交换文件(如果没有交换空间):运行以下命令以创建一个交换文件(通常以 swapfile 命名): sudo fallocate -l /swapfile

其中 是您想要分配给交换空间的大小,例如 1G 表示 1 GB 的交换空间。

设置交换文件权限:运行以下命令以设置交换文件的权限: sudo chmod 600 /swapfile

格式化交换文件:运行以下命令以格式化交换文件: sudo mkswap /swapfile

启用交换空间:运行以下命令以启用交换空间: sudo swapon /swapfile

更新 /etc/fstab 文件:打开 /etc/fstab 文件并添加以下行以在启动时自动挂载交换空间: /swapfile none swap sw 0 0

验证交换空间:再次运行 sudo swapon –show 命令,确认交换空间已成功启用。