top of page

Cum sa iti compilezi propriul android kernel pentru arm64 (noobs friendly)

Updated: Jul 30, 2019

Ce este un kernel? Pe scurt, inima unui sistem de operare. Kernelul Androidului este bazat pe Linux. Astfel, daca vrei sa compilezi un kernel, trebuie s-o faci de pe o distributie Linux (pasii din acest articol se aplica pentru Ubuntu).


In primul rand, de ce ai vrea asta? Ca sa adaugi functii noi, precum suport pentru diferite adaptoare usb wifi, selectarea guvernatorului prestabilit pentru cpu, adaugarea unor guvernatori noi etc. (mentionez ca in acest articol nu arat cum sa adaugi asemenea functii, fiindca difera de la kernel la kernel. In plus, exista numeroase alte tutoriale despre doar acest lucru, cateva dintre ele pe care le voi lasa la sfarsitul articolului).


Scopul acestui articol este sa ii ajute pe oamenii care nu stiu cum sa-si compileze propriul kernel.



Hai sa incepem:


1) In primul rand, ne trebuie un mediu Linux in care sa lucram (Ubuntu in acest caz). Daca ai Windows, poti incerca WSL (Windows Subsystem Linux), insa recomand o masina virtuala, pentru a avea o interfata grafica. Daca ai deja Ubuntu instalat, si mai bine, o sa stai mai putin timp la compilare.

Setarea masinii virtuale nu este una universala, insa recomand VirtualBox, deoarece e gratuit (https://download.virtualbox.org/virtualbox/6.0.10/VirtualBox-6.0.10-132072-Win.exe).


Daca ai deja un mediu Ubuntu, treci la urmatorul pas; aici ai comenzile pentru a rezolva dependentele:


sudo apt-get update && sudo apt-get upgrade”;


sudo apt-get install git ccache automake lzop bison gperf build-essential zip curl zlib1g-dev zlib1g-dev:i386 g++-multilib python-networkx libxml2-utils bzip2 libbz2-dev libbz2-1.0 libghc-bzlib-dev squashfs-tools pngcrush schedtool dpkg-dev liblz4-tool make optipng”;


Odata ce ai instalat Virtualbox, adauga o masina virtuala noua (Add) si selecteaza fisierul .vdi din linkul urmator: “https://drive.google.com/open?id=1UtJgdy_ndopPXC9FnS0PBIECSezCrD3c“. (nota: masina virtuala are Ubuntu x86-64 instalat, asa ca ai nevoie de suport pentru emulare din bios activat + un procesor x86-64)



Dupa aceea, acceseaza setarile masinii – System – Base Memory --- selecteaza cat mai multa memorie posibil.

Apasa ok si porneste masina. Parola utilizatorului de root si tech este “qwertyuiop” (fara “ evident).

(nota: Masina virtuala are deja toate dependentele instalate)



2) Trebuie sa faci rost de sursa kernelului tau. Pe asta o poti gasi pe github, xda-developers etc. In final, vei avea un fisier *.tar.gz sau asemanator. Extrage-l si vei obtine un folder cu sursa kernelului. (iti recomand sa-l extragi intr-un folder de pe desktop numit Kernel, astfel incat structura folderului de lucru este ./Kernel/{kernel folder}/{fisierele kernelului})


De asemenea, noi vrem sa compilam pentru un procesor arm64. Calculatorul de pe care compilezi are arhitectura x86-64, astfel incat un program compilat pentru x86-64 nu va functiona pe un procesor arm64. De aceea, apare ideea de cross-compiler. Un cross-compiler iti ofera posibilitatea de a compila un program de pe un procesor cu arhitectura diferita decat cea pentru care compileaza, folosind un set de unelte specific (toolchain)


Desi Android GCC 4.9 este putin cam vechi, si este si scos din uz de catre Google, isi va face treaba pentru ce vrem sa facem acum. Ai aici un link pentru el: “https://drive.google.com/open?id=17kIJ_imOnbC9bC2oqRCl-B5Ibyf3ujuX“.

De asemenea, iti recomand sa extragi fisierele arhivei intr-un folder numit ./Kernel/android-gcc/ .

Acum structura folderului ./Kernel arata astfel:


Kernel

|

+-- android-gcc

| |

| +-- {fisiere}

|

+-- kernel_name

|

+-- {fisiere}


(nota: Masina virtuala are deja folderul Kernel cu android-gcc acolo, trebuie doar sa pui sursa kernelului in folderul kernel_name )



3) Acum ca avem un mediu gata pentru a compila kernele, deschide un terminal in kernel_name (click dreapta - “open in terminal”)


Introdu urmatoarele comenzi, apasand enter intre ele:


export CROSS_COMPILE=../android-gcc/bin/aarch64-linux-android- && export ARCH=arm64 && export SUBARCH=arm64”;

/*

*

*

UPDATE: un alt compilator bun este cel oferit de Ubuntu in sine; il poti obtine astfel:

sudo apt-get install gcc-aarch64-linux-gnu”;


Pentru a-l folosi, ruleaza in loc de comanda de mai sus urmatoarea:

export CROSS_COMPILE=aarch64-linux-gnu- && export ARCH=arm64 && export SUBARCH=arm64

*

*

/*


make clean && make mrproper”;




4) Pentru a compila kernelul, ai nevoie de un fisier .config . Acesta poate fi obtinut prin mai multe modalitati, insa cea mai simpla este sa folosim unul deja prezent in sursa kernelului. Astfel, uita-te in ./kernel_name/arch/arm64/configs/ si uita-te dupa codul de nume al telefonului tau. (exemplu: exynos7880-a5y17lte_eur_defconfig). Odata ce l-ai gasit, in terminal, scrie urmatoarea comanda:


make {defconfig-name}

ex: make exynos7880-a5y17lte_eur_defconfig



5*) Daca vrei sa te joci cu alte optiuni, scrie “make menuconfig”, si dupa ce ai terminat, salveaza noul .config.



5) Acum este timpul sa compilezi kernelul; scrie urmatoarea comanda:


make


Tine cont ca poate lua foarte mult timp, mai ales daca o faci pe o masina virtuala, asa ca poti rula urmatoarea comanda in loc de aceea pentru a grabi procesul:


make -j$(nproc)



6) Instalarea kernelului nou


Daca nu ai avut parte de erori, o imagine ti s-a construit in ./kernel_name/arch/arm64/boot/Image sau ceva de genul. Ideea e ca ce vrem noi e acel “Image




Kernelul se afla in partitia de boot a telefonului tau, asa ca trebuie sa faci rost de boot.img ul telefonului. O metoda este de a extrage imaginea cu dd in TWRP din “/dev/block/platform/{un folder}/by-name/BOOT” (de mentionat ca aceasta metoda functioneaza doar daca imaginea boot este intacta, aka nu ai facut root), insa cel mai usor este sa fi instalat la un moment dat Magisk in TWRP, deoarece Magisk face un backup la imaginea boot in "/data/stock_boot_{cifre si litere}.img.gz" . Il poti extrage de acolo cu TWRP in memoria interna, si de acolo in calculator cu un cablu usb. Dupa aceea extragi imaginea .img din fisierul .gz, redenumesti fisierul in boot.img si gata.


Exista si alte metode pentru a obtine fisierul boot.img, insa, odata ce l-ai obtinut, pune-l in folderul CarlivImageKitchen de pe desktop, folder ce il poti gasi in arhiva de pe linkul “https://drive.google.com/open?id=1b4Hro0QRDWmkbKbMvIyE2Cz4-guO1Pfx“. (nota: pe masina virtuala, folderul exista deja si este functional)


Problema este ca scriptul “repack_img” functioneaza doar daca are locatia corecta a uneltelor. Astfel, deschide repack_img intr-un text editor si editeaza oriunde gasesti “zero_cool” cu numele utilizatorului tau (nota: pe masina virtuala, numele a fost deja editat).


De asemenea, nu uita sa faci un terminal in folderul CarlivImageKitchen si sa faci utilizatorul curent detinatorul programelor (“sudo chown {nume utilizator} *”) si sa faci programele executabile (“chmod 755 *”) (lucru facut deja pe masina virtuala)


Acum ca avem boot.img in folder si un terminal deschis acolo, ruleaza “./unpack_img boot.img”.





O sa iti apara dupa un folder numit “boot”. Intra in el, si acolo vei gasi un fisier numit “boot.img-kernel”. Asta e kernelul actual! Trebuie sa-l inlocuiesti cu noua ta imagine din sursa kernelului tau (“./Kernel/kernel_name/arch/arm64/boot/Image”).

Astfel, redenumeste fisierul “Image” in “ boot.img-kernel”, dupa care inlocuieste-l pe cel vechi.


Dupa aceea, in terminalul deschis in CarlivImageKitchen, scrie “./repack_img boot”, si introdu un nume nou fisierului de boot, precum “boot-nou”, si ai obtinut un boot-nou.img cu propriul kernel!





Tot ce trebuie sa faci acum este sa il pui in memoria interna a telefonului, iar in twrp sa-l instalezi ca fisier img in boot.


Daca nu apar erori, iar telefonul se aprinde, ai sa vezi ca in About Phone/Software Info/Kernel Version, va scrie data si ora la care a fost facut kernelul de tine.



Linkuri pentru a adauga functii nou in kernel:

https://riptutorial.com/android/example/28283/how-to-add-a-cpu-governor

https://www.xda-developers.com/simple-guide-shows-you-how-to-cherry-pick-useful-features-directly-from-gerrit/



Sper ca te-am ajutat sa-ti compilezi un kernel, si nu uita sa apreciezi postarea daca te-a ajutat.

Comments


Subscribe Form

©2019 by TechOS. Proudly created with Wix.com

bottom of page