之前的尝试
一开始使用wsl1进行编译,即使用了ccache,编译耗时仍难以接受(编译了很久都没结束)
之后又使用wsl2进行编译,编译还是需要很久
原因猜测:源码位于D盘,wsl访问文件可能需要经过转换,因此IO操作速度慢。
搜索发现WSL 1 与 WSL 2 之间的用户体验更改中提到:
请确保将你要使用 Linux 应用程序频繁访问的文件放在 Linux 根文件系统中,以享受文件性能优势。 这些文件必须位于 Linux 根文件系统内,以便较快地访问文件系统。
验证:使用wsl在d盘解压源码,速度远慢于直接在wsl文件系统中解压
由此确定最终方案
最终方案
将源码压缩包移动到linux文件系统下,再解压
或者使用repo工具下载源码到linux文件系统
方法一 使用docker-aosp(建议)
方法二 直接使用wsl系统进行编译
如果使用wsl2,步骤与Ubuntu 19.10 编译安卓6.0.0_r1源码一致
wsl1则需要先进行以下配置
wsl1需要进行的操作
配置大小写敏感
方法一 配置wsl自动挂载
编辑/etc/wsl.conf
,写入:
1 | [automount] |
保存后重启PC
方法二 指定文件夹
Win+X
,打开PowerShell(管理员)
执行(D:\AOSP
替换为源码将要被解压的目录):
1 | fsutil.exe file setCaseSensitiveInfo D:\AOSP enable |
注意:必须使用管理员权限执行该命令
使bash支持32位程序运行
如果报错:cannot execute binary file: Exec format error
,说明运行了32位程序。
方法一 使用binfmt
安装qemu并设置binfmt
1 | sudo apt update |
设置binfmt
1 | sudo update-binfmts --install i386 /usr/bin/qemu-i386-static --magic '\x7fELF\x01\x01\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x03\x00\x01\x00\x00\x00' --mask '\xff\xff\xff\xff\xff\xff\xff\xfc\xff\xff\xff\xff\xff\xff\xff\xff\xf8\xff\xff\xff\xff\xff\xff\xff' |
启动服务
1 | sudo service binfmt-support start |
注意:binfmt服务在每次启动bash控制台时都需要启动,否则在运行32位程序时会报错cannot execute binary file: Exec format error
PS:可以实现自启动该服务
测试程序
1 | #include <stdio.h> |
编译运行
1 | gcc -o hello hello.c -m32 |
方法二
使用系统自带的程序覆盖32位程序(哪个文件报错就替换哪个)
报错<1>:bin/bash: prebuilts/misc/linux-x86/bison/bison: cannot execute binary file
报错原因:在x86 64位系统执行32位程序sudo cp /usr/bin/bison prebuilts/misc/linux-x86/bison
参考:Win10之WSL编译Android源码