Win10 Linux子系统编译Android系统源码

一、前言

听说win10合入了Linux作为一个子系统,起初只以为是类似虚拟机的实现机制,想必对性能的提高也很有限。但是稍微了解却发现是并不是虚拟机的那种机制,而是可以完全发挥Host机器的性能,这无疑是用虚拟机进行学习Linux平台上的东西的完美的替代品。但仍然担心这个子系统并不如我所期望的那样完美,所以尝试着编译一下Android这个系统吧,如果能够编译Android成功,那么基本上也可以作为完美的替代品。

二、从Windows7升级到Windows 10

由于之前对于win10各种各样传言的不喜欢,一直没有升级win10,生怕面临余生被强制更新所统治的恐怖。然而公司已经普遍采用win10了,用了一段发现有些地方的确是慢,但并没有达到传说中的无法忍受的程度,更何况,还有Linux子系统,所以下定决心,将自己的win7升级为win10.

这个小节稍微提一下如何最大可能“纯净的”升级win10。

必备工具:

(1)windows10系统镜像。

(2)一个U盘(容量随意)。

这里要注意,有人会选择GHOST镜像,但我一向是对GHOST镜像敬而远之。GHOST镜像会集成很多用不上的东西,各种自以为是的对系统配置的修改,还有各种乱七八糟的预装应用。不过现在想找到“纯洁”的windows10安装镜像也很难了,我也只找到了差强人意的iso镜像。不过好歹是个安装盘。

一句话概括,用老毛桃U盘启动工具将U盘制作成一个WInPE的启动U盘,之后在WinPE里面装载镜像,进行安装。建议最好格式化C盘,提前备份好一切:桌面,我的文档,C盘目录其他应用等等。

这里注意一下:制作U盘启动的时候,会提示你是否要加入UEFI引导,不要选。我一开始想试一下,结果就是一直停在了99%等了N久N久,然后强制关闭后U盘变砖了。想必这个UEFI并不是支持所有的U盘,而我们的场景也没有这个需要,还是别给自己引入额外的问题了。之后是用分区助手的分区表恢复才弄好的。

装好以后,激活,就不说了。不纯洁的镜像大概也会预装数个应用,先全删了。后面有需要再装。预装的应用由于版本的问题,一般都是需要更新的。而且鬼知道装到了哪里,索性先全卸了。

win10装好了,其他的细节就不多说了。

有什么问题可以留言询问,后面有空了我再完善细节。

三、在Windows10中安装Linux子系统

这里我一开始是搜索CSDN和百度上的教程,但搜到的教程都已经过期了,很多步骤都不对。这里我的建议是:

直接去官方看安装教程

我的教程也会过期,所以这里直接给出官方地址。

安装wsl: https://docs.microsoft.com/en-us/windows/wsl/install-win10

手动安装WSL(适合微软商店不可用):https://docs.microsoft.com/en-us/windows/wsl/install-manual

WSL:Windows Subsystem for Linux

之前使用WSL1,编译没有成功。但是网上看到有别人编译成功了。不过现在出了WSL 2,据说是一个完整的Linux内核,相比1有很大的进步,看下面是官方的比较,所以我们升级2再试试:

https://docs.microsoft.com/en-us/windows/wsl/compare-versions

Comparing features

COMPARING FEATURES
FeatureWSL 1WSL 2
Integration between Windows and Linux
Fast boot times
Small resource foot print
Runs with current versions of VMware and VirtualBox
Managed VM
Full Linux Kernel
Full system call compatibility
Performance across OS file systems

然后如果我们之前已经下载了WSL 1,首先要删掉之前的WSL 1,安装WSL2:

win10 1903版本之后无法使用lxrun命令,有两种方法删除子系统:

1.  wslconfig /l  查看要删除的子系统名称,例如Ubuntu-18.04,wslconfig /unregister Ubuntu-18.04即可删除

2. 手动删除

PowerShell:

    rm -Recurse $env:localappdata/lxss/

Cmd:

   DEL /S %localappdata%\lxss\

 

我是直接使用上面的wslconfig /unregister Ubuntu-18.04就删掉了。

下面开始安装WSL教程:

之前提供了手动下载的方法,WSL2貌似可以直接使用微软商店。如果你的微软商店不可用,可以看下面的手动安装教程。

第一步: - 使能Window子系统

以管理员权限运行一个Power Shell,输入如下命令:

PowerShellCopy

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

第二步: - 更新到WSL 2

WSL 2需要满足几点前提条件:

系统版本需要满足 x64xit: Version 1903 或者更高版本, with Build 18362 or higher.

查看自己版本的方法:

win+R,输入winver。

简单的说,更新版本到1903以后,就到WSL 2了。

第三步 - 使能虚拟特性

在安装WSL 2之前,必须使能“虚拟机特性”:

以管理员权限运行 PowerShell执行下面的命令:

 

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

完成之后,重启。重启完成后你的机器就安装了WSL并且更新到WSl 2了。

第四步 - 下载WSL2 Linux内核更新包(如果是ARM64要下对应的版本)

1. 下载最新的包:

WSL2 Linux kernel update package for x64 machines

2. 执行上面第1步下载的更新包。

安装完成。

第五步 - 设置WSL 2作为你的默认版本

以管理员权限运行PowerShell,并输入如下命令。这个命令的作用是设置WSL 2作为安装新的Linux的默认版本。

wsl --set-default-version 2

第六步 - 安装你的Linux发行版本

注意,这部分可以使用微软商店,如果微软商店不可用,就用下面的手动安装教程。

打开微软商店选择喜欢的Linux发行版:

View of Linux distributions in the Microsoft Store

下面给出官网给出的一些常用版本,我下的是Ubuntu 18.04.点击链接会自动打开微软商店,需要有可用的微软账户。

如果微软商店不可用,或者不想用,也可以手动下载Linux发行版本,如下

手动安装教程:

https://docs.microsoft.com/en-us/windows/wsl/install-manual

选择想要的版本,下载,安装。

简单的一句话概括:下载你喜欢的Linux发行版的安装包,安装之。(在WSL1中需要把下载的这个放到希望成为根目录的地方安装,WSL2中直接安装就行,WSL1需要注意

进入下载的文件所在的目录,这个目录也是你未来Linux系统的根目录。所以尽量避免目录路径太深,以及包含中文。虽然我也不知道包含中文有什么问题,不过能免则免吧)。

我选择了Ubuntu18.04.然后进入命令行,用cd命令进入到这个目录,执行下面的命令:

Add-AppxPackage .\app_name.appx

Add-AppxPackage是win10的一个程序,这条命令直接调用。后面那个.\app_name.appx是你自己下载的发行版的名字,要注意替换成你自己上一步下载的那个文件。

最后再强调一下:这个目录,会成为你Linux系统中的根目录。

装好以后,在终端中输入命令bash,即可进入Linux系统,无缝切换,完美。好了,你已经进入Linux世界了,就是这么简单。

这里可能会有一些出入,手动那部分是上次WSL 1的时候写得,WSL2直接用的微软商店。

 

第七步 - 启动Linux

WSL 1中的启动方法是在命令行中输入bash。WSL 2则是运行安装的那个发行版本。比如我的是Ubuntu18.04,可以在程序里找到,也可以在微软商店里找到。当然也可以使用命令行来启动,在命令行中输入ubuntu1804,就会启动Linux内核了。这个命令具体会依据你安装的发行版而变化。

这里遇到一个问题:

使用WSL2出现“参考的对象类型不支持尝试的操作”的解决方法

这也是我遇到的问题,直接引用一下:

========源地址:https://blog.csdn.net/weixin_43347283/article/details/107006275===================

问题:

参考的对象类型不支持尝试的操作。(The attempted operation is not supported for the type of object referenced.)
解决方法:

1. 临时解决方案(不推荐):

以管理员身份运行CMD,输入:

netsh winsock reset

重启计算机即可修复。

2. 比较长期解决的方案(推荐):

(使用到目前,仍未出现问题)

(1)下载此软件:

www.proxifier.com/tmp/Test20200228/NoLsp.exe

(因需要梯子访问下载,有些朋友不方便,所以我上传到百度云分享在这里:)
(链接:https://pan.baidu.com/s/1bVZ0OXZPxEt8l1IHYaFK3A ,提取码:vjge)

(2)管理员身份运行CMD输入:

NoLsp.exe C:\windows\system32\wsl.exe
  • 1

请自行注意NoLsp.exe程序的位置,以及你的wsl.exe位置。
产生原因和解决方法分析:
代理软件和wsl2的sock端口冲突,使用netsh winsock reset重置修复。
Proxifer开发人员解释如下:

如果Winsock LSP DLL被加载到其进程中,则wsl.exe将显示此错误。最简单的解决方案是对wsl.exe使 用WSCSetApplicationCategory
WinAPI调用来防止这种情况。在后台,该调用在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters\AppId_Catalog中为wsl.exe创建一个条目。
这将告诉Windows不要将LSP DLL加载到wsl.exe进程中

上述解决方案来自于:

1.https://github.com/microsoft/WSL/issues/4177
2. https://answers.microsoft.com/zh-hans/insider/forum/all/wsl2%E5%AE%89%E8%A3%85kali/b6dd4c62-1130-4a7c-9462-1e9e5f38dab2?auth=1

知乎回答可见以下链接,也是本人:
https://zhuanlan.zhihu.com/p/151392411

========源地址:https://blog.csdn.net/weixin_43347283/article/details/107006275===================

 

下面应该就可以正常运行Linux子系统了。

首次启动会让你设置一个用户,我是直接敲回车。进入默认会使用Root账户。有的人可能不太习惯登录就是root账户,可以通过

useradd 【用户名】添加一个账户,然后在PowerShell中使用命令修改默认登录的账户。

useradd的用法:https://www.cnblogs.com/zknublx/p/9360821.html

设置默认的登录用户:

新版本lxrun不能用了,换成了WSLConfig。

比如说我先用root登录了,然后用useradd adminabc 添加了一个账户。

然后关掉WSL,在管理员权限下配置WSL默认的登录账户为上面添加的这个adminabc,这样会有一个home文件夹,而且避免rm / * -rf之类的恐怖操作。执行下面的命令:

ubuntu1804 config --default-user grf123

ubuntu1804 config --default-user adminabc

主要是这个config的参数,如果你安装了其他的发行版,记得改哦。

 

如果大家发现摁Tab不能补全命令,记得执行一下bash哦,要知道,我们平时常用的其实是在bash里面,跟原始的终端是不一样的。

 

安装好之后,进入Ubuntu,根目录是位于这个目录,找了好久:

C:\Users\Administrator\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc\LocalState

默认安装完成后,Linux系统是位于系统盘,如果看上面的目录可以看到是一个虚拟硬盘,可以扩大,但是不好缩小。

所以就搜了一下,怎样修改安装目录,让它可以安装到空间比较大的盘里去。

原文地址:https://blog.csdn.net/w851685279/article/details/108904106?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~sobaiduend~default-1-108904106.nonecase&utm_term=wsl2%E6%94%B9%E5%8F%98%E5%AE%89%E8%A3%85%E4%BD%8D%E7%BD%AE&spm=1000.2123.3001.4430

 

1.  查看已安装的linux发行版本

wsl -l --all -v

2.  导出分发版为tar文件到d盘

wsl --export Ubuntu-20.04 d:\wsl-ubuntu20.04.tar

3. 注销当前分发版

wsl --unregister Ubuntu-20.04

4. 重新导入并安装WSL在D盘

wsl --import Ubuntu-20.04 d:\wsl-ubuntu20.04 d:\wsl-ubuntu20.04.tar --version 2

5. 设置默认登陆用户为安装时用户名

ubuntu2004 config --default-user USERNAME

6. 删除wsl-ubuntu20.04.tar

del d:\wsl-ubuntu20.04.tar

 

好了,现在就进入Linux的世界了,首先开始配置源吧。

四、配置Linux更新源

不要以为这一段不重要,实际上Linux子系统的源跟我们平常配置的不是完全相同。为了安装一个g++我也是试了好几个源。阿里和阿里的源之间还有微小的不同。这不同就体现在一个能安装g++一个装不上。

这里直接给出我最后安装上g++的源:

deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse

节省大家时间。

然后sudo apt update之类的我就不细说了。

五、尝试编译Android 7.

为什么选择android 7呢,因为我之前对7比较熟悉,而且买的书也是用的这个版本。所以先尝试7.当然最终我并没有成功编译出来,不过把遇到的问题和解决方法做个记录,供大家参考吧。

首先是获取Android源码,由于众所周知的原因,使用清华源的:

https://mirror.tuna.tsinghua.edu.cn/help/AOSP/

这里贴一下清华镜像的说明:

参考 Google 教程 https://source.android.com/setup/build/downloading, 将 https://android.googlesource.com/ 全部使用 https://aosp.tuna.tsinghua.edu.cn/ 代替即可。

由于使用 HTTPS 协议更安全,并且更便于我们灵活处理,所以强烈推荐使用 HTTPS 协议同步 AOSP 镜像。

由于 AOSP 镜像造成CPU/内存负载过重,我们限制了并发数量,因此建议:

  1. sync的时候并发数不宜太高,否则会出现 503 错误,即-j后面的数字不能太大,建议选择4。
  2. 请尽量选择流量较小时错峰同步。
  • 2017-08-28 : 更新镜像大小信息
  • 2016-06-24 : 关闭 git:// 协议,仅支持 HTTPS
  • 2016-04-03 : 删除每月初始化包中的冗余内容,使用方法更新
  • 2015-12-21 : 增加每月初始化包,少量修正文档错误
  • 2015-10-13 : 修复上游替换文档错误
  • 2015-10-13 : 修复次级镜像文档错误
  • 2015-10-09 : 恢复 git://aosp.tuna.tsinghua.edu.cn/aosp/ 访问
  • 2015-10-08 : 镜像地址更新为 https://aosp.tuna.tsinghua.edu.cn/ (结尾没有/android)

 

如果需要某个版本的android代码,使用如下命令即可:

 

repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-4.0.1_r1

这个-b的列表,大家可以参考“源代码标记和列表”网站,我这里给列一下:

https://source.android.com/source/build-numbers#source-code-tags-and-builds

细分版本分支版本支持的设备
OPR5.170623.007android-8.0.0_r17OreoNexus 6P
OPR4.170623.009android-8.0.0_r16OreoNexus 5X
OPR3.170623.008android-8.0.0_r15OreoPixel XL、Pixel
OPR1.170623.027android-8.0.0_r13OreoPixel XL、Pixel、Pixel C
OPR6.170623.021android-8.0.0_r12OreoNexus Player
OPR6.170623.019android-8.0.0_r11OreoNexus 6P
OPR4.170623.006android-8.0.0_r10OreoNexus 5X
OPR3.170623.007android-8.0.0_r9OreoPixel XL、Pixel
OPR1.170623.026android-8.0.0_r7OreoPixel XL、Pixel、Pixel C
OPR6.170623.013android-8.0.0_r4OreoNexus 5X、Nexus 6P
OPR6.170623.012android-8.0.0_r3OreoPixel XL、Pixel
OPR6.170623.011android-8.0.0_r2OreoPixel XL、Pixel
OPR6.170623.010android-8.0.0_r1OreoPixel C
NZH54Dandroid-7.1.2_r33NougatPixel XL、Pixel

最新的应该已经到了android11,不过这个网站还没更新,之后我再更新一下。我先选7.1的版本:

repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-7.1.2_r33

 

注意:在repo sync的时候,可能由于网络原因,经常会有错误:

repo sync的时候回报这个错误,原因是该路径下的.git文件没有下载完成。

Checking out projects:  88% (465/528) platform/prebuilts/clang/host/darwin-x86error: Cannot checkout platform/prebuilts/clang/host/linux-x86: ManifestInvalidRevisionError: revision refs/tags/android-7.1.2_r33 in platform/prebuilts/clang/host/linux-x86 not found

由于repo sync很容易受到网络影响而失败,即使是国内的源也可能会出现失败,所以大家多sync几次,直到出现明确告诉你,sync成功了,再开始编译。凡是有报错的都多sync几遍。

Fetching projects: 100% (529/529), done.
Checking out files: 100% (8484/8484), done.orm/prebuilts/sdkChecking out files:   2% (242/8484)
Checking out files: 100% (539/539), done.tform/system/coreChecking out files:  28% (154/539)
Checking out files: 100% (421/421), done.tform/system/tpmChecking out files:  18% (77/421)
Checking out files: 100% (15774/15774), done.m/test/vtsChecking out files:  44% (6985/15774)
Checking out files: 100% (25/25), done.latform/tools/external/fat32libChecking out files:  32% (8/25)
Checking out projects: 100% (528/528), done.
repo sync has finished successfully.

repo sync has finished successfully,这样就完全sync了代码了。不放心可以再sync一次。然后再开始编译。我之前有几次就是其实没有sync完成, 就开始编译,各种莫名其妙的错误。

 

解决方法就是进入这个目录,执行repo sync .让repo 单独再sync一下当前目录即可。最后面是有一个“.”的参数,表示同步当前目录。总之一定要注意,要完完整整的sync好代码,再开始进行编译工作。

 

这里给出一个编译指导的网站:

https://developer.sony.com/develop/open-devices/guides/aosp-build-instructions/#build-aosp-nougat-7-1

其实应该第一时间查看这类网站的,我也是遇到问题解决不了到处搜索才找到的这个网站,这里先放出来。有不知道怎么编译Android的,先看下上面相对比较正规的文档,一步一步照着做吧。

这里我copy一下android 7的编译步骤:

To prevent errors generated by having the wrong version of Java installed on your computer, we will start by removing any conflicting Java version and adding the correct version. Java 8 is needed to build Android 7.x.x.

(人话:为了避免JAVA版本导致的问题,编译Android 7.x.x的版本需要Java 8的环境,而且要open-jdk,与早期版本不同。简单的说,下面的步骤先把已有的java给清除了,再按照open-jdk8)

  1. On your computer: In a terminal window, enter the following command:
     
    sudo apt-get purge openjdk-* icedtea-* icedtea6-*
  2. A guide will appear on the screen. Follow the instructions to remove Java.
  3. Once Java is removed, install the correct version of Java by entering the following commands in a terminal window:
     
    sudo apt-get update sudo apt-get install openjdk-8-jdk java -version

    You should now see something similar to the following in your terminal window:

     
    java version "1.8.0_91" OpenJDK Runtime Environment (build 1.8.0_91-8u91-b14-0ubuntu4~14.04-b14) OpenJDK 64-Bit Server VM (build 25.91-b14, mixed mode)

 

Java环境装好了,还要安装编译所需要的各种工具库,有的能装成功,有的装不成功,有的需要更新源,有的需要找替代品,自己搜一下吧。

sudo apt-get install bison g++-multilib git gperf libxml2-utils make zlib1g-dev:i386 zip liblz4-tool

 

编译的步骤就不多说了。编译的时候我还遇到一些问题:

有一个提示是:
/bin/bash: prebuilts/misc/linux-x86/bison/bison: cannot execute binary file: Exec format error

 

看起来像是无法执行这个prebuilt目录下的bison,我进去执行发现国真不行。原因是这个应用是32位程序,64位下运行需要安装运行库。猜测就是上面那个带386的东西。最后是在这里找到了解决方法:

https://www.cnblogs.com/JiuHuan/p/10073632.html

现在能够运行32位程序了。然后又编译,又报错,找不到好的解放办法,我觉得Linux子系统跟原生还是有些差距吧。这个先放着,我去试试编译android 10看看。

目前编译android 7的进展就到这里了,找不到好的解决办法,如果有大神知道怎么回事,还请点拨一下。

 

六、尝试编译android 10

我想10毕竟新一些,没准一些过时的东西已经不用了,说不定能编的过呢。过了再更新这个教程。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值