0%

Win10从认识WSL到成功编译AOSP源码

什么是Wsl

wsl是适用于 Linux 的 Windows 子系统,它可让开发人员按原样运行 GNU/Linux 环境 - 包括大多数命令行工具、实用工具和应用程序 - 且不会产生传统虚拟机或双启动设置开销。
更多关于Wsl,请移步到这里

Wsl可以:

  • 在 Microsoft Store 中选择你偏好的 GNU/Linux 分发版。
  • 运行常用的命令行软件工具(例如 grep、sed、awk)或其他 ELF-64 二进制文件。
  • 运行 Bash shell 脚本和 GNU/Linux 命令行应用程序,包括:
  • 工具:vim、emacs、tmux
  • 语言:NodeJS、Javascript、Python、Ruby、C/ C++、C# 与 F#、Rust、Go 等。
  • 服务:SSHD、MySQL、Apache、lighttpd、MongoDB、PostgreSQL。
  • 使用自己的 GNU/Linux 分发包管理器安装其他软件。
  • 使用类似于 Unix 的命令行 shell 调用 Windows 应用程序。
  • 在 Windows 上调用 GNU/Linux 应用程序。

Windows中如果进行交叉编译

之前我们开发嵌入式或者进行安装系统开发时,大多数都会选择安装Linux系统,因为大多数嵌入式开发均采用的是安卓的平台,而安卓是基于Linux内核的,所以使用Linux开发嵌入式,有着不可替代的优势。

但是完全在Linux下开发和工作,也会存在一定的不方便。例如部分产品的刷机工具或者工作必须工具软件是没有Linux端的,所以在Linux下我们是不能够正常使用的它们的。有些朋友会说,Linux下使用Wine它不香吗?或者安装Deepin,也可以安装虚拟机呀。

而我要说的是,Linux下安装Wine它确实不香呀!另外安装虚拟机也不方便,一方面占用系统资源严重,另外对应文件交互也不是很方便。Deepin虽然说也挺不错的,但是支持的软件还是有限。那么针对这些问题,Wsl就可以完全解决你的烦恼。

Wsl下有哪些Linux分发版

Wsl目前支持以下Linux分发版:

  • Ubuntu 20.04
  • Ubuntu 20.04 ARM
  • Ubuntu 18.04
  • Ubuntu 18.04 ARM
  • Ubuntu 16.04
  • Debian GNU/Linux
  • Kali Linux
  • OpenSUSE Leap 42
  • SUSE Linux Enterprise Server 12
  • Fedora Remix for WSL

类似平台

multipass是一个小型的虚拟机,支持Linux,MacOS以及Windows平台,它和Wsl比较类似,占用资源较传统虚拟机大大减少,有兴趣的朋友可以去了解下:https://multipass.run/

Wsl安装

  • 步骤 1 - 启用适用于 Linux 的 Windows 子系统

需要先启用“适用于 Linux 的 Windows 子系统”可选功能,然后才能在 Windows 上安装 Linux 分发。
以管理员身份打开 PowerShell 并运行:

1
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
  • 启用虚拟机功能

以管理员身份打开 PowerShell 并运行:

1
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
  • 下载 Linux 内核更新包

移步这里下载并安装:
https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi

完成后重启电脑。

Wsl中添加Linux分发版

Wsl支持从Windows store、命令、安装包安装Linux分发版本,这里主要介绍安装包和store安装方式:

点击下载成功后,直接双击安装,更多安装信息请移步这里

点击下载成功后,直接双击安装,更多安装信息请移步这里

Wsl中文件交互

Wsl中的Linux分发版会自动将Windows磁盘挂载到/mnt/下,比如C盘会挂载为/mnt/c。从Windows中也可以很方便的访问Linux分发版的文件,只需打开\wsl$,就可以看到相应的分发版了。

修改Linux分发版镜像源

由于默认镜像源访问速度较慢,推荐修改为清华镜像源:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
sudo cp /etc/apt/sources.list /etc/apt/sources.ubuntu
sudo vi /etc/apt/sources.list

# 然后粘贴以下内容,保存退出
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse

# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse

#之后,执行
sudo apt-get update

更多详细请移步这里

AOSP代码下载

关于这块儿的介绍,大家可以去我之前的一篇文章中查看:国内Android源码下载编译配置

因为repo下载需要Python环境,分发版为Ubuntu20.04LTS自带的Python为3.x,所以需要安装2.x的Python

1
2
sudo apt-get install python
# 若报错请返回上节修改镜像源
  • 启用文件名大小写敏感

Windows文件或者文件夹时不区分大小写的,比如你之前有一个文件名为aa.txt,那么你是没办法再在相同目录下创建AA.txt,Aa.txt,aA.txt文件的。
当然了,Windows是可以支持区分大小写的,我们只需执行以下命令并传入你需要区分大小写的文件夹就可以了,另外,你没办法递归方式进行修改,但是如果你在启用大小写后新添加的目录或者文件,它会自动继承父文件夹的大小写敏感的

使用管理员权限在当前文件夹打开PowerShell,输入命令:

1
fsutil.exe file setCaseSensitiveInfo D:\Linux enable

如果,你在拉代码的时候发现类似如下报错,说明你没有启用大小写敏感:

1
[ERROR]  Your file system in xxx is *not* case-sensitive!
  • 添加ssh-key时报错解决
1
2
3
4
5
6
7
8
9
ssh-add xxx
Could not open a connection to your authentication agent.
# 只需执行以下命令,然后重新执行以上命令:
ssh-agent bash

ssh-add xxx
It is required that your private key files are NOT accessible by others.
# 说明你的ssh-key的权限太大了,需要缩写,执行以下命令既可解决:
sudo chmod 0600 xxx

AOSP源码编译

由于Linux分发版中缺少一些模块,会导致编译失败,这里罗列出来,请大家提前安装(这里笔者的环境为:Win10专业版 1903,内核版本:18362.449,Linux分发版本为Ubuntu-20.04 LTS)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
sudo apt install zip unzip m4 make libtinfo5 libncurses5 libncurses5-dev libssl-dev
# 因为20.04不支持32位程序,所以需要安装以下工具:
sudo apt install qemu-user-static
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'
# 以后每次启动Linux分发都需要执行以下命令启动对应服务
sudo service binfmt-support start
# 没有上述安装或者没有启动service,会报如下错误:
cannot execute binary file: Exec format error

sudo dpkg --add-architecture i386
sudo apt update

# 这里gcc安装64位的
sudo apt install gcc

#若出现如下报错,请安装成gcc:i386,然后再将其卸载掉,否则后面编译Linux内核是过不了的
'/lib/ld-linux.so.2': No such file or directory
sudo apt install gcc:i386
sudo apt-get remove gcc:i386

# 安装g++,不安装的话,报这个错:
Pccts/h/pccts_stdio.h:5:10: fatal error: 'cstdio' file not found
sudo apt install g++

# 报错:fatal error: bits/libc-header-start.h
sudo apt-get install gcc-multilib
sudo apt-get install g++-multilib
  • 编译可能的报错:

    • 报错1:
      fixdep: error fstat‘ing depfile: scripts/basic/.fixdep.d: Value too large for defined data type
      make[2]: *** [scripts/Makefile.host:102: scripts/basic/fixdep] Error 2
      make[2]: *** Deleting file ‘scripts/basic/fixdep’

      1
      2
      3
      4
      5
      6
      7
      # 修改kernel\msm-4.14\scripts\basic\fixdep.c,在导入sys/stat.h之前添加下面这个宏定义,修改效果如下:

      #define _FILE_OFFSET_BITS 64
      #include <sys/types.h>
      #include <sys/stat.h>

      # 或者如同报错2解决方式
    • 报错2

      scripts/kconfig/conf –silentoldconfig Kconfig
      ***
      *** Configuration file “.config” not found!
      ***
      *** Please run some configurator (e.g. “make oldconfig” or
      *** “make menuconfig” or “make xconfig”).
      ***
      make[3]: *** [/mnt/e/Workspaces/Ecarx/Codes/qc8155-CS2-20201013/aosp-caf/kernel/msm-4.14/scripts/kconfig/Makefile:40: silentoldconfig] Error 1
      make[2]: *** [/mnt/e/Workspaces/Ecarx/Codes/qc8155-CS2-20201013/aosp-caf/kernel/msm-4.14/Makefile:544: silentoldconfig] Error 2
      make[1]: *** No rule to make target ‘include/config/auto.conf’, needed by ‘include/config/kernel.release’. Stop.
      make[1]: Leaving directory ‘/mnt/e/Workspaces/Ecarx/Codes/qc8155-CS2-20201013/aosp-caf/out/target/product/kx11_high/obj/kernel/msm-4.14’
      make: *** [Makefile:146: sub-make] Error 2
      make: Leaving directory ‘/mnt/e/Workspaces/Ecarx/Codes/qc8155-CS2-20201013/aosp-caf/kernel/msm-4.14’

      1
      2
      3
      4
      # 这个报错应该是gcc的架构不对,需要64位的而本地安装了32位的
      sudo apt-get purge gcc:i386
      sudo apt-get autoremove
      sudo apt-get install gcc
      • 报错3

        dex2oatd F art/dex2oat/dex2oat.cc] dex2oat did not finish after 2850 seconds
        Zygote loaded classes=10594 post zygote classes=28
        Intern table: 84066 strong; 0 weak
        JNI: CheckJNI is off; globals=49 (plus 28 weak)
        Libraries: (0)
        Heap: 99% free, 19KB/64MB; dex2oatd F 11-29 23:29:21 24310 24317 thread_list.cc:771] Timed out waiting for threads to suspend, waited for 50.000s
        Runtime aborting…
        Dumping all threads without appropriate locks held: thread list lock mutator lock

        解决方法1不推荐

        针对出错的项目关闭odex生成,找到编译不过去的app或jar包的mk文件,加上
        LOCAL_DEX_PREOPT := false
        缺点:只能一个一个去找,去添加,较麻烦

        解决方法2推荐

        如果是boot.jar出现这个问题
        在build\make\core\dex_preopt_libart_boot.mk文件中找到DEX2OAT在其后追加-j1,使用单线程编译odex,类似如下修改:

        1
        2
        3
        @rm -f $(dir $($(PRIVATE_2ND_ARCH_VAR_PREFIX)LIBART_TARGET_BOOT_OAT_UNSTRIPPED))/*.oat
        $(DEX2OAT) -j1 --runtime-arg -Xms$(DEX2OAT_IMAGE_XMS) \
        --runtime-arg -Xmx$(DEX2OAT_IMAGE_XMX) \

        如果是某个app出现这个问题
        在build\make\core\dex_preopt_libart.mk文件中找到DEX2OAT在其后追加-j1,使用单线程编译odex,类似如下修改:

        1
        2
        3
        4
        $(hide) mkdir -p $(dir $(2))
        $(hide) ANDROID_LOG_TAGS="*:e" $(DEX2OAT) -j1 \
        --runtime-arg -Xms$(DEX2OAT_XMS) --runtime-arg -Xmx$(DEX2OAT_XMX) \
        --class-loader-context=$(DEX2OAT_CLASS_LOADER_CONTEXT) \

        也可使用变量判断当前HOST_CROSS_OS变量是否为windows,如果是的话使用单线程编译
        因为这编译这类文件的数量不多,因此不用担心影响总体编译效率

Windows terminal(可选)

Windows 终端是一个面向命令行工具和 shell(如命令提示符、PowerShell 和适用于 Linux 的 Windows 子系统 (WSL))用户的新式终端应用程序。 它的主要功能包括多个选项卡、窗格、Unicode 和 UTF-8 字符支持、GPU 加速文本呈现引擎,你还可用它来创建你自己的主题并自定义文本、颜色、背景和快捷方式。

点击这里直接下载双击安装即可:
Windows terminal

更多详细介绍请移步这里

安装XServer,使用图形化界面

有的朋友可能对于Linux的字符界面操作并不熟悉,所以使用起来可能是比较费劲的,所以就想问Wsl是否支持图形化界面的使用的呢?答案是:支持:

1
2
3
4
5
6
7
8
9
10
11
12
sudo apt-get install xfce4 xrdp xorg

# 配置xrdp,修改端口号
sudo sed -i 's/port=3389/port=3390/g' /etc/xrdp/xrdp.ini

#向xsession中写入xfce4-session
sudo echo xfce4-session >~/.xsession

#重启xrdp服务
sudo service xrdp restart

#如果有防火墙,允许就好了,然后使用Windows的远程桌面进行连接,连接地址输入:localhost:3390即可。
坚持原创技术分享,您的支持将鼓励我继续创作!
Wihatow 微信

微信

Wihatow 支付宝

支付宝