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 😉
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
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)
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?..
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.
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…
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
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
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?
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
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?
Bisogna proprio crearlo.
Riguardo l’errore al momento non saprei…stai compilando Donut o Eclair? Quale kernel?
Eclair. Il 2.26.29 credo. Dato che ho creato quel local_manifest.xml prima di sincronizzare con i repositories.
se invece di usare fastboot voglio creare l’update.zip come faccio???
grazie
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
immaginavo fosse così ma la cartella system è vuota, mentre il file system.img è da 64MB
qualcosa non ha funzionato mi sa 🙂
hola!, grazie delle buone info