<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>内核 on LiaoKe的个人博客</title>
        <link>https://blog.liao-ke.com/tags/%E5%86%85%E6%A0%B8/</link>
        <description>Recent content in 内核 on LiaoKe的个人博客</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh</language>
        <lastBuildDate>Tue, 30 Jun 2026 16:31:22 +0800</lastBuildDate><atom:link href="https://blog.liao-ke.com/tags/%E5%86%85%E6%A0%B8/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>学习笔记 | GKI 内核不完全编译实战</title>
            <link>https://blog.liao-ke.com/p/android-gki-kernel-compile/</link>
            <pubDate>Fri, 05 Dec 2025 00:00:00 +0000</pubDate>
            <guid>https://blog.liao-ke.com/p/android-gki-kernel-compile/</guid>
            <description>&lt;h1 id=&#34;android内核编译&#34;&gt;Android内核编译&#xA;&lt;/h1&gt;&lt;p&gt;&lt;strong&gt;以编译5.10以上的内核为例,所需资源:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;一台配置较好的电脑&lt;/li&gt;&#xA;&lt;li&gt;linux系统&lt;/li&gt;&#xA;&lt;li&gt;内核源代码&lt;/li&gt;&#xA;&lt;li&gt;编译链工具&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;linux系统&#34;&gt;linux系统&#xA;&lt;/h2&gt;&lt;ul&gt;&#xA;&lt;li&gt;各大Linux系统(Ubuntu系/arch系/fedora系/Wsl2)都可以，网上教程多以Ubuntu lts版本为例(&lt;strong&gt;便于找依赖和教程&lt;/strong&gt;)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;内核源代码&#34;&gt;内核源代码&#xA;&lt;/h2&gt;&lt;p&gt;从github上搜索自己机型的内核源代码&lt;br&gt;&#xA;如&lt;code&gt;https://github.com/Evolution-X-Devices/kernel_xiaomi_sm8450&lt;/code&gt;(&lt;strong&gt;项目名一般采用   kernel_厂家名_芯片组代号   的形式,5.10之后都是gki内核,所以内核名称基本是以芯片组命名如sm8450,有些项目也可能是按机型代号命名，而不是芯片组&lt;/strong&gt;)&lt;/p&gt;&#xA;&lt;h2 id=&#34;编译链工具&#34;&gt;编译链工具&#xA;&lt;/h2&gt;&lt;p&gt;5.10以上的内核一般采用纯clang/llvm进行编译(低版本内核也可尝试，但有可能能成功编译但会开不了机)&lt;/p&gt;&#xA;&lt;h3 id=&#34;clangllvm&#34;&gt;Clang/llvm&#xA;&lt;/h3&gt;&lt;p&gt;Clang 一般情况下采用的是&lt;a class=&#34;link&#34; href=&#34;https://android.googlesource.com/platform/prebuilts/clang/host/linux-x86/&amp;#43;/refs/heads/main&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;google&lt;/a&gt;的正式分支,也可以采用&lt;a class=&#34;link&#34; href=&#34;https://android.googlesource.com/platform/prebuilts/clang/host/linux-x86/&amp;#43;/refs/heads/mirror-goog-main-prebuilts&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;测试分支&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;编译过程&#34;&gt;编译过程&#xA;&lt;/h2&gt;&lt;h3 id=&#34;更新环境依赖&#34;&gt;更新环境依赖&#xA;&lt;/h3&gt;&lt;p&gt;以Ubuntu24.04为例,执行以下命令安装依赖&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc tar xz-utils cpio findutils&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;h3 id=&#34;克隆内核源代码和编译链工具&#34;&gt;克隆内核源代码和编译链工具&#xA;&lt;/h3&gt;&lt;p&gt;内核:&lt;code&gt;git clone https://github.com/Evolution-X-Devices/kernel_xiaomi_sm8450.git --depth=1&lt;/code&gt;&lt;br&gt;&#xA;编译链工具:&lt;code&gt;git clone https://android.googlesource.com/platform/prebuilts/clang/host/linux-x86.git --depth=1&lt;/code&gt;&lt;br&gt;&#xA;&lt;strong&gt;depth=1&lt;/strong&gt;只拉取文件，不拉取历史提交，可以极大减少下载时间&lt;br&gt;&#xA;如果想拉取其他的测试分支，也可以在后面加&lt;code&gt;-b 测试分支名字&lt;/code&gt;&lt;br&gt;&#xA;如拉取测试版的编译链则添加&lt;code&gt;-b mirror-goog-main-prebuilts&lt;/code&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;设置环境变量&#34;&gt;设置环境变量&#xA;&lt;/h3&gt;&lt;p&gt;注:&lt;code&gt;以下操作需要在同一个终端环境下执行，因为添加的变量是临时变量&lt;/code&gt;&lt;br&gt;&#xA;此时在你的工作目录下面应该会有两个文件夹，一是&lt;code&gt;内核文件夹&lt;/code&gt;，二是&lt;code&gt;编译链工具文件夹&lt;/code&gt;&lt;br&gt;&#xA;打开终端,执行&lt;code&gt;cd 编译链工具文件夹路径&lt;/code&gt;,当前目录下应该会有若干个&lt;code&gt;clang-rxxxx&lt;/code&gt;子文件夹，选择后缀数字最大的最新版本即可,将它下面的/bin添加到环境变量中&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$PATH&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;:/../../编译链工具文件夹/clang-rxxxx/bin&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;然后再&lt;code&gt;cd 内核源代码文件夹&lt;/code&gt;&lt;br&gt;&#xA;设置编译环境变量&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;ARCH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;arm64&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;SUBARCH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;arm64&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;CC&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;clang&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;LLVM&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;LLVM_IAS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;HOSTCC&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;clang&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;LD&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;ld.lld&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;CLANG_TRIPLE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;aarch64-linux-gnu-&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;如果电脑的内存不太够，可以额外设置&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;LTO&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;thin&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;h3 id=&#34;执行编译命令&#34;&gt;执行编译命令&#xA;&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;make &lt;span class=&#34;nv&#34;&gt;ARCH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;arm64&amp;#34;&lt;/span&gt; gki_defconfig&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;make -j&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;nproc --all&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;第一行命令是加载配置文件gki_defconfig,他所在的目录是&lt;code&gt;/内核源代码/arch/arm64/configs/gki_defconfig&lt;/code&gt;（可以自行修改里面的配置项）&lt;br&gt;&#xA;编译出来的内核二进制文件会在&lt;code&gt;/内核源代码/arch/arm64/boot/Image&lt;/code&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;打包内核&#34;&gt;打包内核&#xA;&lt;/h2&gt;&lt;p&gt;由于没有编译kernel-devicetree,也没ramdisk,所以无法和内核二进制文件打包成boot.img刷入手机分区(也可以用magiskboot把手机原本的boot.img进行解包，把其中的内核二进制文件替换之后,再打包就行了)&lt;br&gt;&#xA;这个时候就需要&lt;a class=&#34;link&#34; href=&#34;https://github.com/osm0sis/AnyKernel3&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;AnyKernel3&lt;/a&gt;对内核二进制文件进行打包&lt;br&gt;&#xA;详细教程参考&lt;br&gt;&#xA;&lt;a class=&#34;link&#34; href=&#34;https://github.com/tiann/KernelSU/discussions/952&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://github.com/tiann/KernelSU/discussions/952&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;刷入内核&#34;&gt;刷入内核&#xA;&lt;/h2&gt;&lt;p&gt;可以在twrp或一些用于刷写内核的app中刷入打包后的AnyKernel3.zip&lt;/p&gt;&#xA;&lt;h2 id=&#34;注意&#34;&gt;注意&#xA;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;不同型号内核以及不同版本的编译器，可能对依赖和代码语法要求也有所不同，需要自行解决。&lt;/strong&gt;&lt;/p&gt;&#xA;</description>
        </item></channel>
</rss>
