0%

WSL(Ubuntu 18.04)编译安卓6.0.0_r1源码

之前的尝试

一开始使用wsl1进行编译,即使用了ccache,编译耗时仍难以接受(编译了很久都没结束)
之后又使用wsl2进行编译,编译还是需要很久
原因猜测:源码位于D盘,wsl访问文件可能需要经过转换,因此IO操作速度慢。
搜索发现WSL 1 与 WSL 2 之间的用户体验更改中提到:

请确保将你要使用 Linux 应用程序频繁访问的文件放在 Linux 根文件系统中,以享受文件性能优势。 这些文件必须位于 Linux 根文件系统内,以便较快地访问文件系统。
验证:使用wsl在d盘解压源码,速度远慢于直接在wsl文件系统中解压
由此确定最终方案

最终方案

将源码压缩包移动到linux文件系统下,再解压
或者使用repo工具下载源码到linux文件系统

方法一 使用docker-aosp(建议)

使用docker编译安卓源码

方法二 直接使用wsl系统进行编译

如果使用wsl2,步骤与Ubuntu 19.10 编译安卓6.0.0_r1源码一致
wsl1则需要先进行以下配置

wsl1需要进行的操作

配置大小写敏感

方法一 配置wsl自动挂载

编辑/etc/wsl.conf,写入:

1
2
3
4
[automount]
enabled = true
options = "metadata,umask=0000,uid=0,gid=0,case=force"
mountFsTab = false

保存后重启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
2
sudo apt update
sudo apt install qemu-user-static

设置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
2
3
4
5
#include <stdio.h>
int main(){
printf("Hello world!\n");
return 0;
}

编译运行

1
2
gcc -o hello hello.c -m32
./hello

方法二

使用系统自带的程序覆盖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源码

参考

Ubuntu18.04 (WSL) 编译RK3399 Android8.1源码
WSL配置C/D盘大小写敏感