You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android构建:如何缓存out文件夹以实现跨机器增量构建?

针对Android 16 (r4) Soong构建缓存的解决方案

为什么直接复制out目录会失效

Soong的增量构建依赖的不只是编译产物,还包括构建状态元数据(如.ninja_log、.ninja_deps等隐藏文件)、文件时间戳、权限,以及源码路径、工具链版本的一致性。直接复制out目录时如果遗漏隐藏文件、破坏时间戳/权限,或者WSL2文件系统存在时间同步问题,都会导致Soong判定所有文件需要重新编译。

同一机器修复复制out后从头编译的问题

  • 用保留属性的命令复制:避免用普通cp,改用rsync -a out/ out_backup/或cp -a out/ out_backup/,确保隐藏文件、权限、时间戳完全同步。
  • 检查WSL2文件系统:如果out目录在Windows挂载的路径下(如/mnt/c/),会出现时间戳同步异常,导致Soong误判文件过期。建议将源码和out放在WSL2原生文件系统(如/home/yourname/)。

跨机器构建缓存的可行方案

1. 官方ccache缓存(针对C/C++编译)

这是最成熟的跨机器缓存方案,Android构建原生支持:

  • 原机器配置:
    export USE_CCACHE=1
    prebuilts/misc/linux-x86/ccache/ccache -M 50G  # 设置缓存大小,按需调整
    
  • 打包缓存:tar -czf ccache.tar.gz ~/.ccache
  • 新机器复用:
    1. 确保源码版本、工具链(prebuilts目录)与原机器完全一致
    2. 解压缓存:tar -xzf ccache.tar.gz -C ~/
    3. 导出环境变量:export USE_CCACHE=1
    4. 执行构建即可复用C/C++编译缓存

2. Soong模块级全局缓存

Android 16 (r4)支持Soong全局缓存,可缓存Java/Kotlin、模块产物等:

  • 原机器配置:
    export SOONG_GLOBAL_CACHE_DIR=~/soong_global_cache
    m -j$(nproc)  # 编译后缓存会写入该目录
    
  • 打包缓存:tar -czf soong_cache.tar.gz ~/soong_global_cache out/soong(out/soong包含Soong的构建状态)
  • 新机器复用:
    1. 保证源码路径与原机器完全相同(如都为/home/yourname/android16/,Soong依赖绝对路径),若路径不同,可创建符号链接:ln -s /new/path/android16 /home/yourname/android16
    2. 解压缓存到对应位置
    3. 导出环境变量:export SOONG_GLOBAL_CACHE_DIR=~/soong_global_cache
    4. 执行m -j$(nproc),验证增量构建是否生效

关键注意事项

  • 两台机器必须使用完全一致的源码版本(包括所有补丁、子模块、repo同步状态)
  • 工具链版本要同步:确保prebuilts目录下的gcc、clang、jdk等工具完全一致
  • 环境变量统一:TARGET_PRODUCT、TARGET_BUILD_VARIANT等构建变量必须与原机器相同

内容的提问来源于stack exchange,提问作者elect

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.02 01:17:28