🚀 优质资源分享 🚀
学习路线指引(点击解锁) | 知识定位 | 人群定位 |
---|---|---|
🧡 Python实战微信订餐小程序 🧡 | 进阶级 | 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 |
💛Python量化交易实战💛 | 入门级 | 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 |
简介
本文将介绍一下如何使用docker编译红米k20pro的内核。作者当时尝试构建内核的原因是为了将3年前(好像是吧)购买的k20pro至尊版(已退役,12GB内存,512GB硬盘)制作成一个小的服务器。而如果只有安卓系统,实在是过于简陋,因此作者想在该机器上安装docker以扩展到更加完整的功能。
本人参考的教程有以下两个:CGCL-codes/Android-Container和Docker on Android。这两个都是比较优秀的教程,前者的作者好像是国人,而且使用的也是k20pro(不愧是一代神机),但是使用的是安卓10的手机,并且指定了ROM。后者教程相对通用一些,建议可以两个教程结合一起看,求同存异。
本文的主要目的是为了记录一下自己编译内核时的过程和一些坑,避免大家重蹈覆辙。
本文编译使用的机器是centos 7,8核2.6GHz的AMD,16GB内存。k20pro使用基于安卓11的MIUI12.5稳定版。
Clone内核源码
内核源码的来源有很多,可以去小米的开源仓库中寻找,也可以去找其他大神的定制内核源码。我这里使用的是在XDA论坛找到的Marisa内核源码,这个内核支持各种超频,虽然我对于超频并没有什么兴趣。
首先我们将源码clone下来:
git clone https://github.com/Laulan56/android_kernel_xiaomi_sm8150.git --depth=1 -b miui
为了节省时间,作者指定了depth深度为1,并选择miui分支。这里也为后来的编译埋下了一个小坑,如果想避免这个坑,可以选择深度为2。
然后接下来可以在源码目录中执行
git submodule update --init
克隆所有的子仓库,主要是因为这个内核中使用了exfat,并引入了对应的子仓库,所以需要如此。
修改内核源码
实际上这个源码是可以直接编译成功的,但是因为我们有一些骚操作并且需要修改内核的编译配置,所以需要修改一定量的源码。
首先是由于clone深度只有1导致的一个问题。在drivers/staging/qcacld-3.0/Kbuild:3356
和第3363行。
CLD_IDS = $(shell cd "$(WLAN\_ROOT)" && \
git log -50 $(CLD_CHECKOUT)~..HEAD | \
sed -nE 's/^\s*Change-Id: (I[0-f]{10})[0-f]{30}\s*$$/\1/p' | \
paste -sd "," -)
CMN_CHECKOUT = $(shell cd "$(WLAN\_COMMON\_INC)" && \
git reflog | grep -vm1 "}: cherry-pick: " | grep -oE ^[0-f]+)
CMN_IDS = $(shell cd "$(WLAN\_COMMON\_INC)" && \
git log -50 $(CMN_CHECKOUT)~..HEAD | \
sed -nE 's/^\s*Change-Id: (I[0-f]{10})[0-f]{30}\s*$$/\1/p' | \
paste -sd "," -)
在$(CLD_CHECKOUT)
和$(CMN_CHECKOUT)
后有一个波浪号,这个是指代上一个commit,但是我们因为只clone了一个commit,所以历史记录上没有的。为了保证不报错,直接将波浪号去掉就好(如果clone的层级较深,可以不考虑这个)。
然后是在kernel/Makefile:124
和128行。
ifneq ($(CONFIG_MACH_XIAOMI_CEPHEUS),y)
$(obj)/config_data.gz: arch/arm64/configs/cepheus_stock_defconfig FORCE
endif
ifneq ($(CONFIG_MACH_XIAOMI_RAPHAEL),y)
$(obj)/config_data.gz: arch/arm64/configs/raphael_stock_defconfig FORCE
endif
这里会使用默认的配置覆盖我们使用的配置,为了解决这个问题,我们可以这两行(实际上应该修改一行就OK了)修改为
ifneq ($(CONFIG_MACH_XIAOMI_CEPHEUS),y)
$(obj)/config_data.gz: $(KCONFIG_CONFIG) FORCE
endif
ifneq ($(CONFIG_MACH_XIAOMI_RAPHAEL),y)
$(obj)/config_data.gz: $(KCONFIG_CONFIG) FORCE
endif
编译环境(构建docker)
作者是不建议在自己电脑上直接构造编译环境的,作者比较推荐使用docker进行编译环境的构造,docker可以尽可能的减少各个方面对编译的影响。实际上,Marisa内核源码中也有对于自己的编译镜像的构建,在.drone.yml中,有兴趣的可以参考这个进行镜像的构建,但是我当时因为时间原因,没有尝试。
作者使用的编译dockerfile,由于本人使用docker的时间也很短(实际上,就是为了编译内核特意学的),所以有很多不太合理的地方,大家可以自行修改。
FROM ubuntu:bionic
RUN echo "deb http://mirrors.tencent.com/ubuntu/ bionic main restricted universe multiverse" > /etc/apt/sources.list
RUN echo "deb http://mirrors.tencent.com/ubuntu/ bionic-security main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "deb http://mirrors.tencent.com/ubuntu/ bionic-updates main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "#deb http://mirrors.tencent.com/ubuntu/ bionic-proposed main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "#deb http://mirrors.tencent.com/ubuntu/ bionic-backports main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "deb-src http://mirrors.tencent.com/ubuntu/ bionic main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "deb-src http://mirrors.tencent.com/ubuntu/ bionic-security main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "deb-src http://mirrors.tencent.com/ubuntu/ bionic-updates main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "#deb-src http://mirrors.tencent.com/ubuntu/ bionic-proposed main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "#deb-src http://mirrors.tencent.com/ubuntu/ bionic-backports main restricted universe multiverse" >> /etc/apt/sources.list
RUN apt clean all
RUN apt update
RUN apt install -y bc bison build-essential ccache curl flex g++-multilib gcc-multilib git gnupg gperf imagemagick 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 unzip openjdk-8-jdk language-pack-zh-hans python cpio
COPY dtc /usr/bin/
RUN chmod +x /usr/bin/dtc
# 编译链
RUN mkdir -p /compile/src
ADD clang-4691093.tar.gz /compile/clang
ADD pie-release.tar.gz /compile/gcc
COPY build.sh /compile/src/
WORKDIR /compile/src
CMD bash build.sh
首先是对应的编译器下载地址clang-4891093.tar.gz和pie-release.tar.gz,dtc文件在这里下载[GUIDE] How To Compile Kernel & DTBO For Redmi K20 Pro,这些文件应该都要那啥才能下载。
还有我自己写的一个编译脚本。
export ARCH=arm64
export SUBARCH=arm64
export DTC_EXT=dtc
rm -rf /dst/out
cp -rf /dst/. /compile/src
mkdir out
make mrproper
make O=out ${CONFIG\_NAME}
export PATH="/compile/clang/bin:/compile/gcc/bin:${PATH}"
make -j8 O=out \
ARCH=arm64 \
CC=/compile/clang/bin/clang \
CLANG_TRIPLE&