Android SISO 分布式编译集群配置方案

目录

  1. [1. 架构概述](#1. 架构概述)
  2. [2. 集群设备环境部署](#2. 集群设备环境部署)
  3. [3. 客户端使用方案](#3. 客户端使用方案)
  4. [4. 运维与监控](#4. 运维与监控)
  5. [5. 故障排查](#5. 故障排查)
  6. [6. 附录](#6. 附录)

1. 架构概述

1.1 整体架构

复制代码
flowchart TD
subgraph Client["开发者客户端"]
A1["Android Studio"]
A2["depot_tools"]
A3["Siso 构建工具"]
A4["GN 生成器"]
A5[".sisoenv 配置<br />RBE 连接参数"]
A1 --> A5
A2 --> A5
A3 --> A5
A4 --> A5
end

A5 -->|"gRPC / HTTPS"| S

subgraph Scheduler["RBE 集群调度层 (Scheduler)"]
S["EngFlow / BuildBuddy /<br />Bazel Remote / 自建集群"]
end

S --> W

subgraph Workers["执行节点池 (Worker Pool)"]
W1["Worker 1<br />编译器 + 缓存"]
W2["Worker 2<br />编译器 + 缓存"]
W3["Worker 3<br />编译器 + 缓存"]
WN["Worker N<br />编译器 + 缓存"]
end

W1 --> C
W2 --> C
W3 --> C
WN --> C

subgraph Cache["远程缓存层 (CAS + AC)"]
C1["CAS 内容寻址存储<br />S3 / MinIO / NAS"]
C2["AC 动作缓存<br />Redis / 内存"]
end

1.2 组件说明

|-----------------------------------------|-----------|-------------------------------------|
| 组件 | 作用 | 推荐方案 |
| Scheduler(调度节点) | 任务调度、负载均衡 | EngFlow / BuildBuddy / Bazel Remote |
| Worker(执行节点) | 实际执行编译任务 | 高性能 Linux 服务器 |
| CAS(Content-Addressable Storage,内容寻址存储) | 缓存编译产物 | S3 / MinIO / 本地 NAS |
| AC(Action Cache,动作缓存) | 缓存编译命令结果 | Redis / 内存缓存 |
| Siso | 客户端构建工具 | depot_tools 内置 |

组件之间的调用关系如下:

复制代码
flowchart LR
Siso["Siso 客户端"] -->|"提交编译动作"| Sched["Scheduler"]
Sched -->|"分发任务"| Worker["Worker 节点"]
Worker -->|"查询/写入"| AC["Action Cache (Redis)"]
Worker -->|"查询/写入"| CAS["CAS (MinIO / S3)"]
Siso -->|"读取缓存"| AC
Siso -->|"读取缓存"| CAS

2. 集群设备环境部署

2.1 硬件要求

Scheduler(调度节点)

|---------|------------|-----------------|
| 配置项 | 最低要求 | 推荐配置 |
| CPU | 8 核 | 16 核+ |
| 内存 | 16 GB | 32 GB+ |
| 磁盘 | 100 GB SSD | 500 GB NVMe SSD |
| 网络 | 千兆网卡 | 万兆网卡 |
| 数量 | 1 | 2(主备) |

Worker(执行节点)

|---------|------------|------------------------------|
| 配置项 | 最低要求 | 推荐配置 |
| CPU | 16 核 | 32 核+(AMD EPYC / Intel Xeon) |
| 内存 | 32 GB | 64 GB+ |
| 磁盘 | 200 GB SSD | 1 TB NVMe SSD |
| 网络 | 千兆网卡 | 万兆网卡 |
| 数量 | 4 | 8+ |

注意:Worker(执行节点)需要与客户端代码库版本一致的工具链(clang、ndk、sdk)。

缓存节点(Cache)

|---------|----------|-----------------------|
| 配置项 | 最低要求 | 推荐配置 |
| CPU | 4 核 | 8 核 |
| 内存 | 16 GB | 64 GB+ |
| 磁盘 | 1 TB SSD | 4 TB+ NVMe SSD / 对象存储 |
| 网络 | 千兆网卡 | 万兆网卡 |
| 数量 | 1 | 2(高可用) |

2.2 软件环境

操作系统(所有节点)
复制代码
# 推荐 Ubuntu 22.04 LTS
sudo apt update && sudo apt upgrade -y

# 基础依赖
sudo apt install -y \
    build-essential \
    git \
    curl \
    wget \
    python3 \
    python3-pip \
    openjdk-17-jdk \
    docker.io \
    docker-compose

三种部署方案的选型对比如下:

复制代码
flowchart TD
Start["选择 RBE 部署方案"] --> Q1{"是否需要<br />企业级支持?"}
Q1 -->|"是"| P1["方案一:EngFlow<br />商业方案,功能完整"]
Q1 -->|"否"| Q2{"是否希望<br />开源自建?"}
Q2 -->|"是"| P2["方案二:BuildBuddy<br />开源,Docker Compose 部署"]
Q2 -->|"否"| P3["方案三:Bazel Remote + Siso<br />轻量级,适合小团队/测试"]

2.2.1 方案一:EngFlow 集群部署

EngFlow 是商业 RBE 解决方案,提供企业级支持。

步骤一:部署 Scheduler
下载 EngFlow 部署包
复制代码
wget https://releases.engflow.com/engflow-scheduler-latest.tar.gz
tar -xzf engflow-scheduler-latest.tar.gz
cd engflow-scheduler
配置 scheduler
复制代码
sudo tee /etc/engflow/scheduler.yaml << 'EOF'
server:
  port: 8080
  tls:
    cert_file: /etc/engflow/server.crt
    key_file: /etc/engflow/server.key

backend:
  type: kubernetes  # 或 docker, local
  kubernetes:
    namespace: engflow
    worker_image: engflow/worker:latest
    worker_count: 8
    worker_cpu: 32
    worker_memory: 64Gi

cache:
  cas:
    type: s3
    s3:
      bucket: engflow-cas
      region: us-east-1
      endpoint: s3.example.com
  ac:
    type: redis
    redis:
      address: redis.example.com:6379
      password: ${REDIS_PASSWORD}

auth:
  type: google_oidc
  google_oidc:
    client_id: ${GOOGLE_CLIENT_ID}
    client_secret: ${GOOGLE_CLIENT_SECRET}
EOF
启动 scheduler
复制代码
sudo systemctl enable engflow-scheduler
sudo systemctl start engflow-scheduler
步骤二:部署 Worker
使用 Docker 部署 Worker
复制代码
cat > docker-compose.worker.yml << 'EOF'
version: '3.8'
services:
  worker:
    image: engflow/worker:latest
    restart: always
    environment:
      - SCHEDULER_ADDRESS=scheduler.example.com:8080
      - WORKER_NAME=worker-${HOSTNAME}
      - WORKER_CPU=32
      - WORKER_MEMORY=64
    volumes:
      - /var/cache/engflow:/cache
      - /opt/android-toolchain:/toolchain:ro
    deploy:
      resources:
        limits:
          cpus: '32'
          memory: 64G
EOF

sudo docker-compose -f docker-compose.worker.yml up -d
步骤三:部署缓存
Redis (Action Cache)
复制代码
sudo apt install -y redis-server
sudo tee /etc/redis/redis.conf << 'EOF'
bind 0.0.0.0
port 6379
maxmemory 32gb
maxmemory-policy allkeys-lru
requirepass ${REDIS_PASSWORD}
EOF
sudo systemctl restart redis-server
MinIO (CAS - 对象存储)
复制代码
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
sudo mv minio /usr/local/bin/
创建 MinIO 服务
复制代码
sudo tee /etc/systemd/system/minio.service << 'EOF'
[Unit]
Description=MinIO Object Storage
After=network.target

[Service]
Type=simple
User=minio
Group=minio
Environment="MINIO_ROOT_USER=${MINIO_ACCESS_KEY}"
Environment="MINIO_ROOT_PASSWORD=${MINIO_SECRET_KEY}"
ExecStart=/usr/local/bin/minio server /data/minio --console-address :9001
Restart=always

[Install]
WantedBy=multi-user.target
EOF

sudo useradd -r -s /bin/false minio
sudo mkdir -p /data/minio
sudo chown -R minio:minio /data/minio
sudo systemctl enable minio
sudo systemctl start minio

2.2.2 方案二:BuildBuddy 开源部署

BuildBuddy 提供开源版本,适合自建集群。

使用 Docker Compose 部署完整集群
复制代码
cat > docker-compose.buildbuddy.yml << 'EOF'
version: '3.8'
services:
  buildbuddy:
    image: buildbuddy/buildbuddy-app:latest
    restart: always
    ports:
      - "1985:1985"
      - "8080:8080"
    environment:
      - BUILD_BUDDY_CONFIG=/config/buildbuddy.yaml
    volumes:
      - ./buildbuddy.yaml:/config/buildbuddy.yaml:ro
      - buildbuddy-data:/data

  worker:
    image: buildbuddy/buildbuddy-executor:latest
    restart: always
    privileged: true
    environment:
      - BUILD_BUDDY_EXECUTOR_CONFIG=/config/executor.yaml
    volumes:
      - ./executor.yaml:/config/executor.yaml:ro
      - /var/run/docker.sock:/var/run/docker.sock
    deploy:
      replicas: 8
      resources:
        limits:
          cpus: '32'
          memory: 64G

  redis:
    image: redis:7-alpine
    restart: always
    command: redis-server --maxmemory 32gb --maxmemory-policy allkeys-lru
    volumes:
      - redis-data:/data

  minio:
    image: minio/minio:latest
    restart: always
    command: server /data --console-address :9001
    environment:
      - MINIO_ROOT_USER=${MINIO_ACCESS_KEY}
      - MINIO_ROOT_PASSWORD=${MINIO_SECRET_KEY}
    volumes:
      - minio-data:/data
    ports:
      - "9000:9000"
      - "9001:9001"

volumes:
  buildbuddy-data:
  redis-data:
  minio-data:
EOF
BuildBuddy 配置文件
复制代码
sudo tee buildbuddy.yaml << 'EOF'
storage:
  disk:
    root_directory: /data/storage
  gcs:
    bucket: buildbuddy-cas
    project_id: my-project
    credentials_file: /config/gcs-credentials.json

cache:
  redis_target: redis:6379
  max_size_bytes: 100000000000 # 100GB

executor:
  enable_firecracker: false
  docker_socket: /var/run/docker.sock
  docker_net_host: true
  default_isolation_type: "docker"

auth:
  oauth_providers:
    - issuer_url: "https://accounts.google.com"
      client_id: "${GOOGLE_CLIENT_ID}"
      client_secret: "${GOOGLE_CLIENT_SECRET}"
EOF

sudo docker-compose -f docker-compose.buildbuddy.yml up -d

2.2.3 方案三:Bazel Remote + Siso(轻量级)

适合小型团队或测试环境。

部署 bazel-remote 缓存服务器
复制代码
sudo docker run -d \
    --name bazel-remote \
    -v /data/bazel-remote:/data \
    -p 9092:9092 \
    buchgr/bazel-remote-cache \
    --dir=/data \
    --max_size_gb=500 \
    --grpc_port=9092
部署本地 Worker(使用 Siso 内置 Worker 模式)

注意:Siso 本身不直接提供 Worker,需要配合 Bazel-buildfarm 或自定义 Worker。

2.3 Worker 节点工具链配置

Worker 必须包含与客户端一致的 Android 编译工具链。

复制代码
# 在 Worker 节点上安装 Android 工具链
sudo mkdir -p /opt/android-toolchain
cd /opt/android-toolchain

# 下载 Android NDK
wget https://dl.google.com/android/repository/android-ndk-r27c-linux.zip
unzip android-ndk-r27c-linux.zip

# 下载 Android SDK Command Line Tools
wget https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip
mkdir -p cmdline-tools/latest
unzip commandlinetools-linux-11076708_latest.zip -d cmdline-tools/latest
mv cmdline-tools/latest/cmdline-tools/* cmdline-tools/latest/

# 安装 SDK 组件
export ANDROID_HOME=/opt/android-toolchain
yes | cmdline-tools/latest/bin/sdkmanager --licenses
cmdline-tools/latest/bin/sdkmanager \
    "platforms;android-35" \
    "build-tools;35.0.0" \
    "platform-tools"

# 下载 Chromium depot_tools(包含 Siso 和编译脚本)
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
export PATH="/opt/android-toolchain/depot_tools:$PATH"

# 确保 Worker 节点可以访问这些工具链
sudo chown -R 1000:1000 /opt/android-toolchain

2.4 网络与安全配置

复制代码
# 防火墙规则 (Scheduler 节点)
sudo ufw allow 8080/tcp # EngFlow / BuildBuddy HTTP
sudo ufw allow 9092/tcp # gRPC (bazel-remote)
sudo ufw allow 443/tcp # HTTPS
sudo ufw allow 6379/tcp # Redis (仅限内网)
sudo ufw allow 9000/tcp # MinIO S3 API
sudo ufw allow 9001/tcp # MinIO Console

# 配置 TLS (使用 Let's Encrypt 或自签名证书)
sudo apt install -y certbot
sudo certbot certonly --standalone -d scheduler.example.com
配置 Nginx 反向代理(可选)
复制代码
sudo tee /etc/nginx/sites-available/rbe << 'EOF'
server {
    listen 443 ssl http2;
    server_name scheduler.example.com;

    ssl_certificate /etc/letsencrypt/live/scheduler.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/scheduler.example.com/privkey.pem;

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 300s;
        proxy_send_timeout 300s;
    }

    # gRPC 支持
    location /google.devtools.remoteexecution.v2.RemoteExecution {
        grpc_pass grpc://localhost:8080;
    }
}
EOF

sudo ln -s /etc/nginx/sites-available/rbe /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl restart nginx

3. 客户端使用方案

3.1 客户端环境准备

系统要求

|---------|--------------------------------------|------------------|
| 配置项 | 最低要求 | 推荐配置 |
| OS | Ubuntu 20.04 / macOS 12 / Windows 10 | Ubuntu 22.04 LTS |
| CPU | 8 核 | 16 核+ |
| 内存 | 16 GB | 32 GB+ |
| 磁盘 | 100 GB SSD | 500 GB NVMe SSD |
| 网络 | 稳定互联网 | 企业专线 (低延迟) |

安装依赖
复制代码
# Ubuntu / Debian
sudo apt update
sudo apt install -y \
    git \
    python3 \
    python3-pip \
    curl \
    wget \
    openjdk-17-jdk \
    lsb-release \
    sudo

# 安装 depot_tools(包含 Siso)
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git ~/depot_tools
export PATH="$HOME/depot_tools:$PATH"

# 验证 Siso 安装
which siso
siso --version

3.2 项目配置

3.2.1 AOSP 项目配置
复制代码
# 下载 AOSP 源码
mkdir -p ~/aosp && cd ~/aosp
repo init -u https://android.googlesource.com/platform/manifest -b main
repo sync -c -j8

# 配置编译环境
source build/envsetup.sh
lunch aosp_arm64-eng

# 创建 Siso 配置文件
mkdir -p ~/.config/siso
tee ~/.config/siso/config.json << 'EOF'
{
  "remote_execution": {
    "enabled": true,
    "server_address": "scheduler.example.com:443",
    "instance_name": "aosp",
    "credentials_helper": "siso-credential-helper.sh",
    "tls_enabled": true,
    "timeout_seconds": 300
  },
  "cache": {
    "enabled": true,
    "read_only": false,
    "max_cache_size_gb": 50
  },
  "local_execution": {
    "fallback_enabled": true,
    "max_local_jobs": 8
  }
}
EOF

# 配置认证 (以 Google OIDC 为例)
tee ~/bin/siso-credential-helper.sh << 'EOF'
#!/bin/bash
# 从 gcloud 获取访问令牌
gcloud auth print-access-token
EOF
chmod +x ~/bin/siso-credential-helper.sh

# 或者使用 API Key 方式
tee ~/.config/siso/api_key << 'EOF'
your-api-key-here
EOF
3.2.2 Chromium for Android 配置
复制代码
# 下载 Chromium 源码
mkdir -p ~/chromium && cd ~/chromium
fetch --nohooks android

# 安装依赖
cd src
./build/install-build-deps-android.sh
gclient runhooks

# 配置 GN 参数
mkdir -p out/Default
tee out/Default/args.gn << 'EOF'
# 目标平台
target_os = "android"
target_cpu = "arm64"

# 启用远程执行
use_remoteexec = true

# 禁用组件构建 (推荐用于远程编译)
is_component_build = false

# 其他编译选项
is_debug = false
symbol_level = 1
android_static_analysis = false
EOF

# 生成 Ninja 文件
gn gen out/Default

# 配置 .sisoenv (Siso 环境变量)
tee .sisoenv << 'EOF'
# RBE 集群配置
RBE_server_address=scheduler.example.com:443
RBE_instance=default

# 认证方式
RBE_credentials_helper=siso-credential-helper.sh

# 工具链路径 (Worker 节点需一致)
RBE_toolchain_path=/opt/android-toolchain

# 超时设置
RBE_rpc_timeout=300s
RBE_exec_timeout=600s

# 日志级别
SISO_LOG_LEVEL=info
EOF

3.3 编译执行

基础编译命令
复制代码
# 标准编译 (自动使用远程集群)
siso ninja -C out/Default

# 指定并发数
siso ninja -C out/Default -j 200

# 强制严格远程模式 (不回退本地)
siso ninja -C out/Default --strict_remote=true

# 仅使用远程缓存 (不执行远程编译)
siso ninja -C out/Default --remote_cache_only

# 本地编译 (不使用远程)
siso ninja -C out/Default --local

# 详细日志输出
siso ninja -C out/Default -v
增量编译
复制代码
# 修改代码后重新编译
siso ninja -C out/Default chrome_public_apk

# 清理后重新编译
siso ninja -C out/Default -t clean
siso ninja -C out/Default
多目标编译
复制代码
# 同时编译多个目标
siso ninja -C out/Default \
    chrome_public_apk \
    system_webview_apk \
    monochrome_public_apk

3.4 高级配置

3.4.1 自定义 Starlark 规则

创建 build/config/siso/main.star 以自定义远程执行行为:

复制代码
load("@builtin//encoding.star", "json")
load("@builtin//struct.star", "module")

def init(ctx):
    step_config = {
        "rules": [
            {
                "name": "clang_compile",
                "action": "CXX_COMPILER.|C_COMPILER.",
                "remote_command": "clang++",
                "remote": True,
                "input_root_absolute_path": True,
                "use_system_input": True,
                "timeout": "300s",
            },
            {
                "name": "java_compile",
                "action": "JAVA_COMPILE.",
                "remote_command": "javac",
                "remote": True,
                "timeout": "120s",
            },
            {
                "name": "link",
                "action": "LINK.",
                "remote_command": "ld.lld",
                "remote": True,
                "timeout": "600s",
                "pool": "link_pool", # 限制并发链接任务
            },
            {
                "name": "local_only",
                "action": "LOCAL_.*|SIGN_.*|PACK.*",
                "remote": False,
                "local": True,
            },
        ],
        "pools": {
            "link_pool": {
                "depth": 4, # 同时最多 4 个链接任务
            }
        }
    }

    return module(
        "config",
        step_config = json.encode(step_config),
        filegroups = {},
        handlers = {},
    )
3.4.2 配置文件分层管理
复制代码
~/.config/siso/
├── config.json          # 全局默认配置
├── profiles/
│   ├── aosp.json        # AOSP 项目配置
│   ├── chromium.json    # Chromium 配置
│   └── internal.json    # 内网集群配置
└── credentials/
    ├── google_oidc.json # Google 认证
    ├── api_key.json     # API Key
    └── cert/
        ├── client.crt   # 客户端证书
        └── client.key   # 客户端密钥

切换配置 profile:

复制代码
# 使用指定 profile
siso ninja -C out/Default --profile=chromium

# 或设置环境变量
export SISO_PROFILE=chromium
siso ninja -C out/Default

3.5 不同场景配置示例

场景 1:企业内网集群
复制代码
# .sisoenv
RBE_server_address=192.168.1.100:8080
RBE_instance=android
RBE_tls_enabled=false # 内网可关闭 TLS
RBE_credentials_helper=none
场景 2:云服务商集群 (AWS/GCP/Azure)
复制代码
# .sisoenv
RBE_server_address=rbe.example.com:443
RBE_instance=android-prod
RBE_tls_enabled=true
RBE_credentials_helper=gcloud-auth

# 设置区域 (减少延迟)
RBE_region=asia-east1
场景 3:混合模式 (本地 + 远程)
复制代码
# .sisoenv
RBE_server_address=scheduler.example.com:443
RBE_instance=default

# 本地优先小任务,远程执行大任务
RBE_local_fallback=true
RBE_local_job_limit=16
RBE_remote_job_limit=200

4. 运维与监控

4.1 集群监控

Prometheus + Grafana 监控栈。客户端从配置到编译的完整流程如下:

复制代码
flowchart TD
A["安装 depot_tools<br />并配置 PATH"] --> B["同步源码<br />repo sync / fetch"]
B --> C["配置 GN 参数<br />args.gn"]
C --> D["gn gen 生成 Ninja 文件"]
D --> E["编写 .sisoenv<br />RBE 连接与认证"]
E --> F["执行 siso ninja -C out/Default"]
F --> G{"远程执行成功?"}
G -->|"是"| H["命中缓存 / 远程编译<br />返回产物"]
G -->|"否"| I["按配置回退本地编译"]
H --> J["输出 APK / 目标产物"]
I --> J

# docker-compose.monitoring.yml
version: '3.8'
services:
  prometheus:
    image: prom/prometheus:latest
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
      - prometheus-data:/prometheus
    ports:
      - "9090:9090"

  grafana:
    image: grafana/grafana:latest
    volumes:
      - grafana-data:/var/lib/grafana
      - ./grafana-dashboards:/etc/grafana/provisioning/dashboards:ro
    ports:
      - "3000:3000"

  node-exporter:
    image: prom/node-exporter:latest
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
    ports:
      - "9100:9100"

volumes:
  prometheus-data:
  grafana-data:

关键监控指标:

|---------------------|-------------|----------|
| 指标 | 说明 | 告警阈值 |
| rbe_queue_length | 等待执行的任务数 | > 100 |
| rbe_worker_active | 活跃 Worker 数 | < 4 |
| rbe_cache_hit_ratio | 缓存命中率 | < 70% |
| rbe_exec_duration | 平均执行时间 | 300s |
| rbe_error_rate | 执行错误率 | 5% |

4.2 日志管理

复制代码
# 集中日志收集 (Fluentd / Filebeat)

# Scheduler 日志
sudo journalctl -u engflow-scheduler -f

# Worker 日志
sudo docker logs -f worker

# Siso 客户端日志
export SISO_LOG_LEVEL=debug
siso ninja -C out/Default 2>&1 | tee siso-build.log

4.3 缓存管理

复制代码
# 查看缓存统计
# MinIO
mc alias set local http://minio.example.com:9000 ${ACCESS_KEY} ${SECRET_KEY}
mc du local/engflow-cas --recursive

# 清理过期缓存 (保留最近 30 天)
mc rm --recursive --force --older-than 30d local/engflow-cas/

# Redis 缓存清理
redis-cli -h redis.example.com -a ${PASSWORD} --eval purge-old-keys.lua

4.4 扩容与缩容

复制代码
# Kubernetes 自动扩缩容 (HPA)
kubectl autoscale deployment worker \
    --cpu-percent=70 \
    --min=4 \
    --max=32

# 手动扩容 Worker
sudo docker-compose -f docker-compose.worker.yml up -d --scale worker=16

5. 故障排查

5.1 常见问题速查表

|--------|------------------|----------------------------------|
| 症状 | 可能原因 | 解决方案 |
| 连接超时 | 网络延迟 / 防火墙 | 检查端口连通性,调整 RBE_rpc_timeout |
| 认证失败 | Token 过期 / 权限不足 | 重新运行 gcloud auth login,检查 IAM 权限 |
| 缓存未命中 | 工具链版本不一致 | 确保 Worker 与客户端工具链完全一致 |
| 编译错误 | 环境差异 | 检查 Worker 的 PATH 和依赖库版本 |
| 任务排队 | Worker 不足 / 任务过多 | 扩容 Worker 或调整并发限制 |
| 内存不足 | 链接任务过大 | 增加 Worker 内存,或限制链接并发数 |

5.2 诊断命令

复制代码
# 测试 RBE 连接
siso remote-test --server=scheduler.example.com:443

# 检查 Worker 状态
# EngFlow
curl -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    https://scheduler.example.com/api/v1/workers

# 查看详细构建日志
siso ninja -C out/Default -v --log_level=debug 2>&1 | tee build-debug.log

# 分析缓存命中率
siso ninja -C out/Default --profile_build \
    && cat out/Default/.siso/profile.json | jq '.cache_stats'

# 检查工具链一致性
# 客户端
clang --version
# Worker (通过 SSH)
ssh worker1 "clang --version"

5.3 调试模式

复制代码
# 单任务调试
siso ninja -C out/Default obj/foo.o --verbose

# 禁用远程,仅本地调试
siso ninja -C out/Default --local -j1

# 远程单任务执行
siso ninja -C out/Default obj/foo.o --remote_only

# 查看 Starlark 规则匹配
export SISO_STARLARK_DEBUG=1
siso ninja -C out/Default

6. 附录

6.1 参考资源

6.2 版本兼容性

|-------------|-----------------|-------------|----------------|
| Siso 版本 | Chromium 版本 | AOSP 版本 | RBE API 版本 |
| ≥ 2024.01 | ≥ M120 | Android 14+ | v2 |
| ≥ 2024.06 | ≥ M125 | Android 15+ | v2.1 |
| ≥ 2025.01 | ≥ M132 | Android 16+ | v2.2 |

6.3 性能基准

|------------------|----------------|------------------|---------|
| 项目 | 本地编译 (16核) | 远程集群 (8×32核) | 加速比 |
| AOSP (完整) | ~4 小时 | ~30 分钟 | 8x |
| Chromium Android | ~3 小时 | ~25 分钟 | 7x |
| 增量编译 | ~10 分钟 | ~2 分钟 | 5x |

实际性能取决于网络带宽、缓存命中率和集群负载。

6.4 配置文件模板汇总

完整 .sisoenv 模板
复制代码
# ============================================
# Siso RBE 配置文件模板
# 复制到项目根目录,命名为 .sisoenv
# ============================================

# ---- 服务器配置 ----
RBE_server_address=scheduler.example.com:443
RBE_instance=default
RBE_tls_enabled=true

# ---- 认证配置 (选择一种) ----
# 方式 1: Google OIDC
RBE_credentials_helper=siso-credential-helper.sh
# 方式 2: API Key
# RBE_api_key_file=/path/to/api_key
# 方式 3: 无认证 (内网)
# RBE_credentials_helper=none

# ---- 超时配置 ----
RBE_rpc_timeout=300s
RBE_exec_timeout=600s
RBE_connection_timeout=30s

# ---- 并发控制 ----
RBE_remote_job_limit=200
RBE_local_job_limit=16

# ---- 缓存配置 ----
RBE_cache_read=true
RBE_cache_write=true
RBE_cache_max_size_gb=50

# ---- 调试配置 ----
# SISO_LOG_LEVEL=debug
# SISO_PROFILE_BUILD=true
完整 GN args 模板 (Chromium Android)
复制代码
# ============================================
# GN 构建参数模板
# 保存为 out/Default/args.gn
# ============================================

# ---- 目标平台 ----
target_os = "android"
target_cpu = "arm64" # arm, x86, x64

# ---- 远程执行 ----
use_remoteexec = true

# ---- 构建类型 ----
is_debug = false
is_component_build = false
symbol_level = 1

# ---- Android 特定 ----
android_static_analysis = false
android_sdk_version = 35
android_ndk_version = "r27c"

# ---- 性能优化 ----
treat_warnings_as_errors = false
use_lld = true

# ---- 可选功能 ----
# enable_nacl = false
# ffmpeg_branding = "Chrome"
# proprietary_codecs = true

相关推荐
街头便衣1 小时前
OpenRouter周榜复算:164万亿token,输出2.55%,DeepSeek账单占1.4%
android·java·开发语言·人工智能·语言模型·开源
whyutianict_vv3 小时前
云计算 HCIE 认证体系解析:HCIA/HCIP/HCIE 三级科目与知识边界
linux·运维·云计算
知已难寻11 小时前
第 2 篇 · 云的地基:服务器、存储、网络三大基础设施
运维·服务器·网络·云原生·云计算·负载均衡·1024程序员节
警醒与鞭策13 小时前
Codex桌面版与Claude桌面版使用设置
android·unity·ai·性能优化
KaiwuDB14 小时前
KaiwuDB 分布式集群扩缩容,从原理到完整操作踩坑总结
运维·数据库·分布式
泡海椒15 小时前
深度解析JQuick-SQL AST到逻辑计划转换机制|分布式SQL原理
数据库·分布式·sql
传奇开心果16 小时前
【Compose Multiplatform跨端声明式UI实用技术】第19课:多平台部署与发布
android·kotlin
红尘伴蝶舞16 小时前
加密拦截器让抓包失效,我只能从 4KB 的 logcat 碎片里拼回 JSON
android·kotlin·ai编程
booboosui16 小时前
219 个还是 0 个:读不到微信界面时,我只加不删
android