Android カーネルのコンパイル チュートリアル (2023,6,13)

Android カーネルをコンパイルする前に準備するもの。

  1. ブートローダーのロック解除をサポートする電話機
  2. 公式のオープンソース アドレスでも、サードパーティが統合したアドレスでも問題ありません
  3. Linux環境、仮想マシン、wsl、termuxなどが利用可能
  4. 中国語が読める

始めましょう!

1. 携帯電話から /proc/config.gz パスにある config.gz ファイルを抽出します。このファイルは携帯電話カーネルを構築するための構成ファイルです。このデフォルトは公式です。そのようなファイルがない場合は、 boot.img を解凍して取得する必要があります。これについては後で説明します。

2. 公式のオープンソース カーネル ソース コードとデバイス ツリーをプルします (Android 9 以降では、デフォルトでカーネルのみがオープンソースとなり、デバイス ツリーはオープンされなくなります)。

  1. Xiaomi オープンソースアドレス、Motorolaオープンソース アドレスRealme mobile オープンソース アドレスなど、ブランド公式からオープン ソース コードを入手しますソースコードをローカルにプルします。

  2. 公式のものを使用したくないが、LineageOSなどのサードパーティ製のものを使用したい場合は、Crdroidも問題ありません。

  3. 公式のオープンソースやサードパーティの公式サポートがない場合は、それを読んだり、トラフィックやバッテリーを節約したり、その他のことをする必要はありません。

#git拉取示例
#--depth=1代表只拉取最新的源码,可以极大减少拉取后的体积,缩减拉取时间
git clone --depth=1 https://github.com/ProjectBlaze-Devices/kernel_xiaomi_chime

3. 基本的なビルド環境を構成します。
1. Linux環境をインストールします。(wsl、vm仮想マシン、二系物理マシンのLinuxは全て利用可能です)
2. コンパイルツールをインストールします。
Debian シリーズ: (Ubuntu、Linux mint、Ubuntu Kylin、Uos、termux を含む)

#Debian系列:
apt-get install -y bc bison build-essential ccache curl flex g++-multilib gcc-multilib git git-lfs gnupg gperf imagemagick
lib32ncurses5-dev lib32readline-dev lib32z1-dev libelf-dev liblz4-tool libncurses5 libncurses5-dev
libsdl1.2-dev libssl-dev libxml2 libxml2-utils lzop pngcrush rsync
schedtool squashfs-tools xsltproc
zip zlib1g-dev

ArchLinuxシリーズ

pacman -Syu git
cd ~ 
git clone https://aur.archlinux.org/aosp-devel.git
cd aosp-devel
makepkg -si

他のシリーズの場合は、対応するツールのインストールを自分で見つけてください。

3. カーネル コンパイル ツールをプルします (基本的なビルド環境をインストールしたばかりです。このコンパイル ツールがハイライトです。Android カーネルを構築するツールは Android ソース コードからのみプルできます。また、バージョン制限があり、新しすぎるものは使用できません)動作します、古すぎると動作しませんいいえ)

  1. LineageOS の GitHub 公式ウェアハウスに直接アクセスしてプルします
#官方GitHub拉取
git clone https://github.com/LineageOS/android_prebuilts_clang_kernel_linux-x86_clang-r416183b

#国内gitee拉取
git clone https://gitee.com/SorryMyLife/android_prebuilts_clang_kernel_linux-x86_clang-r416183b

#如果你还需要GCC进行编译,那么就拉取这个
#arm64
git clone https://github.com/LineageOS/android_prebuilts_gcc_linux-x86_aarch64_aarch64-linux-android-4.9

#国内gitee

git clone https://gitee.com/SorryMyLife/android_prebuilts_gcc_linux-x86_aarch64_aarch64-linux-android-4.9

#arm32
git clone https://github.com/LineageOS/android_prebuilts_gcc_linux-x86_arm_arm-linux-androideabi-4.9

#国内gitee
git clone https://gitee.com/SorryMyLife/android_prebuilts_gcc_linux-x86_arm_arm-linux-androideabi-4.9
  1. Google ソースの公式プルに移動

    才能があるなら、直接 Google にアクセスしてください

#arm64的gcc
git clone https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9

#arm32的gcc
git clone https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9

#arm64的clang
git clone https://android.googlesource.com/platform/prebuilts/clang/host/linux-x86

国内暫定解決策

git config --global url."https://mirrors.tuna.tsinghua.edu.cn/git/AOSP".insteadOf https://android.googlesource.com

#arm64的gcc
git clone https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9

#上面配置完后,再拉取下面的代码,就可以了

#arm32的gcc
git clone https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9

#arm64的clang
git clone https://android.googlesource.com/platform/prebuilts/clang/host/linux-x86

4. カーネルソースコードの構築を開始する

  1. まずカーネルのソース コードに移動して、構成ファイルがあるかどうかを確認します。
cd 你的内核源码文件夹/arch/你的设备架构/configs/

一般的な設定ファイルはここにあり、デバイスのコード名に基づいて名前が付けられます。たとえば、携帯電話のコード名 (コードネーム) がライムの場合、ライム文字の設定ファイルがこの場所にあります。

cd 你的内核源码文件夹/arch/你的设备架构/configs/vendor/

一部はこのパスの下のベンダー フォルダーにあります

コードネームチャイムというデバイスの(アクセスできない可能性があります。才能のある人を参加させるのが最善です)

構成ファイルが含まれていない場合は、公式ブートから構成ファイルを抽出し、まずデバイスからブート パーティションをダウンロードまたは抽出し、それを Linux 環境にアップロードし、カーネル ソース コードに cd して、スクリプトを実行する必要があります。構成情報を抽出するための extract-ikconfig ツール。

cd 你的内核源码路径
./scripts/extract-ikconfig 你的boot分区文件路径 >> device_config
cp device_config arch/你的设备cpu架构/configs/你的设备代号名称_config
#或者这样
cp device_config arch/你的设备cpu架构/configs/temp_config
#取一个临时的名字

2. 構成ファイルを解決した後、カーネルの構築を開始します。

cd 你的内核源码路径
#告诉编译器你构建的是arm64的内核,如果你不是64位的,那就把64删掉
export ARCH=arm64
export SUBARCH=arm64

#配置之前同步好的内核编译器环境变量,让当前环境可以直接使用
#/home/sir/pstar/kernel/clang是clang编译器的路径
#它下面的bin则是可执行二进制文件存放的文件夹,我们需要调用这个里面的程序来开始构建内核
export PATH="/home/sir/pstar/kernel/clang/bin:/home/sir/pstar/kernel/gcc64/bin:/home/sir/pstar/kernel/gcc32/bin:$PATH"

args="-j$(nproc --all) \ #-j$(nproc --all)这里是说用当年环境下最高的cpu线程进行编译
ARCH=arm64 \ 
SUBARCH=arm64 \
O=out \ #输出路径是在当前位置的out文件夹
CC=clang \ #指定C语言文件编译器为clang
CROSS_COMPILE=aarch64-linux-android- \ #配置交叉编译的目标平台为arm64
CROSS_COMPILE_ARM32=arm-linux-androideabi- \ #配置32位交叉编译器
CLANG_TRIPLE=aarch64-linux-gnu- " #负责交叉编译的Linux编译器
#这个也不清楚干嘛用的,就是它在构建的时候,需要用到Linux的一些标准库内容
#但是安卓的编译器阉割了,直接用安卓的编译,会出现很多莫名其妙的错误,所以就需要再配置一下这个编译器了
#如果你的设备是32位的,这里也要修改的

#清理之前构建的残留内容
make clean && make mrproper
#删除out文件夹,也就是之前指定输出的文件夹
rm -rf out 
#新建out文件夹,用来保存临时产生的垃圾文件还有最终生成的内核文件
mkdir -p out

#先检测配置文件有没有问题,进行初次构建
make ${args} vendor/lineageos_pstar_defconfig 
#这里如果不加vendor,就会读取
#内核源码/arch/你的设备架构/configs/里面的配置文件
#这个完整路径为: 内核源码/arch/你的设备架构/configs/vendor/lineageos_pstar_defconfig 
#不加vendor的完整路径为:内核源码/arch/你的设备架构/configs/lineageos_pstar_defconfig 

#这里的args就是上面设置的临时变量args里面的内容
#开始构建内核
make ${args} 

3. ビルド カーネルにエラーがある場合は、Baidu を使用する代わりにGitHubにアクセスして検索する必要があります。

4. 完成したカーネル ファイルは次の場所に保存されます。

你的内核源码/out/arch/你的设备架构/boot/

終わり

参考記事:Xiaomi オープンソース Motorola オープンソース

おすすめ

転載: blog.csdn.net/sorry_my_life/article/details/131191804