目前文章为半成品

前言

当你拿着一台骁龙的机器想给它刷LineageOS的时候可能会发现以下情况:

  1. (曾经)有官方支持,但是在官网已经找不到包了
  2. 有非官方支持,但是包不够新,或者这个包不干净(例如内置一大堆垃圾推广应用),又或者链接失效了而其他地方也找不到
    如果遇到上述情况或许你可以试试自己编译一个包出来

编译要求

  1. 一台安装了Windows 10 18917(1903)及以上版本系统的电脑(低于18917可以安装WSL初代,不过稳定性和兼容性不保证)
  2. 稳定的互联网连接,建议100M及以上带宽
  3. 至少8GB的RAM,低于8GB基本不可能编译成功(lz之前是4GB RAM,一直Jack报错内存不足,加了8GB内存条之后问题完美解决)
  4. 硬盘可用空间至少150GB(以LineageOS14.1为例,源码下载和解压后一共占用50G,编译完成后占用100G左右)
  5. (可选)一条飞机线路,当然如果你不嫌Github下载慢的话可以忽略
  6. Github上能够找到对应机型的开源驱动源码(这个尤为重要!)
  • 首先来讲驱动源码的问题

    • 如果你的机型的LineageOS是移植于其他机型的话,那么这个教程可能不适合于你(尤其是早期的联发科机型)。对于其他机型来说,不同安卓版本的LOS所使用的驱动源码完全不同,高版本的出厂系统肯定没有低版本的驱动源码(也就是说不可能编译比出厂安卓版本低的系统)
      同上,如果你想要编译的安卓版本并没有对应的驱动源码,同样不可能编译成功
    • 那么如何确定你想要编译的机型是否能够编译你想要的安卓版本呢?
      首先可以先到LineageOS官方项目搜索你的机型是否有(或者曾经有)官方支持

链接:https://github.com/lineageos
打开之后搜索机型代号(这里以一加X-onyx为例)
如果能够搜到的话点击device项进入,查看“branch”中是否有自己需要编译的系统相匹配的分支,如果有的话就可以直接在编译开始前直接拉取驱动源码而无需手动拉取

WSL2配置

  • 如果你还在用18917(1903)之前的系统,可以使用WSL1,但是WSL1对于32位可执行文件不怎么兼容。等会也会讲下怎么开启32位可执行文件兼容
    前排提醒:WSL2依赖Hyper-V,并且各种虚拟机/安卓模拟器会与Hyper-V冲突,唯一的解决方法就是新建一个关闭Hyper-V的启动项,与开启状态启动项分离出来,教程在此
  • 关于安装WSL2,网上有很多教程,这里就不阐述了
    需要注意的是,选择Linux子系统的时候推荐Ubuntu 18.04 LTS,不要选Ubuntu和Ubuntu 20.04 LTS,后者的软件包不完整,影响依赖包的安装。

初次使用WSL

  1. 安装完成之后,在开始菜单找到Ubuntu 18.04 LTS
  2. 然后单击打开,弹出的界面会提示正在安装,稍等一会即可
  3. 安装完成之后会提示你输入新的用户名,注意这里不支持中文
  4. 输入用户名之后会提示你输入新的密码,输入时不会显示出来这个需要注意按回车之后再次输入刚刚设置的密码然后按回车,就会跳到如下的命令行,WSL2就安装好了。

迁移WSL目录

  1. 关闭窗口,并下载Lxrunoffline
  2. 解压到任意目录后打开此目录,然后在目录空白处按住键盘上的shift键的同时点击鼠标右键,然后选择在此处打开Powershell窗口
  3. 打开Powershell之后输入.lxrunoffline l 以查看已安装的WSL版本
  4. 准备一个空文件夹以用于存放整个WSL系统(所在分区可用空间在150GB及以上)
  5. 然后在窗口中输入.\lxrunoffline m -n Ubuntu-18.04 -d H:\WSL
    其中Ubuntu-18.04就是前一个指令执行后显示的WSL版本,H:WSL为你想要存放WSL的路径,请按实际情况修改指令并执行
  6. 如果中间没有报错的话那么迁移完成之后就能在准备好的文件夹里看到WSL的主体文件

编译准备

  1. 打开WSL主画面,输入sudo su,然后输入之前设置的密码
  2. 执行完成之后开始修改系统内置的软件源(ubuntu软件服务器在国外,国内访问速度堪忧)
    输入vim /etc/apt/sources.list以打开vim编辑器
  3. 然后按一下d清空全屏
  4. 接下来打开https://developer.aliyun.com/mirror/,找到ubuntu点击进去
  5. 找到Ubuntu18.04对应的参数并将其全部复制下来
  6. 然后回到WSL窗口,按一下i键,然后按一下鼠标右键,刚刚复制的参数就会粘贴到编辑器里
  7. 然后按esc键并输入:wq就能保存退出,退出后输入apt update来更新软件列表缓存
    稍待片刻即可更新完成
  8. 接下来开始安装编译所需的依赖软件库
    在窗口中输入以下命令并回车执行:
#apt会自动安装所有软件包
sudo apt install -y bc bison build-essential ccache curl flex g++-multilib gcc-multilib git gnupg gperf lib32ncurses5-dev lib32readline-dev lib32z1-dev liblz4-tool libncurses5-dev libsdl1.2-dev libssl-dev libwxgtk3.0-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc zip zlib1g-dev imagemagick libbz2-dev libssl-dev lzma ncftp bash-completion python openjdk-8-jdk qemu-user-static

9.安装完成之后开始执行开启32位程序兼容模式
理论上来说WSL2解决了32位应用的兼容问题,不过lz还是倾向于在WSL2上也开启这个功能
在窗口中输入以下命令并回车:

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'
sudo service binfmt-support start
  • 不过如果不想每次启动WSL时都执行第二条命令的话需要做以下修改:

    • 编辑sudo配置文件 sudo visudo, 在文件末尾添加如下一行
      你的登录名 ALL=NOPASSWD:ALL
    • 例如我的登录名是lpxx50117,那么添加的语句就是
      lpxx50117 ALL=NOPASSWD:ALL

修改完成之后按Ctrl+X,输入Y之后回车退出

  • 然后接着输入
sudo vim /etc/profile
  • 按i键进入输入模式,在文件最下面添加如下语句:
sudo service binfmt-support start
  • 然后按esc键,输入:wq并回车,这样子就能每次开机自动执行了

拉取文件的重要工具repo

1.输入以下命令下载并激活repo:

curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > /bin/repo
chmod a+x /bin/repo

2.由于原版repo在拉取文件时需要连接到谷歌服务器检查更新,因此需要强行使repo连接到国内服务器来检查更新
输入vim ~/.bashrc打开编辑器
3.按i键进入编辑模式并在最下面加入以下语句:

export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'

然后按esc键,输入:wq并按回车退出编辑器
4.输入source ~/.bashrc并回车使得刚刚的修改生效

设置拉取参数

注:lz之前使用北京外国语大学镜像站进行拉取操作(清华大学镜像站现在不堪重负,不仅限速而且还极其不稳定)

  1. 新建一个用于存放LineageOS的文件夹并进入该文件夹:
mkdir los14
cd los14
  1. 然后输入以下命令并回车:
repo init -u https://mirrors.bfsu.edu.cn/git/lineageOS/LineageOS/android.git -b cm-14.1

注:其中最后面的cm-14.1代表的是LineageOS14.1,如果想下载其他版本的话把cm-14.1替换成你需要的安卓版本即可(LOS15.1对应的是lineage-15.1,以此类推)

  1. 稍等一会会提示你设置github相关参数,这里直接按两次回车,输入y回车,再输入n回车即可
  2. 然后输入vim .repo/manifests/default.xml修改拉取参数
  3. 按i键进入编辑模式,然后将
 <remote  name="github"
           fetch=".."
           review="review.lineageos.org" />
#改成
  <remote  name="github"
           fetch="https://github.com/" />

  <remote  name="lineage"
           fetch="https://mirrors.bfsu.edu.cn/git/lineageOS/"
           review="review.lineageos.org" />
#将
  <remote  name="aosp"
           fetch="https://android.googlesource.com"
#改成
  <remote  name="aosp"
           fetch="https://aosp.tuna.tsinghua.edu.cn"
#将
  <default revision="..."
           remote="github"
#改成
  <default revision="..."
           remote="lineage"
  1. 确认无误后按esc键,然后输入:wq然后回车即可
    然后输入repo sync就能开始拉取LineageOS源码了
  • 注:这里需要说明的一点就是由于LineageOS的源码由LineageOS自有源码+AOSP源码构成,而北京外国语大学镜像站还没有提供AOSP镜像服务(目前使用的是清华大学的AOSP镜像),因此下载过程中肯定会出现部分项目下载速度极慢且报错的情况(可能会出现多次)
  • 若遇到此问题,请直接按Ctrl+C强制停止并重新执行repo sync(repo支持断点续传)
    基于这个问题,整个下载过程可能会长达整整两个小时(100M宽带)
  • 下载完成之后还需要一些时间对这些文件进行解压(大概10多分钟,因人而异)

拉取驱动源码

  • 前排提醒:如果你的github下载速度够快的话可以忽略这个环节

首先确认电脑的内网ip地址,这个看系统设置就行
然后找到你的飞机软件的http代理端口,比如某ray默认http端口就是10809

记得把飞机软件里的“允许局域网连接”打开
然后在WSL窗口中输入以下两条命令(IP和端口请按照实际情况修改):
export http_proxy=http://192.168.10.100:10809
export https_proxy=http://192.168.10.100:10809
设置完成之后输入wget google.com测试一下是否设置正确