admin 管理员组

文章数量: 887017

一、背景介绍

  对于想要在Windows OS上学习和使用Android源码的同学来说,视乎这不太友好,因为Android基于Linux内核,需要在Linux环境下编译。
对于只需要查阅源码同学来说,整理在线查看源码工具如下:

  • http://androidxref
  • http://aosp.opersys/
  • https://cs.android/

  对于同时有编译验证需求的同学来说,以前的方式有:
安装VMWare、vitual box这类虚拟机软件。缺点就是经常需要切换操作系统环境,使用不友好、文件资料需要设置共享才能访问、占用Windows 主系统资源过多,容易卡顿。
安装Ubuntu、deepin等双系统。缺点也较为明显:切换OS需要进BIOS选择系统,操作繁琐,安装双系统较为繁琐。
远程连接Linux服务器,或云服务器,这种方式通常是企业级架构。
  幸运的是Windows 更新推出了WSL,WSL具体的使用方法参见下文。

二、WSL2安装

  WSL(Windows Subsystem for Linux)可让开发人员直接在 Windows 上按原样运行 GNU/Linux 环境(包括大多数命令行工具、实用工具和应用程序),且不会产生传统虚拟机或双启动设置开销。
WSL2是WSL 中体系结构的新版本,它更改了 Linux 分发版与 Windows 进行交互的方式。 WSL2与WSL1区别如下:

2.1、在win[开始]界面搜索wsl可查看是否已安装wsl

  如果已经安装,使用管理员权限运行WindowsPowerShell查看wsl 版本
PS C:\Windows\system32> wsl --status
默认分发:Ubuntu-18.04
默认版本:2
如上,我的电脑已经安装了wsl2,如果已安装wsl2则跳过步骤2.2

2.2、安装wsl2

  注意: WSL 2 仅适用于 Windows 10 版本 1903、内部版本 18362 或更高版本。通过按 Win + R,检查你的 Windows 版本,然后键入 winver,选择“确定”。(或者在 Windows 命令提示符下输入 ver 命令)。

  注意:如果系统版本低于 18362 的版本根本不支持 WSL2,如果系统版本低于1709 根本不支持 WSL1。
  注意:Windows Server 2019 和 2022 不支持WSL2

# 命令方式1.以管理员身份打开 PowerShell 并运行:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

# 命令方式2.以管理员身份打开 cmd 并运行:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

# 安装 WSL 2 之前,须启用“虚拟机平台”可选功能,并重启计算机
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

如果wsl2安装失败,尝试打开以下功能选项:

2.3、下载安装 Linux 内核更新包

安装完成后,请继续执行在安装新的 Linux 分发时,将 WSL 2 设置为默认版本。(如果希望将新的 Linux 安装设置为 WSL 1,请跳过此步骤。)

# 下载安装 Linux 内核更新包 
curl.exe -L https://wslstorestorage.blob.core.windows/wslblob/wsl_update_x64.msi -o wsl_update_x64.msi

# 将 WSL 2 设置为默认版本,以管理员身份打开 PowerShell 并运行:
wsl --set-default-version 2

# PowerShell 查看默认版本
wsl --status
默认版本:2

三、Ubuntu18.04 LTS安装及配置

WSL是一个轻量级Hyper-V虚拟机,比VMWare这类完整虚拟机消耗Windows OS的资源更少。安装好WSL后现在准备安装Linux发行版,这里我选择安装的是Ubuntu 18.04LTS.

3.1、安装Ubuntu 18.04 LTS

打开 Microsoft Store,并选择你偏好的 Linux 分发版,下载并安装。

这里我选择安装Ubuntu 18.04 LTS

安装完成并启动后可以创建Ubuntu账户及密码(后面需要用到)。

3.2、迁移wsl2

由于wsl2及 Microsoft Store默认下载在C盘,为防止后续拉代码及编译会撑爆C盘,所以需要将wsl2迁移,最好是独立磁盘分区,如果后续需要下载多份code,新建磁盘分区时尽量多分配些空间,由于分区含有系统后续再想扩展分区会导致磁盘变为动态磁盘(无法启动系统),建议每份Android 源码准备350G空间,例如我准备放AN9和AN10两份代码,新建了1000G磁盘,足够用了。
以下迁移操作均在管理员权限 PowerShell 中执行:
首先下载工具 LxRunOffline,

#解压LxRunOfflin,在该目录下打开命令行,运行查看子系统
.\LxRunOffline.exe list
Ubuntu-18.04

#迁移wsl,需要十几分钟,完成后会生成虚拟硬件磁盘ext4.vhdx文件
.\LxRunOffline.exe move -n Ubuntu-18.04 -d f:\wsl_ubuntu_1804

#迁移完成,查看迁移后路径
.\LxRunOffline.exe get-dir -n Ubuntu-18.04

注意:迁移前需先退出UbuntuLTS

3.3 wsl2 扩展VHD

WSL2使用虚拟硬件磁盘(VHD)来存储Linux文件。最大容量为256GB,如果你的分发版大小增长到大于256GB,则会显示错误,指出磁盘空间不足。 可以通过扩展 VHD 大小来解决。
以管理员权限打开PowerShell

#关闭wsl
wsl --shutdown

#查看wsl版本
 wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-18.04    Stopped         2

#进入disk命令行
diskpart

#选择虚拟磁盘
DISKPART> Select vdisk file=f:\wsl_ubuntu_1804\ext4.vhdx

#查看VHD的详细信息
DISKPART> detail vdisk

#扩展vdisk空间,xxx为空间大小,以MB为单位,默认为256000,我拓展到了1000000
DISKPART> expand vdisk maximum=xxx

#退出DISKPART,进入wsl
DISKPART> exit
$wsl

#查看分区
$df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb        251G  991M  238G   1% /
tools           200G   53G  148G  27% /init
none            4.9G     0  4.9G   0% /dev
tmpfs           4.9G     0  4.9G   0% /sys/fs/cgroup
none            4.9G  4.0K  4.9G   1% /run
...

#在wsl中操作,使wsl知道磁盘大小限制已经更改
$sudo mount -t devtmpfs none /dev
//将none挂载到/dev目录下,若返回'mount: /dev: none already mounted on /dev.',可忽略
$mount | grep ext4
//得到none挂载到/dev目录下的磁盘路径名
//本句命令返还的信息 '/dev/sdX' 即为磁盘路径名,X可能是a,b,c等,xxx为前面分配的vhd大小,M为MB单位
$ sudo resize2fs /dev/sdb 1000000M
resize2fs 1.44.1 (24-Mar-2018)
Filesystem at /dev/sdb is mounted on /; on-line resizing required
old_desc_blocks = 32, new_desc_blocks = 123
The filesystem on /dev/sdb is now 256000000 (4k) blocks long.
//重新查看分区配置
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb        961G 1000M  918G   1% /
tools           200G   53G  148G  27% /init
none            4.9G     0  4.9G   0% /dev

四、Android代码下载及编译

根据实际情况下载自己所需的项目代码或特定Android版本代码,这里我选择的是Android 10源码.
如果是下载内部项目代码,则可跳过此栏目,以下步骤仅作参考,具体方法步骤以内部资料为准。

## 4.1、下载Android 10 源码
cd ~/ && sudo apt-get update

#安装git和python
sudo apt install git python

#配置repo环境
mkdir ~/bin
curl https://mirrors.tuna.tsinghua.edu/git/git-repo -o repo
chmod +x repo
cp repo ~/bin

vim   ~/.bashrc
#添加下面两行环境变量配置 !wq 保存退出
PATH=~/bin:$PATH
export REPO_URL='https://mirrors.tuna.tsinghua.edu/git/git-repo'
#环境变量生效
source ~/.bashrc

#下载code到aosp
mkdir aosp && cd aosp
repo init -u https://mirrors.tuna.tsinghua.edu/git/AOSP/platform/manifest -b android-10.0.0_r36
repo sync -c

4.2、编译Android 10代码

#安装依赖工具链
sudo apt-get install  libncurses5   libgl1-mesa-dev g++-multilib flex bison gperf build-essential  tofrodos python-markdown libxml2-utils xsltproc  dpkg-dev libsdl1.2-dev git-core gnupg flex bison gperf  zip curl zlib1g-dev gcc-multilib   libc6-dev-i386  x11proto-core-dev libx11-dev  libgl1-mesa-dev libxml2-utils xsltproc unzip m4 ccache

#进入源代码根目录,编译
source build/envsetup.sh

#选择合适版本的模拟器,我电脑是x86-64  CPU,
#需要编译一个流畅运行的x86-64架构模拟器系统,这里最好编译选择24. aosp_x86_64-eng ,
#编译arm架构的模拟器在WINDOW上运行会非常慢,不建议。
lunch 24
make -j10
#通常编译需要3小时,编译成功后在out/下生成相应的img

4.3、常见编译报错及其处理

编译过程中免不了出现报错,通常有以下几类可供参考:
缺少安装特定工具:
这类报错比较明显,可直接sudo apt install xxx安装后重新编译android
缺少某些文件:
由于整个Android 源码比较庞大,在sync时网络波动等影响导致部分代码下拉异常,文件丢失,可在.repo同级目录下repo sync ,完成后重新编译android
编译工具链版本未对齐,例如java 版本,python版本
比较容易解决,自行网上查找解决方法,对齐后重新编译android
ubuntu系统内存不够导致,编译失败

4.4、启动模拟器,验证编译成果

wsl2由于是没有界面的unbutu 环境集成,不支持linux下的虚拟机kvm,并不能直接启动带界面的模拟器,我们需要用我们自己windows android sdk环境下的emulater.exe去加载编译产物img来进行调试。
(1)、在android studio中启动avd manager,创建一个和你编译指定版本一致的模拟器,这里是android 10, x86_64的镜像,起个名字如 wsl-android-10,下面要用到这个名字
(2)、加载wsl2编译好的img到window模拟器中,一般调试只需要system.img和userdata.img

#擦除已有的avd数据
D:\android-sdk\emulator\emulator.exe  -avd wsl-android-10   -wipe-data
#模拟器重新加载android image
D:\android-sdk\emulator\emulator.exe  -avd wsl-android-10     -system "\\wsl$\Ubuntu\root\aosp\out\target\product\generic_x86_64\system.img" -data "\\wsl$\Ubuntu\root\aosp\out\target\product\generic_x86_64\userdata.img"

说明:
your_android_sdk_path替换成window 下的android sdk路径
your_android_path 在powershell中操作:cd \wslKaTeX parse error: Undefined control sequence: \Ubuntu at position 1: \̲U̲b̲u̲n̲t̲u̲\ 可以看到wsl内的unb…\Ubuntu\root\aosp\out\target\product\generic_x86_64

  • -system指定system.img
  • -data指定userdata.img
  • -ramdisk指定ramdisk.img
  • -kernel指定内核映像

五、Android 源码查看

5.1 此电脑中添加网络位置映射Android 10源码

为了方便查看和编译代码,在windows可添加网络位置来映射Android10源码
wsl ubuntu18.04系统所在路径为\wsl$,在文件窗口顶部可输入查看(注意:需先以管理员权限打开Ubuntu18.04 LTS,否则无权限访问)

从这里找到Android10 源码路径,并复制该路径\wsl$\Ubuntu-18.04\home\xxx\aosp
在win磁盘界面空白区域单击鼠标右键->添加一个网络位置(L)->下一页->下一页->网络地址填入上面复制的路径->下一页
添加完成后可在网络位置中显示Android10 文件夹,以后可直接访问

5.2、SourceInsight 4新建项目导入Android10 code

为了方便代码开发,往往需要在开发工具中导入项目代码,可根据个人习惯使用偏好的开发工具导入code,这里以SourceInsight 4工具为例,步骤如下:
注意:SourceInsight 4以下版本无法找到//wsl$和网络位置而无法导入code

导入完成后就可以在SourceInsight中实时开发代码了。

六、参考资料

6.1、Window 10 使用WSL2下载编译Android 10 系统源码,并用sourceInsight 4 看系统源码
6.2、WinServer2022 服务器之WSL(Linux 子系统)安装实践
6.3、WSL使用史上最详细教程
6.4、WSL2扩展虚拟硬件磁盘( VHD大于256GB报错问题)
6.5、玩转wsl2之android模拟器调试

本文标签: 源码 Windows