본문 바로가기
IT

GCC와 CLANG을 이용해서 안드로이드 커널 빌드하기

by %? 2024. 10. 18.

옛날부터 올려야지~ 하고 있다가 이제서야 올립니다..

원래는 우분투 24.04 LTS 최신 버전에서 하고 싶었는데 python2가 설치가 안 되어서 22.04 LTS를 사용합니다.

개발 환경

  • 우분투 22.04 LTS AMD64
  • Docker, WSL2 등 상관X

// Install Packages
sudo apt install -y bc binutils-dev bison build-essential build-essential ca-certificates ca-certificates-java ccache clang cmake cmake curl file flex freeglut3-dev g++-aarch64-linux-gnu g++-arm-linux-gnueabi git gnupg gperf imagemagick lib32readline-dev lib32z1-dev libavcodec-dev libavformat-dev libavutil-dev libc++-dev libelf-dev libfreeimage-dev libgl-dev libglew-dev libglfw3-dev libglm-dev liblz4-dev liblz4-tool libmpv-dev libncurses5-dev libpulse-dev libpulse0 libsdl1.2-dev libsdl2-dev libssl-dev libswscale-dev libxcursor-dev libxi-dev libxinerama-dev libxml2 libxml2-utils libxrandr-dev libxxf86vm-dev lld lolcat lzop make mpv nano neofetch neovim net-tools ninja-build pigz pngcrush python-is-python3 python2 python3-dev repo rsync schedtool squashfs-tools texinfo u-boot-tools unzip vim wget xsltproc xz-utils zip zlib1g-dev zstd

// Setup Git
git config --global user.name "<username>"
git config --global user.email "<useremail>"

// Make Build Directory
mkdir gcc64
mkdir gcc32
mkdir clang
mkdir source

// Download && Unarchive Files
cd gcc64
wget https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/+archive/refs/heads/android12L-release.tar.gz
tar -xvf android12L-release.tar.gz

cd gcc32
wget https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/+archive/refs/heads/android12L-release.tar.gz
tar -xvf android12L-release.tar.gz

cd clang
wget https://android.googlesource.com/platform/prebuilts/clang/host/linux-x86/+archive/refs/heads/main/clang-r522817.tar.gz
tar -xvf clang-r522817.tar.gz

// Setup $PATH
cd
nvim .bashrc
```
export PATH="$HOME/gcc64/bin:$HOME/gcc32/bin:$HOME/clang/bin:$PATH"
```

source .bashrc

// Clone Kernel Source
cd source
git clone --depth=1 <Kenrel Source Git> <Name>
cd <Name>

// Edit defconfig
nvim arch/arm64/configs/<Device_defconfig>
```
// Example
CONFIG_LOCALVERSION="-Paiath"
```

// Build Kernel
make O=out <Device_defconfig>
make -j$(nproc --all) O=out CC=clang CLANG_TRIPLE=aarch64-linux-gnu- CROSS_COMPILE=aarch64-linux-android- CROSS_COMPILE_ARM32=arm-linux-androideabi-

// Kernel Locaction
out/arch/arm64/boot/Image.lz4-dtb

// Boot to Image.lz4-dtb
fastboot boot Image.lz4-dtb

저는 픽셀3의 PixelBuild 롬의 커널 소스를 이용하였고, defconfig은 다음과 같았습니다.

 

arch/arm64/configs/b1c1_defconfig

 

CLANG 같은 경우에는 2024-10-18 기준 안드로이드 V Release인 clang-r522817를 사용하였습니다.

GCC와 CLANG의 PATH는 당연히 원하시는 곳에 넣고 경로 지정만 잘 해주시면 됩니다.

Image.lz4-dtb에서 boot.img로 빌드하는 건 AOSP Tree를 이용한다는 것 같은데 아직 시도는 못 해봤습니다..

참고로 Image.lz4-dtb로 부팅하면 재부팅 시 원래 커널로 돌아가니 정말 커널 버전에 닉네임 남기는 용도 & 커널 빌드 시도 정도로만 생각하시면 될 것 같습니다.


Ubuntu version && Kernel images

 

Kernel version