• Compilare Android: Compiliamo!

    by  • agosto 20, 2009 • Altro informatica, Android, Aziende, Google, HTC, Open source/Free software, Smanettamenti, Software • 17 Comments

    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 Responses to Compilare Android: Compiliamo!

    1. andybanc
      settembre 28, 2009 at 10:27 pm

      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

      Firefox 3.0.14 Firefox 3.0.14 Ubuntu 9.04 Ubuntu 9.04
      Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.14) Gecko/2009090216 Ubuntu/9.04 (jaunty) Firefox/3.0.14
    2. settembre 29, 2009 at 12:30 am

      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)

      Firefox 3.0.10 Firefox 3.0.10 Ubuntu 9.04 Ubuntu 9.04
      Mozilla/5.0 (X11; U; Linux i686; it; rv:1.9.0.10) Gecko/2009042523 Ubuntu/9.04 (jaunty) Firefox/3.0.10 VisualTB
    3. andybanc
      ottobre 3, 2009 at 9:42 pm

      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?..

      Firefox 3.0.14 Firefox 3.0.14 Ubuntu 9.04 x64 Ubuntu 9.04 x64
      Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9.0.14) Gecko/2009090217 Ubuntu/9.04 (jaunty) Firefox/3.0.14
    4. ottobre 3, 2009 at 10:20 pm

      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.

      Firefox 3.0.14 Firefox 3.0.14 Ubuntu 9.04 Ubuntu 9.04
      Mozilla/5.0 (X11; U; Linux i686; it; rv:1.9.0.14) Gecko/2009090216 Ubuntu/9.04 (jaunty) Firefox/3.0.14
    5. andybanc
      ottobre 4, 2009 at 1:19 am

      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…

      Mobile Safari 3.1.2 Mobile Safari 3.1.2 HTC Hero HTC Hero
      Mozilla/5.0 (Linux; U; Android 1.5; it-it; HTC Hero Build/CUPCAKE) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1
    6. lufrus
      novembre 13, 2009 at 7:08 pm

      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

      Firefox 3.5.5 Firefox 3.5.5 Ubuntu 9.10 Ubuntu 9.10
      Mozilla/5.0 (X11; U; Linux i686; it; rv:1.9.1.5) Gecko/20091109 Ubuntu/9.10 (karmic) Firefox/3.5.5
    7. novembre 13, 2009 at 10:30 pm

      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

      Firefox 3.5.5 Firefox 3.5.5 Windows 7 Windows 7
      Mozilla/5.0 (Windows; U; Windows NT 6.1; it; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5
    8. Francesco
      gennaio 27, 2010 at 9:49 am

      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?

      Firefox 3.5.3 Firefox 3.5.3 Ubuntu 9.10 Ubuntu 9.10
      Mozilla/5.0 (X11; U; Linux i686; it; rv:1.9.1.3) Gecko/20091020 Ubuntu/9.10 (karmic) Firefox/3.5.3
    9. gennaio 27, 2010 at 10:34 am

      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

      Google Chrome 4.0.303.0 Google Chrome 4.0.303.0 GNU/Linux GNU/Linux
      Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/4.0.303.0 Safari/532.9
    10. Francesco
      gennaio 27, 2010 at 1:28 pm

      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?

      Firefox 3.5.3 Firefox 3.5.3 Ubuntu 9.10 Ubuntu 9.10
      Mozilla/5.0 (X11; U; Linux i686; it; rv:1.9.1.3) Gecko/20091020 Ubuntu/9.10 (karmic) Firefox/3.5.3
    11. gennaio 27, 2010 at 1:51 pm

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

      Mobile Safari 3.1.2 Mobile Safari 3.1.2 Android Android
      Mozilla/5.0 (Linux; U; Android 1.6; it-it; T-Mobile myTouch 3G Build/DRC92) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1
    12. Francesco
      gennaio 27, 2010 at 2:36 pm

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

      Firefox 3.5.3 Firefox 3.5.3 Ubuntu 9.10 Ubuntu 9.10
      Mozilla/5.0 (X11; U; Linux i686; it; rv:1.9.1.3) Gecko/20091020 Ubuntu/9.10 (karmic) Firefox/3.5.3
    13. Federico
      febbraio 26, 2010 at 5:59 pm

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

      grazie

      Firefox 3.5.8 Firefox 3.5.8 Windows XP Windows XP
      Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 GTB6 (.NET CLR 3.5.30729)
    14. febbraio 26, 2010 at 6:10 pm

      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

      Google Chrome 5.0.336.0 Google Chrome 5.0.336.0 GNU/Linux GNU/Linux
      Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/533.1 (KHTML, like Gecko) Chrome/5.0.336.0 Safari/533.1
    15. Federico
      febbraio 26, 2010 at 6:11 pm

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

      Firefox 3.5.8 Firefox 3.5.8 Windows XP Windows XP
      Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 GTB6 (.NET CLR 3.5.30729)
    16. febbraio 26, 2010 at 6:40 pm

      qualcosa non ha funzionato mi sa 🙂

      Google Chrome 5.0.336.0 Google Chrome 5.0.336.0 GNU/Linux GNU/Linux
      Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/533.1 (KHTML, like Gecko) Chrome/5.0.336.0 Safari/533.1
    17. aprile 30, 2010 at 7:01 am

      hola!, grazie delle buone info

      Google Chrome 4.0.221.7 Google Chrome 4.0.221.7 Windows 7 Windows 7
      Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.221.7 Safari/532.2

    Lascia un commento

    Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *


    sei − 1 =