WSL环境下Android构建执行lunch命令失败求助
我之前在WSL里编译Android源码也踩过类似的跨文件系统坑,结合你的情况,给你几个靠谱的排查和解决方法:
可能的原因&解决方案
1. Windows分区挂载权限/元数据问题
WSL挂载Windows磁盘(比如你的/mnt/e)时,默认权限配置可能导致Android构建脚本无法正确识别文件。你可以重新挂载分区,加上元数据和权限参数:
# 先卸载当前挂载 sudo umount /mnt/e # 重新挂载,UID/GID可通过`id`命令查看自己的用户ID sudo mount -t drvfs E: /mnt/e -o metadata,uid=1000,gid=1000,umask=022
metadata参数让WSL能识别Windows文件的权限属性,uid/gid对应你WSL用户的ID,umask确保文件有合理的读写权限,避免脚本因权限问题误判文件不存在。
2. Windows长路径限制触发的假象
Android源码里很多深层目录的路径长度容易超过Windows默认的260字符限制,这时候WSL访问这些路径会出现“文件不存在”的错误,但实际文件是存在的。解决方法是开启Windows长路径支持:
- 用管理员权限打开组策略编辑器(
gpedit.msc),依次找到:计算机配置 > 管理模板 > 系统 > 文件系统 > 启用Win32长路径,设置为已启用,然后重启电脑。 - 如果是家庭版Windows没有组策略,就打开注册表编辑器(
regedit),定位到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem,把LongPathsEnabled的数值改成1,重启电脑生效。
3. 转移源码到WSL内部文件系统编译
WSL访问Windows分区的兼容性始终不如自身的ext4文件系统,哪怕你把源码放在HDD,也可以考虑把WSL的虚拟磁盘迁移到HDD,然后把源码放在WSL内部目录(比如~/androidworkdir):
# 复制源码到WSL内部目录 cp -r /mnt/e/GJSie/androidworkdir ~/ # 切换到内部目录执行构建命令 cd ~/androidworkdir source build/envsetup.sh lunch
如果你的SSD满了,可以把WSL的虚拟磁盘移到HDD:打开PowerShell,用wsl --export Ubuntu-18.04 D:\wsl-ubuntu.tar导出,然后wsl --unregister Ubuntu-18.04,再wsl --import Ubuntu-18.04 D:\wsl-ubuntu D:\wsl-ubuntu.tar,这样WSL的系统文件就存在HDD上了。
4. 升级WSL版本和repo工具
如果用的是WSL 1,强烈建议升级到WSL 2,它的文件系统性能和兼容性对大型项目友好很多:
# 在Windows的PowerShell里执行 wsl --set-version Ubuntu-18.04 2
另外Ubuntu 18.04自带的repo版本可能偏旧,更新一下repo:
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo chmod a+x ~/bin/repo # 确保~/bin在PATH里,执行echo $PATH查看,不在的话可以加到~/.bashrc里 echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc source ~/.bashrc
你的报错信息
gjsman@DESKTOP:/mnt/e/GJSie/androidworkdir$ lunch Youre building on Linux Lunch menu... pick a combo: 11:00:49 Could not create module-finder: finder encountered 18 errors: [/mnt/e/GJSie/androidworkdir/tools/tradefederation/core/prod-tests/src/com/android/app/tests: lstat /mnt/e/GJSie/androidworkdir/tools/tradefederation/core/prod-tests/src/com/android/app/tests: no such file or directory /mnt/e/GJSie/androidworkdir/tools/tradefederation/core/prod-tests/src/com/android/graphics/tests: lstat /mnt/e/GJSie/androidworkdir/tools/tradefederation/core/prod-tests/src/com/android/graphics/tests: no such file or directory /mnt/e/GJSie/androidworkdir/tools/tradefederation/core/prod-tests/src/com/android/security/tests: lstat /mnt/e/GJSie/androidworkdir/tools/tradefederation/core/prod-tests/src/com/android/security/tests: no such file or directory /mnt/e/GJSie/androidworkdir/tools/tradefederation/core/prod-tests/src/com/android/wireless/tests: lstat /mnt/e/GJSie/androidworkdir/tools/tradefederation/core/prod-tests/src/com/android/wireless/tests: no such file or directory /mnt/e/GJSie/androidworkdir/tools/tradefederation/core/prod-tests/src/com/android/framework/tests: lstat /mnt/e/GJSie/androidworkdir/tools/tradefederation/core/prod-tests/src/com/android/framework/tests: no such file or directory /mnt/e/GJSie/androidworkdir/prebuilts/gradle-plugin/com/android/tools/build/builder-test-api/0.13.0: lstat /mnt/e/GJSie/androidworkdir/prebuilts/gradle-plugin/com/android/tools/build/builder-test-api/0.13.0: no such file or directory /mnt/e/GJSie/androidworkdir/external/perfetto/src/ftrace_reader/test/data/android_hammerhead_MRA59G_3.4.0/events/vmscan/mm_vmscan_memcg_isolate: lstat /mnt/e/GJSie/androidworkdir/external/perfetto/src/ftrace_reader/test/data/android_hammerhead_MRA59G_3.4.0/events/vmscan/mm_vmscan_memcg_isolate: no such file or directory /mnt/e/GJSie/androidworkdir/external/perfetto/src/ftrace_reader/test/data/android_hammerhead_MRA59G_3.4.0/events/vmscan/mm_vmscan_memcg_reclaim_begin: lstat /mnt/e/GJSie/androidworkdir/external/perfetto/src/ftrace_reader/test/data/android_hammerhead_MRA59G_3.4.0/events/vmscan/mm_vmscan_memcg_reclaim_begin: no such file or directory /mnt/e/GJSie/androidworkdir/external/perfetto/src/ftrace_reader/test/data/android_hammerhead_MRA59G_3.4.0/events/vmscan/mm_vmscan_memcg_reclaim_end: lstat /mnt/e/GJSie/androidworkdir/external/perfetto/src/ftrace_reader/test/data/android_hammerhead_MRA59G_3.4.0/events/vmscan/mm_vmscan_memcg_reclaim_end: no such file or directory /mnt/e/GJSie/androidworkdir/external/perfetto/src/ftrace_reader/test/data/android_hammerhead_MRA59G_3.4.0/events/vmscan/mm_vmscan_memcg_softlimit_reclaim_begin: lstat /mnt/e/GJSie/androidworkdir/external/perfetto/src/ftrace_reader/test/data/android_hammerhead_MRA59G_3.4.0/events/vmscan/mm_vmscan_memcg_softlimit_reclaim_begin: no such file or directory]...
内容的提问来源于stack exchange,提问作者opensmurf

