Návod jak na Android cross-compiling

Filed under Android
Tagged as , , , , , , , , , , , , , ,

Pokusím se zde vyjevit základní postup jak kompilovat (nejen) moduly pro Android. Pochopitelně tento postup není jediný možný a existuje mnoho variant téhož. Níže popsaný postup jsem použil já a dosáhl jsem uspěšného zavedení modulů na cílové platformě.

1. TOOLCHAIN

Nuže, nejprve budeme potřebovat takzvaný toolchain. Je to sada vývojových nástrojů, které dokaží kompilovat zdrojový kód pro cílový procesor na PC. Proto název cross ( křížová) compiling (kompilace). Jak zjistím jaký toolchain potřebuji? Bud použijte Google třeba už to někdo řešil a uspěl nebo zapátráte sami. Je třeba zjistit jaký procesor použivá Vaše zařízení a jakým kompilerem bylo jádro zkompilováno. Tady předpokládám že máte k dispozici linuxovou konzoli a že máte alespoň základní znalost linuxu. Spustťe na tabletu přikaz cat /proc/version. Dostanete něco takového:

Linux version 3.0.8+ (weny@Ingen-cross) (gcc version 4.5.1 (Sourcery G++ Lite 200.09-50 )  ) #47 PREEMPT Thu May 3 10:04:10 CST 2012

Co z toho vyčteme? Máme jádro 3.0.8+, kompilován byl pomocí gcc 4.5.1 . Pro ARM embedded systémy a to je většina tabletů s Androidem se používá tzv. ARM GNU EABI kompiler. To bude klíčové při hledání správného toolchainu. Opět použijme Všeználka pana Googla. Klíčová slova budou: “gcc 4.5” “gnu eabi” “linux” “arm” ještě můžete přidat distribuci linuxu který používáte na PC. To by spolehlivě mělo odkázat na některý balíček. Nainstalujte podle konkrétního návodu.

Pokud používáte Debian můžete ho sehnat zde: http://emdebian.org/crosstools.html nebo instalovat přímo z linuxu

apt-get install gcc-4.5-arm-linux-gnueabi (případně gcc-4.3 nebo 4.4)

apt-get install build-essential git

apt-get install u-boot-tools (pokud nenajde u-boot-tools zkuste uboot-mkimage)

2. KERNEL SOURCE TREE

Dalším krokem je sehnat zdroják k vašemu kernelu (source kernel tree). Víme tedy že sháníme kernel 3.0.8+, podle konkrétního tabletu najděte na internetu jaký SoC (system on chip) používá (např. Allwinner A10-A13, Rockchip, MediaTek atd…) seznam těch nejznámejších třeba zde. Hledání bych začal v repozitáři github. Jako klíčové slovo nedávejte celou verzi jádra, většínou se stejně do názvu dává jen 3.0 apod.

Pokud naleznete kernel na Gitu v linuxu ho stáhnete:

git clone https://github.com/název_kernelu.git

cd název_kernelu

git checkout název větve (branch) obyčejně to bývá Master

 

3. BUILD

Porozhlídněte se v tomto adresáři případně v adresáři scripts po scriptech nazívající se něco jako build.sh. Někdy tam může být build_název_zařízení.sh . Naleznete-li něco takového spustťe to. Tehle skriptík zařídí zpravidla vše od A-Z. Pokud chcete mít nad kompilací kontrolu čtěte dál.

Ještě než budeme pokračovat dál, chci zmínit jednu věc. Pokud plánujete experimentovat s různýmy konfiguracemi, například kompilovat moduly pro více tabletů, existuje parametr který způsobí, že se všechny generované soubory vytváří pod jeden Vámi určený adresář a zároveň se z tohoto adresáře načítá vlastní nastavení. Takto můžete vytvořit mnoho nezávislých variant zároveň. Při tomto způsobu kompilace musí zůstat základní adresářová struktura staženého kernelu čistá, jinak se kompilace nezdaří. Naproti tomu pokud chcete kompilovat jen jednu variantu nemusíte tento parametr uvádět a veškerá kompilace bude probíhat do základní struktury. Já preferuji 1. variantu a proto u všech příkazů make bude parametr O=adresář. (tedy kromě těch které mají pročistit základní adresářovou strukturu). Proto všechny konfigurační soubory dávejte právě do adresáře za parametrem O. Ti ostatní dávejte dávejte soubory přímo do adresáře “název_kernelu” nebo-li src tree.

Vytvořte adresář kam kompiler bude ukládat výsledky, tedy ten co uvedete za parametr O. Já vyberu třeba název TABLET_A.

 

4. CONFIG

Pokud jste nenašli skript alá build.sh bude třeba konfigurovat kernel jinak. Nejprve se podívejte do adresáře ./arch/arm/configs, bude tam pravděpodobně spousta souborů něco_defconfig. Pokuste se nalézt nějaký nesoucí název Vašeho zařízení. Našli jste-li ho,  zkopírujte ho do adresáře TABLET_A a změnte mu jméno na .config . Pokud jste nic takového nenašli vyberete nějaký generický config a upravíme si ho později. Ještě existuje způsob jak přečíst config z Vašeho tabletu, ale né vždy to jde. Více v článku Extrahujeme Module.symvers a config.  Abychom kernel správně nakonfigurovali potřebujeme zjistit pár informací. Najděte na tabletu jakýkoliv modul, u mě jsou v adresáři /system/vendor/modules a spustťe příkaz

modinfo modul.ko | grep vermagic

dostanete něco jako:

vermagic: 3.0.8+ SMP preempt mod_unload modversion ARMv7

a přesně tohle musí vypisovat vámi zkompilované moduly, jinak je kernel odmítne načíst. Pro tuto chvíli toto stačí vrátíme se k vermagicu v následující kapitole.

5. MAKE

Nastavíme  několik proměných které nastaví kompiler na náš toolchain a architekturu. Přizpůsobte Vašim potřebám. Já u sebe mám.

Nejprve pro jistotu vyčistíme základní src tree. Ujistěte se, že jste v základním adresáři src tree a spusťte:

make mrproper

poznámka: od teď už musíte vždy uvádět u příkazu make parametr O.

pokud potřebujete upravit konfiguraci kernelu pokračujte příkazem. Ostatní mohou přeskočit.

make O=TABLET_A menuconfig

Objeví se dialog kde můžete pozměňovat konfiguraci. Zmíním se jen o pár duležitých nastaveních a to těch které mení vermagic (viz. kapitola 4) a nastavení modulů.

Pokud máte v vermagicu

SMP nastavte Kernel Features  —>Symmetric Multi-Processing

preempt nastavte Kernel Features  —>Preemption Model—>Preemptible Kernel (Low-Latency Desktop)

mod_unload nastavte Enable loadable module support  —>Module unloading

modversion nastavte  Enable loadable module support  —>Module versioning support

a pak samozřejmě záleží na Vás co všechno chcete nastavit, ještě zmíním menu kde se povolí kompilování modulů pro dvb tunery

Device Drivers  —> Multimedia support  —>DVB for Linux —>DVB/ATSC adapters  —>

 

Několik slov k souboru Module.symvers. Pokud hodláte kompilovat moduly, budete potřebovat správný Module.symvers. Ten vzniká při kompilaci kernelu a zjednodušeně řečeno “napovídá” kompilátoru jak správně propojit kernel a moduly. Pokud byste tedy kompilovali kernel a zároveň moduly, které byste následně nahráli do tabletu, nemusíte nic řešit. Co ale dělat, když do tabletu chcete přidat jen moduly? Kde vzít správný Module.symvers? No někteří výrobci tabletů tento soubor nechávají ve stejném adresáři s modulama. Koukněte se tam, pokud ho tam najdete máte o starost méně. Jen ho nakopírujte do adresáře TABLET_A a můžete začít vesele kompilovat moduly. Ti ostatní můžou použít návod Extrahujeme Module.symvers a config. Pokud Module.symvers nedodáte kompileru nebo bude špatný, kernel nenačte moduly.

Zazálohujte si někam soubor .config a  Module.symvers. Může se stát že ho nějaký proces přepíše nebo vymaže, třebas make O=TABLET_A clean to určitě udělá.

Pokud jste už dříve kompilovali proveďte právě make O=TABLET_A clean a obnovte .config a Module.symvers ze zálohy

začněte tímto příkazem, přichystá vše potřebné pro kompilaci

make O=TABLET_A  oldconfig prepare modules_prepare headers_install scripts

tímto příkazem zkompilujete moduly pod kernelem, které jste si povolili v configu, parametr M není nutný, chcete-li přeložit jenom určité moduly v nějakém adresáři, použijte ho

make O=TABLET_A M=/cesta_k_modulum modules

tímto příkazem nakopírujete zkompilované moduly do adresáře definovaného proměnou INSTALL_MOD_PATH

make O=TABLET_A modules_install

tímto příkazem zkompilujete kernel image

make O=TABLET_A zImage uImage bzImage

tímto příkazem zjistíte další možnosti příkazu make

make O=TABLET_A help

 

 6. ZÁVĚR

Před nahráním modulů do tabletu zjistěte příkazem modinfo názevmodulu.ko zda-li mají shodný vermagic s kernelem. Pokud ne, něco jste měli špatně nastavené a musíte nastavení opravit a zkompilovat moduly znovu.

 

Přeji úspěšnou kompilaci.

 

Z těhto zdrojů jsem čerpal:

http://rhombus-tech.net/allwinner_a10/kernel_compile/

 http://glandium.org/blog/?p=2664

https://www.kernel.org/doc/Documentation/kbuild/modules.txt

 

 

 

 

Post a Comment

Your email is never published nor shared.