• 使用docker简单编译k20pro内核


    🚀 优质资源分享 🚀

    学习路线指引(点击解锁) 知识定位 人群定位
    🧡 Python实战微信订餐小程序 🧡 进阶级 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
    💛Python量化交易实战💛 入门级 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

    简介

    本文将介绍一下如何使用docker编译红米k20pro的内核。作者当时尝试构建内核的原因是为了将3年前(好像是吧)购买的k20pro至尊版(已退役,12GB内存,512GB硬盘)制作成一个小的服务器。而如果只有安卓系统,实在是过于简陋,因此作者想在该机器上安装docker以扩展到更加完整的功能。

    本人参考的教程有以下两个:CGCL-codes/Android-ContainerDocker 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
    
    
    • 1
    • 2

    为了节省时间,作者指定了depth深度为1,并选择miui分支。这里也为后来的编译埋下了一个小坑,如果想避免这个坑,可以选择深度为2。

    然后接下来可以在源码目录中执行

    git submodule update --init
    
    
    • 1
    • 2

    克隆所有的子仓库,主要是因为这个内核中使用了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 "," -)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    $(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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    这里会使用默认的配置覆盖我们使用的配置,为了解决这个问题,我们可以这两行(实际上应该修改一行就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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    编译环境(构建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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    首先是对应的编译器下载地址clang-4891093.tar.gzpie-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&
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
  • 相关阅读:
    Visual Studio Code 实用快捷键
    unity 安卓端使用JSON(LitJson)
    Java中的锁
    P6774 [NOI2020] 时代的眼泪(分块)
    话费充值API
    vue3 自定义Hooks
    【Linux】vim及gcc/g++的使用
    正则表达式
    世界上只有一种共识算法,那就是Paxos
    Java基础 | Stream流原理与用法总结
  • 原文地址:https://blog.csdn.net/u013190417/article/details/126446663