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

运行idegen.sh脚本出现File system loop detected报错如何解决

执行idegen.sh时find报文件系统循环错误的原因与修复方案

报错现象

执行./development/tools/idegen/idegen.sh脚本过程中,终端输出find命令相关报错:

find: File system loop detected; xxx is part of the same file system loop as `xxx is part of the same file system loop as xxx

诱发原因

这个报错是类Unix系统下find命令的原生防护机制:递归遍历目录时,find会记录已遍历目录的设备号+inode号,如果检测到当前遍历到的子目录设备号+inode号和已遍历过的上层目录完全一致,就会判定存在文件系统环路,抛出该错误终止对应路径的遍历,避免无限递归耗尽系统资源。
在Android源码环境下执行idegen.sh(用于生成Android Studio/IDEA工程配置文件)的场景中,常见触发原因有三类:

  • 循环符号链接:目录A下存在指向目录B的软链接,目录B下又存在指回目录A的软链接,形成遍历环路
  • 循环挂载点:通过mount --bind等操作,将源码树内的某个子目录重复挂载到源码树内的其他子路径,形成文件系统层面的环路
  • 编译产物异常:之前编译生成的out目录中存在指向上层源码根目录的软链接,idegen.sh默认会遍历整个源码树,扫描到这类环路就会触发报错

修复方案

按操作成本从低到高依次尝试即可:

  • 清理编译产物目录
    90%以上的该类报错都是out目录下编译生成的软链导致的,直接删除源码根目录下的out文件夹,或者执行m clean清理编译产物后,重新运行idegen.sh脚本即可。
  • 修改脚本的find遍历规则,主动跳过易出问题的路径
    打开./development/tools/idegen/idegen.sh,定位到脚本中调用find生成文件列表的代码行,做如下调整:
    • 追加-xdev参数:让find不跨文件系统遍历,自动跳过所有外部挂载点,规避bind挂载形成的环路
    • 追加路径过滤规则:添加-not -path "./out/*"参数,直接跳过out目录遍历,既可以减少遍历耗时,也能规避绝大多数软链环路问题
    • 调整软链遍历逻辑:如果原脚本带了-follow参数(跟随软链遍历),将其删除,避免跨软链递归形成环路
      修改后的find调用参考示例:
    find . -xdev -type f \( -name "*.java" -o -name "*.kt" -o -name "Android.bp" -o -name "Android.mk" \) -not -path "./out/*" > $FILE_LIST
    
  • 定位并删除异常循环软链
    如果上述操作后仍有报错,执行以下命令扫描源码树内的异常软链,根据输出的路径直接删除无效/循环软链即可:
    find . -type l -exec test ! -e {} \; -print
    
  • 清理异常挂载点
    执行mount | grep "$(pwd)"查看当前源码目录下是否存在嵌套的bind挂载记录,如果存在指向源码树内部子路径的挂载条目,执行sudo umount 对应挂载路径卸载异常挂载即可。

内容的提问来源于stack exchange,提问作者杜少雄

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 22:27:24