更新 src/compile/sharebuild-aosp14.md
This commit is contained in:
@@ -1,66 +1,123 @@
|
|||||||
# 以AOSP14项目为例ShareBuild分布式编译详细配置方法
|
# 以AOSP14项目为例ShareBuild分布式编译详细配置方法
|
||||||
|
|
||||||
## ShareBuild的适用场景
|
## 编译环境准备
|
||||||
|
|
||||||
在同一局域网内工作的小型团队,ShareBuild以P2P共享架构将空闲算力贡献给团队其他成员,从而为每个团队成员提供编译加速效果。
|
### 安装 Sharebuild
|
||||||
|
|
||||||
## ShareBuild QuickStart
|
|
||||||
|
|
||||||
* 同一个局域网内的A、B、C等所有节点上安装ninja2:
|
|
||||||
|
|
||||||
|
* 参与编译的同一个局域网内的A、B、C等所有节点上安装ninja2和sharebuild:
|
||||||
```
|
```
|
||||||
wget -c https://raw.githubusercontent.com/ninja-cloudbuild/ninja2/refs/heads/main/install.sh && chmod +x install.sh && sudo ./install.sh
|
wget -c https://raw.githubusercontent.com/ninja-cloudbuild/ninja2/refs/heads/main/install.sh && chmod +x install.sh && sudo ./install.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
* 启用ShareBuild的前置要求
|
* 确保所有节点上均安装配置好了项目的编译环境,即所有节点上均能采用ninja成功单机编译项目。
|
||||||
|
|
||||||
1. 所有节点上均安装配置好了项目的编译环境,即所有节点上均能采用ninja成功单机编译项目。
|
### 安装AOSP项目编译环境
|
||||||
<!--
|
|
||||||
|
|
||||||
2. 选择任一节点上作为项目开发环境,项目中使用.devcontainer/devcontainer.json 配置了image镜像(示例如下),依次镜像创建的开发容器中能采用ninja成功单机编译项目。
|
* 参与编译的同一个局域网内的A、B、C等所有节点上安装编译环境依赖:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 安装核心开发工具和库
|
||||||
|
sudo apt-get install 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
|
||||||
|
|
||||||
|
# 安装Android 14所需的Java环境
|
||||||
|
sudo apt-get install openjdk-17-jdk
|
||||||
|
|
||||||
|
# 确保Python 3环境正确安装
|
||||||
|
sudo apt-get install python3 python3-pip
|
||||||
|
```
|
||||||
|
|
||||||
|
### 下载 AOSP 源码并执行单机编译
|
||||||
|
|
||||||
|
* 选择任一节点作为客户端节点,下载AOSP14源码:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mkdir ~/bin && curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo && chmod a+x ~/bin/repo
|
||||||
|
export PATH=~/bin:$PATH
|
||||||
|
|
||||||
|
repo init --depth=1 --partial-clone -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-14.0.0_r2
|
||||||
|
repo sync -j16
|
||||||
|
|
||||||
|
cd android-14.0.0_r2
|
||||||
|
source build/envsetup.sh # 初始化环境
|
||||||
|
lunch aosp_arm-eng # 选择目标配置
|
||||||
|
make # 执行单机编译,编译成功后可以看到:
|
||||||
|
|
||||||
```
|
```
|
||||||
{
|
|
||||||
"name": "DevContainer",
|
|
||||||
"image": "devstar.cn/devstar/DevContainer:latest" # 仅作示例,务必使用您已安装配置好项目编译环境的容器镜像!
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
> 注意:以上两种方式二选一即可,第2种方式省掉了在其他节点上安装配置项目编译环境,但是首次ShareBuild模式分布式编译时其他节点会自动下载项目编译环境的容器镜像。
|
[19:20:05.430], pending/wanted: 4, ready: 1, running: 0
|
||||||
-->
|
|
||||||
|
|
||||||
* 选择任一节点上作为项目开发环境,开启ShareBuild模式,然后进行分布式编译。
|
|
||||||
|
|
||||||
|
#### build completed successfully (02:26:51 (hh:mm:ss)) ####
|
||||||
|
|
||||||
|
|
||||||
|
real 146m51.385s
|
||||||
|
user 1327m35.812s
|
||||||
|
sys 78m2.153s
|
||||||
|
root@lab1:/home/lab1/android-14.0.0_r2#
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### 配置AOSP项目开启ShareBuild模式
|
||||||
|
|
||||||
|
* 将.sharebuild.yml 复制到 AOSP 根目录
|
||||||
|
```
|
||||||
|
cd android-14.0.0_r2
|
||||||
|
cp /etc/ninja2/aosp14/.sharebuild.yml ./
|
||||||
|
```
|
||||||
|
|
||||||
|
* 进入AOSP14项目根目录,替换 AOSP 内部 ninja 为 android_ninja
|
||||||
|
```
|
||||||
|
cp /usr/bin/android_ninja prebuilts/build-tools/linux-x86/bin/ninja
|
||||||
|
```
|
||||||
|
|
||||||
|
* 开启ShareBuild模式,然后进行分布式编译。
|
||||||
项目根目录下创建ninja2.conf 文件如下即可开启ShareBuild模式:
|
项目根目录下创建ninja2.conf 文件如下即可开启ShareBuild模式:
|
||||||
```
|
```
|
||||||
sharebuid:true
|
sharebuid:true
|
||||||
```
|
```
|
||||||
这时使用ninja编译将自动进入ShareBuild模式分布式编译项目。
|
|
||||||
|
|
||||||
> 如果直接使用ninja命令编译项目,也可以加上-s参数表示启用ShareBuild模式,示例如下:
|
* 在项目根目录下执行分布式编译
|
||||||
|
|
||||||
|
```bash
|
||||||
|
su # 切换到 root 关闭沙箱
|
||||||
|
source build/envsetup.sh # 初始化环境
|
||||||
|
lunch aosp_arm-eng # 选择目标配置
|
||||||
|
make # 执行分布式编译,编译成功后可以看到:
|
||||||
```
|
```
|
||||||
ninja -s -r `realpath ../` #启动分布式编译,注意-r 指定项目根目录
|
* 客户端节点:
|
||||||
ninja -t clean #清除编译产物
|
|
||||||
````
|
|
||||||
|
|
||||||
* 对一些特殊项目的补充说明
|
|
||||||
|
|
||||||
除以上常规的ShareBuild配置外,对于一些特殊项目需要做一些额外的配置,补充说明如下:
|
|
||||||
|
|
||||||
## 使用ShareBuild编译Android开源项目(AOSP)
|
|
||||||
|
|
||||||
除按照以上方法准备好编译环境和开启ShareBuild模式外,以AOSP14项目为例,还需要替换ninja和准备.sharebuild.yml来过滤掉一些无法远程编译的命令,具体操作如下:
|
|
||||||
|
|
||||||
```
|
```
|
||||||
cp /usr/bin/android_ninja prebuilts/build-tools/linux-x86/bin/ninja
|
[ShareBuild] Command will be executed REMOTELY
|
||||||
cp /etc/ninja2/aosp14/.sharebuild.yml ./
|
[ShareBuild] ----------------------------------------
|
||||||
|
[100% 130093/130093] Target vbmeta image: out/target/product/generic/vbmeta.img
|
||||||
|
stdout: , stderr:
|
||||||
|
|
||||||
|
[16:34:34.063], pending/wanted: 5, ready: 2, running: 0
|
||||||
|
|
||||||
|
|
||||||
|
#### build completed successfully (01:42:17 (hh:mm:ss)) ####
|
||||||
|
|
||||||
|
|
||||||
|
real 102m16.362s
|
||||||
|
user 1074m56.673s
|
||||||
|
sys 64m22.863s
|
||||||
|
root@lab1:/home/lab1/android-14.0.0_r2#
|
||||||
|
```
|
||||||
|
* 服务端节点sharebuild部分日志:
|
||||||
|
```
|
||||||
|
{"severity":"INFO","timestamp":"2025-11-24T16:34:38.988708686+08:00","caller":"service/sharebuild_proxy.go:448","message":"Successfully cl
|
||||||
|
eared environment on executor","component":"proxy","executor":"id:\"12D3KoowBsw2Lrs7FwKkmgrmRt3MYQgNzLa82vjK8tve8gQ95KTk\"ip:\"192.168.1.
|
||||||
|
12\" port:39077 "}
|
||||||
|
{"severity":"INFO","timestamp":"2025-11-24T16:34:38.99059505+08:00","caller":"runner/project_runner.go:463","message":"ProjectRunner free.
|
||||||
|
.. ","component":"runner", "ReceivedtaskCount":0,"PreemptedTaskCount":33291}
|
||||||
|
[worker-17]Stopping worker
|
||||||
|
[worker-24]Stopping worker
|
||||||
```
|
```
|
||||||
|
|
||||||
然后就可以单机编译一样使用make命令来分布式编译Android开源项目(AOSP)。
|
```
|
||||||
<!--
|
make clean # 清除编译目标文件
|
||||||
## 使用ShareBuild编译鸿蒙开源项目(OpenHarmony)
|
rm -r out # 清除编译产物
|
||||||
|
```
|
||||||
todo
|
|
||||||
-->
|
|
||||||
## 版权声明
|
## 版权声明
|
||||||
|
|
||||||
Copyright @ Mengning Software
|
Copyright @ Mengning Software
|
||||||
|
|||||||
Reference in New Issue
Block a user