Domanda

Qualcuno ha compilato con successo il kernel Android e lo ha testato nell'emulatore Android, e se è così c'è qualcosa di così speciale che deve essere fatto?

La documentazione per l'SDK è eccellente, tuttavia la documentazione per la compilazione del kernel e l'impostazione di una macchina personalizzata nell'emulatore è stata difficile da trovare per me.

È stato utile?

Soluzione

Dall'agosto 2009 il kernel non fa più parte del manifest repo standard che si ottiene quando si seguono le istruzioni per scaricare il codice sorgente per il progetto open source Android. I passaggi necessari per scaricare, compilare ed eseguire correttamente un kernel specifico sull'emulatore sono i seguenti:

  • Ottieni il kernel Android aggiungendolo al tuo manifest repo o manualmente eseguendo:
    git clone https://android.googlesource.com/kernel/goldfish.git
  • Controlla il ramo corretto per lavorare con l'emulatore, ovvero pesce rosso:
    git checkout -t origin/android-goldfish-2.6.29 -b goldfish
  • Genera la configurazione dell'emulatore (l'emulatore qemu esegue il codice arm, ovvero una configurazione arm):
    make ARCH=arm goldfish_defconfig
    • se non funziona, prova make ARCH=arm goldfish_armv7_defconfig
  • Ora compilate il kernel usando gli strumenti di compilazione incrociata distribuiti con il progetto open source:
    make ARCH=arm CROSS_COMPILE=mydroid/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-
  • Il kernel creato in questo modo dovrebbe finire nella cartella arch / arm / boot dell'albero del kernel (dove si inserisce il codice da git clone)
  • Per eseguire l'emulatore con il kernel ci sono due alternative, o copiarlo nella cartella del kernel precompilata del progetto open source per sostituire il kernel standard. L'altra opzione è quella di avviare l'emulatore con l'opzione del kernel impostata:
    emulator -kernel mydroid/kernel/common/arch/arm/boot/zImage

Nota che ho usato i percorsi predefiniti nella descrizione sopra, devi cambiarli con quelli che si applicano alla tua configurazione. È passato un po 'di tempo dall'ultima volta che l'ho provato, ma penso che dovrebbe funzionare.

Alcune informazioni extra: Nella distribuzione open source Android standard il kernel è distribuito come binario pre-costruito nella cartella mydroid/prebuilt/android-arm/kernel e il codice sorgente non è incluso. Il sorgente del kernel è stato rimosso dal manifest predefinito per due motivi mentre lo prendo. Uno è che ci vuole molto spazio di banda e spazio su disco per un componente della piattaforma con cui la maggior parte delle persone non lavorerà molto. L'altra ragione è che dal momento che il kernel è compilato con il sistema di compilazione del kernel e non come parte del sistema di compilazione di aosp, ha senso tenerlo separato. Il ramo comune per il kernel è quello usato dall'emulatore. Ci sono anche filiali per sperimentale, msm (piattaforme Qualcomm) e Omap (piattaforma TI) e forse un po 'di più. Se vuoi usare il kernel Android con hardware questi potrebbero essere più interessanti per te.

Altri suggerimenti

Solo per correggere alcune cose dal post di BMB (che mi è stato molto utile, ha salvato il mio progetto):

  • git clone git: //android.git.kernel.org/kernel/common.git (il kernel mancante);
  • checkout git -t origin / android-goldfish-2.6.29 -b pesce rosso (lo stesso);
  • make ARCH = arm goldfish_defconfig (idem);
  • make ARCH = arm CROSS_COMPILE = mydroid / prebuilt / linux-x86 / toolchain / arm-eabi-4.2.1 / bin / arm-eabi- (idem)
  • emulatore -avd my_avd -kernel mydroid / kernel / common / arch / arm / boot / zImage (qui ho aggiunto un avd al comando, non ha funzionato senza di me).

Questo è un aggiornamento per le risposte di BMB e Arnaud LM.
Sembra che i nomi dei rami del pesce rosso siano stati cambiati a partire dal 2011/03/03. Quando controlli il ramo del pesce rosso, usa questo:

git checkout -t origin/archive/android-gldfish-2.6.29 -b goldfish 

Nota la 'o' mancante in android-gldfish-2.6.29!

Spero che questo risparmi tempo per qualcuno.

A partire dal 2012, il download del kernel è ben documentato su source.google.com, tuttavia ho scoperto che la compilazione ha richiesto alcuni tentativi. Ecco i comandi che ho usato per creare un kernel per l'emulatore ARM:

cd /kernel/source/root
make mrproper
adb pull /proc/config.gz # from the emulator
gunzip config
mv config .config  # now you have a (perhaps slightly outdated kernel .config)
make ARCH=arm silentoldconfig # update the .config - take the defaults if prompted
make ARCH=arm menuconfig # make any further changes
time make -j4 ARCH=arm CROSS_COMPILE=/path/to/android/source/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi- 2>&1 | tee ../../logs/$(date +%Y%m%d-%H%M)-make-kernel.log
emulator -kernel /kernel/source/root/kernel/goldfish/arch/arm/boot/zImage -avd myAVD &

Grazie a tutti coloro che hanno risposto a questo: sono stato in grado di farlo con frammenti di questa risposta. "You need the AVD" di Amaund è stato l'ultimo pezzo che mi ha dato problemi.

Ospite Android 8.1 completamente automatizzato sull'host Ubuntu 17.10

# Download the source. Takes several minutes.
curl https://storage.googleapis.com/git-repo-downloads/repo >repo
chmod a+x repo
./repo init -b android-8.1.0_r1 --depth 1 -u https://android.googlesource.com/platform/manifest
./repo sync -c  -j $(($(nproc) - 2)) --no-tags --no-clone-bundle

# Do the actual build. Takes minutes / hours.
. build/envsetup.sh
lunch aosp_x86_64-eng
USE_CCACHE=1 CCACHE_DIR=ccache make -j $(($(nproc) - 2))

# Run the emulator.
emulator -show-kernel

La out/ directory di compilazione occupa circa 90 GB e il resto dell'albero circa 40 GB, escluso CCACHE.

Circa 1-2 minuti dopo l'avvio dell'emulatore, la schermata principale mostra:

e se premi invio sul terminale host da cui è stato lanciato Android, otterrai una shell sul sistema Android sul tuo terminale host:

 inserisci qui la descrizione dell'immagine

Note:

  • ./repo init -b DEVE puntare a un tag . Il ramo master è sempre rotto, così come i -release rami.

    L'elenco dei tag è disponibile all'indirizzo: https://android.googlesource.com/platform/ manifest o clonando tale repo.

    Ci sono probabilmente due ragioni per cui i rami sono sempre rotti:

    • Android è sviluppato a porte chiuse e il codice è stato eliminato. Pertanto gli sviluppatori Google e OEM hanno già un sacco di cache in cima al pubblico & Quot; master & Quot; e hanno già risolto il problema.

      Per lo stesso motivo è probabilmente inutile provare a segnalare eventuali errori di build sul master: sono già stati segnalati e corretti. Inoltre, ti sfido a trovare persino il posto ufficiale giusto per segnalare i fallimenti della costruzione.

    • repo sync su un ramo semplicemente estrae qualsiasi versione più recente di tutti i repository 650 git compongono AOSP per il ramo dato, senza sincronizzarli come sottomoduli. Pertanto nulla garantisce che siano compatibili. I tag tuttavia recuperano un tag specifico di tutti i repository.

  • --depth 1 e sync -c --no-tags --no-clone-bundle sono stati un tentativo di rendere più veloce il clone dolorosamente lento. Non sono sicuro di quanto abbia avuto successo. Vedi anche: La sincronizzazione del repository AOSP impiega troppo tempo

  • Usiamo lunch aosp_x86_64-eng invece di ARM perché funziona molto più velocemente grazie alle estensioni di virtualizzazione x86 host.

    Per creare invece una versione ARM, basta usare lunch aosp_arm-eng invece.

    Inoltre, l'immagine ARM è buggy, probabilmente a causa della lentezza? All'avvio della GUI (se sei fortunato), mostra & Quot; L'interfaccia utente del sistema non risponde & Quot ;. Vedi anche: Il sistema di processo non risponde nell'emulatore Android

  • -show-kernel collega il terminale a una seriale, ovvero vedi messaggi di avvio e ottieni una shell alla fine, che è molto utile per il debug delle cose.

  • type emulator mostra che è solo un alias di emulator senza argomenti. Esegui ROM personalizzata su Emulatore Android chiede come passare alcuni argomenti per selezionare esplicitamente il tuo ROM.

    I target dell'emulatore -help sono sorprendentemente penetranti:

    emulator -help
    emulator -help-build-images
    emulator -help-disk-images
    

    È possibile determinare gli argomenti esatti della riga di comando QEMU forniti con:

    emulator -verbose | grep 'emulator: argv'
    

    come menzionato in: Come mostrare quali opzioni vengono passate a QEMU all'avvio dell'emulatore Android?

    Mostra alcune opzioni personalizzate, ad es. -android-hw, quindi devono aver biforcuto QEMU: QEMU vs emulatore Android: riga di comando opzioni La sorgente sposta la posizione ogni 5 minuti apparentemente: Modifica del codice sorgente dell'emulatore Android

È facile. Segui le istruzioni su http://source.android.com/download per ottenere e compilare il codice sorgente per l'intero androide. Ci vuole un po ', ma non è così complicato.

Costruendolo, avrai l'output nella directory <android>/out. Ciò include, oltre alle immagini ROM, anche un sacco di strumenti, incluso l'emulatore. Il mio emulatore è su <android>/out/host/linux-x86/bin/emulator. Basta impostare una variabile di ambiente denominata ANDROID_PRODUCT_OUT su <android>/out/target/product/generic, quindi eseguire l'emulatore senza alcuna opzione eseguirà la ROM compilata.

A partire da maggio 2012, ho scoperto che non è possibile utilizzare "goldfish_defconfig" per compilare il kernel. Devi usare goldfish_armv7_defconfig '. Questo spiegherebbe perché il metodo di JonnyLambada per estrarre la configurazione dall'emulatore (per il kernel precompilato) funziona ed è necessario.

goldfish_defconfig configura il kernel per l'esecuzione su un processore ARM 926, ma l'emulatore è configurato per funzionare come Coretex A8 (che è una CPU ARM V7). Quindi è necessario utilizzare il defconfig più recente se si desidera che funzioni (o estrarre la configurazione dall'emulatore).

Solo FYI.

Il modo in cui sono stato in grado di avviare la rom AOSP che ho compilato era copiare il file system.img che è stato compilato in ~ / .android / avd / Froyo.avd / Ma quando estraggo system.img e aggiungo la versione root di su e busybox, quindi rifaccio il file system.img, l'emulatore non si avvia. Sto ancora cercando di capire che parte: S

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top