How to Build Linux Kernel with Android
This guide shows how to build Linux on a Android Device and was made for people that doesn't have s Computer.
- 4GB of free space (2GB if delete the temp files)
- Android 5.0
You need to install Termux from Google Play Store. Now we will download the Kernel so we need WGET:
apt-get update &&
apt-get --assume-yes install wget &&
cd ~ &&
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.4.6.tar.xz
The next step is decompress that tarball with UNXZ and TAR (integrated with Termux):
unzx -d linux-5.4.6.tar.xz &&
tar -xf linux-5.4.6.tar
(Optional) Delete the Linux tarball:
rm linux-5.4.6.tar
Now we have the Linux Source on our Android, lets compile!
In Android, compile is a terror for Linux Kernel. First we need to create a config file.
If you had an Linux PC you could simply do this:
cp /boot/config-$(uname -r) linux-5.4.6/.config
But you dont have, so we need to do this:
If you have a Rooted Potato Phone you can simply:
cp /proc/config.gz ~ &&
gzip -d config.gz &&
mv config linux-5.4.6/.config &&
cd linux-5.46
If else, first you need to download it from our repository:
wget https://eduapps-cdg.github.io/kernel-configs/raw/master/android/$(getprop | grep -i ro.product.model | sed "s/\[ro.product.model\]: //" | sed "s/\[//" | sed "s/\]//").gz &&
mv $(getprop | grep -i ro.product.model | sed "s/\[ro.product.model\]: //" | sed "s/\[//" | sed "s/\]//").gz config.gz &&
gzip -d config.gz &&
mv config linux-5.4.6/.config &&
cd linux-5.46
If the file was not found, you must generate it. It has only one command, but this command is the worst! It's the best choice if you are developing a new device. Complete the first command of Building and type:
make menuconfig
Once solved the dilemma, you will not need to do it again. the next step is install the compilers:
apt-get install build-essential ncurses bison flex openssl libelf clang
This command will setup to build the Kernel with full power, if you have a single core device, it doesn't help so much but works:
make -j $(nproc)
make modules_install
make install
And finally, the Last Step is: Enjoy the building time and drink a coffee!
I modified the above guide to fit my device. Hopefully this helps someone, such as @cursedastronaut
January 2025 update: I was able to compile a LineageOS kernel for android on Windows using Ubuntu WSL by following these steps:
Step 1: https://xdaforums.com/t/my-unsuccessful-journey-in-compiling-an-android-kernel-for-the-moto-g-power-2021.4714492/post-89917726
Step 2: https://xdaforums.com/t/my-unsuccessful-journey-in-compiling-an-android-kernel-for-the-moto-g-power-2021.4714492/post-89914796
How to Build a Linux Kernel on Android
I am not responsible for anything that happens. Bricked devices, etc. Use at your own risk.
edit: Before you begin, please backup your stock rom using a tool like Motorola Software Fix or https://mirrors.lolinet.com/
Install F-Droid
Install Termux through F-Droid
January 2025 update: I suggest using Ubuntu chroot instead of Alpine chroot.
Termux:
acquire wakelock through the notification, and then:
Enter new password:
Retype new password:
Within the file, find
#Port 8022
uncomment it and put any port you want.
Within the file, find
#ListenAddress 0.0.0.0
uncomment it
ctrl o to write file
ctrl x to exit nano
My ip is 192.168.1.166
Windows: Download putty and ssh into phone via internal ip
example: 192.168.1.166 port 8022
Putty:
$ pkg install screen
edit the 2nd line so that it says ./bin/sh instead of /bin/sh
$ nano start.sh
$ nano continue.sh
alpine chroot:
last build for linux kernel 5.x according to: https://en.wikipedia.org/wiki/Linux_kernel_version_history
make config options can be found here: https://docs.kernel.org/kbuild/kconfig.html
options are such as: make defconfig, make allmodconfig, make allyesconfig, etc
I found borneo-defaultconfig for my phone in kernel-msm-MMI-RZBS31.Q2-143-27-13\arch\arm64\configs\vendor\ext_config\borneo-default.config and was able to cp it to borneo_defconfig in necessary folders. https://github.com/MotorolaMobilityLLC/kernel-msm/releases/tag/MMI-RZBS31.Q2-143-27-13
Similar config files options exist for other phones in kernel repositories for those phones.
use arrow keys, space to highlight, and enter to confirm
$ exit
# to return to termux outside of alpine$ nano build.sh
do not replace image_name with an image name, instead leave it as is.
save and close nano with:
ctrl o
ctrl x
ctrl a d to close screen and let it run in the background
screen -xS kernelMake
to get back into the kernel making script
DO NOT USE KERNEL FLASHER APP TO FLASH YOUR KERNEL OR YOU MIGHT BRICK YOUR DEVICE.
ONLY USE IT FOR KERNEL BACKUPS
$ cp Image.gz ~/workingdir
Open Ex Kernel Manager App on your android phone
Go to tools -> Kernel backup
Backup your active boot img to your Download folder
Name it flashedboot.img or something
Go back to putty or termux:
This guide helped me find my ramdisk offsets and such:
https://xdaforums.com/t/tutorial-kernel-post-compilation-guide-how-to-turn-kernel-into-img.3604083/
When using Android Image Kitchen, I found it easier to use on windows than on linux. And transfer files with localsend.
$ cp boot-new.img ~/storage/shared/Download
Move the file boot-new.img from your Android smartphone to your Windows desktop.
Reboot your phone into fastboot mode (device specific, google for instructions)
Install adb tools on your windows desktop and add C;/tools/adb to your windows system environment variables path.
cmd.exe
I had to use:
Your boot_a and boot_b partition names might vary and which img to use for which one might vary.
To unbrick:
Troubleshooting:
module.order error:
submake error:
gimple build error:
bcmp or memcmp error:
no operating system found:
verify kernel version:
$ uname -mrs