Compilare Android: Compiliamo!

Aggiornamento 21/08 inserita soluzione al problema dello “skip” del SetupWizard

Seconda parte sulla compilazione fatta in casa di android direttamente dai sorgenti forniti da Google. Una volta che i sorgenti sono pronti possiamo procedere a compilare.

Kernel

Compiliamo il kernel con questi comandi, dobbiamo esportare delle variabili, da ora in poi per compilare conviene rimanere nello stesso terminale se non si vuole ri-esportare queste variabili.

cd ~/androidsource/kernel
export ARCH=arm
export CROSS_COMPILE=arm-eabi-
export PATH=$PATH:~/androidsource/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin
cp arch/arm/configs/msm_defconfig .config
make oldconfig && make

In questo modo si userà un config standard, un’alternativa potrebbe essere quella di prendere il config da un’altra rom, per esempio dalla Cyanogenmod (sempre che si abbia scelto di usare kernel 2.6.29). Ovviamente è possibile anche farsi un proprio config con make menuconfig

L’immagine del kernel risultante sarà in ~/androidsource/arch/arm/boot/zImage .

Wifi

Fortunatamente il modulo wlan.ko del wireless non è proprietario quindi possiamo compilarci una nostra versione per il nostro kernel.

cd ~/androidsource/system/wlan/ti/sta_dk_4_0_4_32
export KERNEL_DIR=~/androidsource/kernel/
make

copiamo il modulo al posto giusto sostituendo quello prercompilato

cp wlan.ko ~/androidsource/vendor/htc/sapphire/

Nota attualmente con kernel 2.6.29 in cupcake la compilazione del modulo wlan.ko fallisce, la soluzione è applicare questa patch:

cd ~/androidsource/
./repo download platform/system/wlan/ti 10344

Audio Files

I file audio come suonerie notifiche ecc… sono già presenti ma di default non vengono incluse nella build, per farlo basta rinomiare un file così

mv ~/androidsource/frameworks/base/data/sounds/OriginalAudio.mk ~/androidsource/frameworks/base/data/sounds/Android.mk

HTC Build Script

Nota: Per Eclair attualmente questo procedimento non funziona.

Lo script è già pronto se avete usato i miei file, bisogna solo scaricare gli apk di base per le applicazioni Google.

cd ~/androidsource/vendor
mkdir google
cd google
wget http://www.lorenzobraghetto.com/wp-content/uploads/extract-google-files.sh
chmod a+x extract-google-files.sh
./extract-google-files.sh

Lo script va eseguito sempre con il telefono attaccato, prenderà solo le applicazioni base di Google.

Sistema

Nota: Per Eclair guardare qua.

Siamo quasi pronti per dare il make finale, basta creare un nuovo file buildspec.mk in ~/androidsource e inserirci

TARGET_PRODUCT:=htc_sapp
TARGET_PREBUILT_KERNEL:=kernel/arch/arm/boot/zImage

In più ho notato un problemino di permessi con wpa_supplicant, per risolverli apriamo il file ~/androidsource/system/core/rootdir/init.rc e all’altezza di

# create basic filesystem structure

inseriamo

# give system access to wpa_supplicant.conf for backup and restore
mkdir /data/misc/wifi 0777 wifi wifi
chmod 0777 /data/misc/wifi
chmod 0666 /data/misc/wifi/wpa_supplicant.conf

Un altro piccolo problemino riguarda il SetupWizard, di default non è possibile saltare il login con gmail, se non si ha un abbonamento a internet potrebbe essere dispendioso 🙂 . La soluzione è aggiungere

ro.setupwizard.mode=OPTIONAL

nel build.prop, lo si può fare a mano alla fine del file una volta flashato il system.img nel cellulare oppure lo si può inserire direttamente prima della compilazione nel file apposito htc_sapp.mk. Purtroppo questa seconda possibilità, in linea teorica giusta, non ha funzionato. Un alternativa non proprio pulita è mettere l’opzione in system.prop

Ci siamo:

make

Come dice l’autore della guida da cui ho preso spunto, a questo punto meglio andare a giocare con la wii e tornare dopo un pò 😉

Flashing

Il metodo più semplice per flashare il nostro nuovo android è usare il fastboot, dopo essere entrati in fastboot con il cellulare dare questi comandi dalla cartella tool dell’sdk (aggiungere sudo se necessario)

./fastboot flash system ~/androidsource/out/target/product/sapphire/system.img
./fastboot flash userdata ~/androidsource/out/target/product/sapphire/userdata.img
./fastboot flash boot ~/androidsource/out/target/product/sapphire/boot.img

Ovviamente questi comandi cancelleranno i dati presenti nel cellulare.

Enjoy 😉

17 risposte a “Compilare Android: Compiliamo!”

  1. guida ben fatta, solo che ho una domanda….se volessi inserire nella rom l’interfaccia rosie (quella dell’hero) compilando una rom su base donut, dove devo mettere gli apk?
    io ero uno sviluppatore di rom per windows mobile, ora sono passato ad un terminale android e vorrei (magic tim) e vorre personalizzarmi le rom, solo che con i windows mobile in rete si trovavano decine di guide (oltre ad essere più facile ed automatizzato tutto il processo), mentre invece su android per ora la tua è l’unica guida che ho trovato, quindi grazie mille, almeno ho una base di partenza

  2. credo proprio che l’apk di rosie non vada su una normale donut, bisogna lavorare anche di framework
    alcune applicazioni HTC dell’hero funzionano ma si è dovuto fare un lavoro di porting (penso all’ HTC Music)

  3. colevo chiederti una consulenza….
    sto provando a ricompilare il kernel seguendo la tua guida e usando le sorgenti del kernel rilasciato da htc per il 32a magic… cioè, ho seguito la guida passo passo e poi ho sostituito tutti i file in androidsource/kernel con quelli dell’archivio dell’HTC….solo che quando vado a compilare mi ritrovo una serie errori che mi impediscono di compilare con successo il kernel….

    arch/arm/mach-msm/htc_acoustic.c:157: warning: unused variable ‘req’
    arch/arm/mach-msm/htc_acoustic.c: At top level:
    arch/arm/mach-msm/htc_acoustic.c:242: warning: initialization from incompatible pointer type
    CC arch/arm/mach-msm/board-trout-rfkill.o
    CC arch/arm/mach-msm/board-halibut.o
    arch/arm/mach-msm/board-halibut.c:68: error: array type has incomplete element type
    arch/arm/mach-msm/board-halibut.c:69: error: field name not in record or union initializer
    arch/arm/mach-msm/board-halibut.c:69: error: (near initialization for ‘snd_endpoints_list’)
    arch/arm/mach-msm/board-halibut.c:69: error: field name not in record or union initializer
    arch/arm/mach-msm/board-halibut.c:69: error: (near initialization for ‘snd_endpoints_list’)
    arch/arm/mach-msm/board-halibut.c:70: error: field name not in record or union initializer
    arch/arm/mach-msm/board-halibut.c:70: error: (near initialization for ‘snd_endpoints_list’)
    arch/arm/mach-msm/board-halibut.c:70: error: field name not in record or union initializer
    arch/arm/mach-msm/board-halibut.c:70: error: (near initialization for ‘snd_endpoints_list’)
    arch/arm/mach-msm/board-halibut.c:71: error: field name not in record or union initializer
    arch/arm/mach-msm/board-halibut.c:71: error: (near initialization for ‘snd_endpoints_list’)
    arch/arm/mach-msm/board-halibut.c:71: error: field name not in record or union initializer
    arch/arm/mach-msm/board-halibut.c:71: error: (near initialization for ‘snd_endpoints_list’)
    arch/arm/mach-msm/board-halibut.c:72: error: field name not in record or union initializer
    arch/arm/mach-msm/board-halibut.c:72: error: (near initialization for ‘snd_endpoints_list’)
    arch/arm/mach-msm/board-halibut.c:72: error: field name not in record or union initializer
    arch/arm/mach-msm/board-halibut.c:72: error: (near initialization for ‘snd_endpoints_list’)
    arch/arm/mach-msm/board-halibut.c:73: error: field name not in record or union initializer
    arch/arm/mach-msm/board-halibut.c:73: error: (near initialization for ‘snd_endpoints_list’)
    arch/arm/mach-msm/board-halibut.c:73: error: field name not in record or union initializer
    arch/arm/mach-msm/board-halibut.c:73: error: (near initialization for ‘snd_endpoints_list’)
    arch/arm/mach-msm/board-halibut.c:77: error: variable ‘halibut_snd_endpoints’ has initializer but incomplete type
    arch/arm/mach-msm/board-halibut.c:78: error: unknown field ‘endpoints’ specified in initializer
    arch/arm/mach-msm/board-halibut.c:78: warning: excess elements in struct initializer
    arch/arm/mach-msm/board-halibut.c:78: warning: (near initialization for ‘halibut_snd_endpoints’)
    arch/arm/mach-msm/board-halibut.c:79: error: unknown field ‘num’ specified in initializer
    arch/arm/mach-msm/board-halibut.c:80: error: invalid application of ‘sizeof’ to incomplete type ‘struct snd_endpoint’
    arch/arm/mach-msm/board-halibut.c:80: warning: excess elements in struct initializer
    arch/arm/mach-msm/board-halibut.c:80: warning: (near initialization for ‘halibut_snd_endpoints’)
    make[1]: *** [arch/arm/mach-msm/board-halibut.o] Errore 1
    make: *** [arch/arm/mach-msm] Errore 2

    mi potresti aiutare perfavore?..

  4. mi spiace non so aiutarti più di tanto

    hai cancellato l’intera cartella originale mettendo quella HTC? Credo comunque che il kernel debba compilarsi anche senza scaricarsi tutti i vari sorgenti di android, credo basti impostare le variabili di ambiente (export ecc…) e poi dare il make da dentro alla cartella del kernel.

  5. Ci avevo pensato pure io ma provano a compilare il pacchetto dell’htc mi restituisce Lo stesso errore. ..grazie cmq per la disponibilità, proverò a chiedere su xda, anche se odio chiedere le cose su quel forum, dove più che aiutarsi sembra essere una gara…

  6. Ciao sto provando a compilarmi donut per il mio magic tim ma quando provo a compilare il kernel mi da questo errore:

    lufrus@lufrus-laptop:/media/android/androidsource/cm-kernel$ make
    make: arm-eabi-gcc: comando non trovato
    CHK include/linux/version.h
    make[1]: «include/asm-arm/mach-types.h» è aggiornato.
    CHK include/linux/utsrelease.h
    SYMLINK include/asm -> include/asm-arm
    CC kernel/bounds.s
    /bin/sh: arm-eabi-gcc: not found
    make[1]: *** [kernel/bounds.s] Errore 127
    make: *** [prepare0] Errore 2

    Come linux uso ubuntu 9.10 ed ho fatto apt-get install che avevi detto all’inizio

  7. molto probabilmente è sbagliato questo comando
    export PATH=$PATH:~/androidsource/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin
    o non l’hai dato o è cambiato qualcosa nel percorso del binario…non saprei è da tanto che non compilo

  8. ciao..sia importando la configurazione di default del kernel sia utilizzando un .config di cyanogen dopo che do il make oldconfig il terminale inizia a chiedere informazioni per la compilazione non specificate nei .config tutte etichettate con un bel (NEW)..che faccio?

  9. utilizzare ora la config di cyanogen non so se convenga perchè ora le differenze fra kernel dei repository android e il suo sono parecchie…se ti interessa il lavoro di cyanogen a questo punto conviene scaricare e compilare direttamente dal suo git.
    Se proprio non sai cosa sono le voci nuove premi invio che imposterà la risposta di default

  10. purtroppo la compilazione non va a buon fine..da il seguente errore :

    AR arch/arm/lib/lib.a
    Bus error
    make[1]: *** [arch/arm/lib/lib.a] Errore 135
    make: *** [arch/arm/lib] Errore 2

    che purtroppo non so cosa voglia significare..nella preparazione dei sorgenti dici di dare:
    nano ~/androidsource/.repo/local_manifest.xml
    local_manifest.xml non esiste, c’è solo un manifest.xml: aggiungo al manifest.xml o bisogna proprio creare il local_manifest.xml?

  11. Bisogna proprio crearlo.
    Riguardo l’errore al momento non saprei…stai compilando Donut o Eclair? Quale kernel?

  12. Eclair. Il 2.26.29 credo. Dato che ho creato quel local_manifest.xml prima di sincronizzare con i repositories.

  13. se invece di usare fastboot voglio creare l’update.zip come faccio???

    grazie

  14. sempre nella cartella out/target/product/sapphire/ puoi trovare il boot.img e la cartella system
    da lì puoi iniziare a creare un update.zip con signapk

  15. immaginavo fosse così ma la cartella system è vuota, mentre il file system.img è da 64MB

  16. qualcosa non ha funzionato mi sa 🙂

  17. hola!, grazie delle buone info

Lascia un commento