为Pixel3 PixelExperience13Plus内核引入Kernelsu
“不喜欢折腾开源项目的程序员不是好的程序员。”————我自己说的
概要
由于买了一个Pixel3的欧版工程机,但是奈何不是GKI设备没有现成的内核拿来刷。转遍Gayhub却没有发现一个比较满意的,遂决定自己编译一个。
但是由于并未尝试过,同时网上的教程并不是很多,也不是很详细,导致遇到问题解决并不快,于是决定写一个博客记录一下。文章重点包含了编译流程与常见错误解决方案两大内容,为了防止内容过于耦合,本文先精简地介绍了大概的编译流程,针对常见错误的解决方案则放在其后展开。
感谢PixelExperience
的官方组,在他们的TG群内提供了相对详细的编译教程,同时把一些常见的错误也列了出来,以及安全后厨
公众号写的《为Pixel3编译支持kernelsu的内核》的文章。
编译过程中参阅的相关教程链接将会放在文章末尾。
编译流程
由于已经锚定使用Pixel Experience,则介绍其的编译流程。其他的开源系统也大差不差,下文会针对每一步骤的用途进行介绍,行为逻辑是通用的。绝对不是我刚开始编译LineageOS失败了。
由于clone下来整个aosp项目后编译内核是十分轻松简单的,所以本文主要针对这个方法进行介绍。如果直接clone诸如kernel_google_bluecross的内核开源库,直接编译后是缺少驱动文件的,需要自己并入特定设备的驱动文件。
Complete Android OS is composed of three pieces. 1) The official AOSP source code. 2) A device specific kernel. 3) Proprietary binaries for Specific device(Drivers for hardware like camera,sensors etc..).
完整的Android操作系统由三部分组成。 1)AOSP官方源代码。 2) 设备特定的内核。 3) 特定设备的专有二进制文件(相机、传感器等硬件的驱动程序)。
本文先从编译不加入kernelsu的源码开始,得到验证后再加入kernelsu。
经查阅官方编译WIKI得知以下步骤。
(1) 硬件配置要求
A relatively recent 64-bit computer (Linux, preferably a recent version of ubuntu) with a reasonable amount of RAM and about 200 GB of free storage (more if you enable ccache or build for multiple devices). The less RAM you have, the longer the build will take. Aim for 16 GB RAM or more, enabling ZRAM can be helpful. Using SSDs results in considerably faster build times than traditional hard drives.
需要64位Linux(新版的Ubuntu最好),至少需要16GB的RAM以及200GB的硬盘空间。可以通过加swap大小来缓解内存的不足。
经过实测,编译时会占用20GB的运行内存(主机内存为32GB),同时占用1GB左右的swap;针对thirteen-plus分支,标注–depth=1的情况下clone下来后,占用了大概120GB的硬盘空间,在完整编译后占用的磁盘空间达到了226GB。
如果存储空间不足的话,还是不推荐尝试了。(至少花钱买个磁盘,交个学费)
(2) 编译前戏
Android SDK platform tools是刷机不可少的,可自行下载;
一堆需要的相关工具
adb autoconf automake axel bc bison build-essential
ccache clang cmake curl expat fastboot flex g++
g++-multilib gawk gcc gcc-multilib git git-lfs gnupg gperf
htop imagemagick lib32ncurses5-dev lib32z1-dev libtinfo5 libc6-dev libcap-dev
libexpat1-dev libgmp-dev ‘^liblz4-.‘ ‘^liblzma.‘ libmpc-dev libmpfr-dev libncurses5-dev
libsdl1.2-dev libssl-dev libtool libxml2 libxml2-utils ‘^lzma.*’ lzop
maven ncftp ncurses-dev patch patchelf pkg-config pngcrush
pngquant python2.7 python-all-dev re2c schedtool squashfs-tools subversion
texinfo unzip w3m xsltproc zip zlib1g-dev lzip
libxml-simple-perl libswitch-perl apt-utils rsync \
由于构建编译环境东西较多,可以直接使用大佬开源的构建脚本。
akhilnarang/scripts/android_build_env.sh
用法:
1 |
|
3.需要安装repo,它是用来解决clone AOSP这种超大项目的工具。
Repo(一种对 Git 构成补充的 Google 代码库管理工具)Repo 可以在必要时整合多个 Git 代码库,将相关内容上传到 Gerrit 修订版本控制系统,并自动执行 Android 开发工作流程的部分环节。
Repo 启动器会提供一个 Python 脚本,该脚本可以初始化检出,并可以下载第二部分,即完整的 Repo 工具。完整的 Repo 工具包含在 Android 源代码检出中。该工具默认位于 $SRCDIR/.repo/repo/… 中,可以从下载的 Repo 启动器接收转发的命令。
Repo 不会取代 Git,只会让您在 Android 环境中对 Git 的使用更加轻松。Repo 使用清单文件将 Git 项目汇总到 Android 超级项目中。您可以将 repo 命令(这是一个可执行的 Python 脚本)放在路径中的任何位置。使用 Android 源代码文件时,您可以使用 Repo 执行跨网络操作,例如使用一个 Repo 工作目录。
在大多数情况下,您可以仅使用 Git(不必使用 Repo),或结合使用 Repo 和 Git 命令以组成复杂的命令。不过,使用 Repo 执行基本的跨网络操作可大大简化您的工作。如需详细了解 Repo,请参阅 Repo 命令参考资料、Repo README、可在 Repo 中启用的预上传钩子(测试)以及 AOSP 中的通用文档。
可以如此安装(如果可以通过仓库安装更好):
1 |
|
当然,不要忘记在$PATH这一环境变量内加入~/bin
路径。
4.配置git
1 |
|
编译
初始化并clone源码
1 |
|
其中,repo init行的命令用于选定特定的分支,初始化一个配置文件,指导后续需要clone哪些库。
在完成初始化后,可以执行repo sync来同步源码,此时才会真正地开始clone。
1 |
|
接下来是漫长的clone过程,国内的用户需要确保外网可用。有需要的话,可以自行去搜索如何配置代理。
配置ccache(可选)
ccache用于加速构建,但是会占用一定的存储空间。有需要的话可以自行搜索相关教程。
拉取特定设备的相关文件及配置(重要)
首先,进行编译环境配置的初始化:
1 |
|
该脚本会自动配置需要的一些环境信息。
然后,需要进行设备必须依赖项的下载,如果选择不正确,或者不进行此操作会导致无法编译或者编译后无法boot。
1 |
|
我们可以注意到aosp_blueline-userdebug
,其实它的格式是aosp_设备别名-构建类型
,设备别名需要自行查找官方的资料,构建类型可以选择eng
(工程机,具有额外调试工具的开发配置)、userdebug
(用户调试,与“user”类似,但具有 root 权限和调试功能;是进行调试时的首选编译类型)、user
(权限受限;适用于生产环境)。
之后将进行相关内容的下载,如果第一行出现了找不到文件的报错,不必理会,命令将会自行下载缺失的文件。
开始编译
如果前面的配置还有初始化过程没有问题的话,可以进行一键编译(需要注意的是该命令不止会编译出bootimg,是编译出android系统的全套内容,仅编译bootimg的话则把bacon改为bootimage即可):
1 |
|
(GPT生成的解释)
mka bacon -j$(nproc –all) 是一个在编译 Android ROM 时常用的命令。这个命令可以分解为以下几个部分:
mka:这是一个封装了 make 命令的脚本,它设置了一些环境变量以便于 Android 的编译。
bacon:这是一个目标,它告诉 make 命令需要编译的是完整的 Android ROM。在某些情况下,“bacon” 可能会被替换为其他的目标,例如特定设备的名称。
-j$(nproc –all):这是传递给 make 命令的一个参数。-j 参数告诉 make 命令可以并行编译的任务数。$(nproc –all) 是一个 shell 命令,它返回当前系统的处理器核心数。因此,-j$(nproc –all) 的意思是让 make 命令并行编译,同时编译的任务数等于处理器的核心数。
总的来说,mka bacon -j$(nproc –all) 的意思是使用所有可用的处理器核心并行编译完整的 Android ROM。
接下来则是漫长的编译时间。
产物提取
产物在源码工作目录的out文件夹内,自行寻找即可。
加入kernelsu
以上内容中,我们已经完成了官方源码的初始化与编译,接下来进行kernelsu的加入。
KernelSU 可以被集成到非 GKI 内核中,现在它最低支持到内核 4.14 版本;理论上也可以支持更低的版本。
由于本文使用的内核版本是4.9.337,我们可以直接使用kernelsu提供的自动集成脚本。
在上文中clone的pe工作目录下,cd到kernel目录,然后运行:
1 |
|
kernelsu便可自动集成在内核中,当然不要忘记在kernel/arch/configs/b1c1_defconfig中添加下述配置:
1 |
|
再次按照上文提到的编译方式编译即可。
刷入
刷入则无需多言,直接进入fastboot,然后一顿fastboot flash boot boot.img
即可。注意刷入的slot是否为当前active的。
相关问题解决方案
如果是使用完整AOSP构建的,只要是流程正确,一般来说是不会出错的。如果仅clone下来kernel则会遇到一些问题,这些问题下面进行解析。
TODO 有空再写。