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 - 新机器复用:
- 确保源码版本、工具链(prebuilts目录)与原机器完全一致
- 解压缓存:
tar -xzf ccache.tar.gz -C ~/ - 导出环境变量:
export USE_CCACHE=1 - 执行构建即可复用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的构建状态) - 新机器复用:
- 保证源码路径与原机器完全相同(如都为
/home/yourname/android16/,Soong依赖绝对路径),若路径不同,可创建符号链接:ln -s /new/path/android16 /home/yourname/android16 - 解压缓存到对应位置
- 导出环境变量:
export SOONG_GLOBAL_CACHE_DIR=~/soong_global_cache - 执行
m -j$(nproc),验证增量构建是否生效
- 保证源码路径与原机器完全相同(如都为
关键注意事项
- 两台机器必须使用完全一致的源码版本(包括所有补丁、子模块、repo同步状态)
- 工具链版本要同步:确保prebuilts目录下的gcc、clang、jdk等工具完全一致
- 环境变量统一:TARGET_PRODUCT、TARGET_BUILD_VARIANT等构建变量必须与原机器相同
内容的提问来源于stack exchange,提问作者elect
相关产品推荐
相关产品推荐

