web-dev-qa-db-fra.com

Comment compiler le Android noyau AOSP et le tester avec l'émulateur Android?

Quelqu'un a-t-il réussi à compiler le noyau Android Android et à le tester dans l'émulateur Android, et si oui, y a-t-il quelque chose de spécial qui doit être fait?)

La documentation du SDK est excellente, mais la documentation pour la compilation du noyau et la configuration d'une machine personnalisée dans l'émulateur a été difficile à trouver pour moi.

50

Depuis août 2009, le noyau ne fait plus partie du manifeste de référentiel standard que vous obtenez lorsque vous suivez les instructions pour télécharger le code source du projet open source Android. Les étapes nécessaires pour réussir télécharger, construire et exécuter un noyau spécifique sur l'émulateur sont les suivants:

  • Obtenez le Android noyau soit en l'ajoutant à votre manifeste repo ou manuellement en exécutant:
    git clone https://Android.googlesource.com/kernel/goldfish.git
  • Découvrez la bonne branche pour travailler avec l'émulateur, c'est-à-dire le poisson rouge:
    git checkout -t Origin/Android-goldfish-2.6.29 -b goldfish
  • Générez la configuration de l'émulateur (l'émulateur qemu exécute le code d'armement, c'est-à-dire une configuration d'armement):
    make Arch=arm goldfish_defconfig
    • si cela ne fonctionne pas, essayez make Arch=arm goldfish_armv7_defconfig
  • Maintenant, construisez le noyau en utilisant les outils de compilation croisée distribués avec le projet open source:
    make Arch=arm CROSS_COMPILE=mydroid/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-
  • Le noyau construit de cette façon devrait se retrouver dans le dossier Arch/arm/boot de votre arborescence du noyau (où vous mettez le code de git clone)
  • Pour exécuter l'émulateur avec votre noyau, il existe deux alternatives, soit copiez-le dans le dossier du noyau précompilé du projet open source pour remplacer le noyau standard. L'autre option consiste à démarrer l'émulateur avec l'ensemble d'options du noyau:
    emulator -kernel mydroid/kernel/common/Arch/arm/boot/zImage

Notez que j'ai utilisé les chemins par défaut dans la description ci-dessus, vous devez les changer pour ce qui s'applique à votre configuration. Cela fait un certain temps depuis la dernière fois que j'ai testé cela, mais je pense que cela devrait fonctionner.

Quelques informations supplémentaires: Dans la distribution standard Android open source, le noyau est distribué comme un binaire pré-construit dans le mydroid/prebuilt/Android-arm/kernel dossier et le code source n'est pas inclus. La source du noyau a été supprimée du manifeste par défaut pour deux raisons à mon avis. La première est qu'il faut beaucoup de bande passante et d'espace disque pour un composant de plate-forme avec lequel la plupart des gens ne travailleront pas beaucoup. L'autre raison est que puisque le noyau est construit avec le système de construction du noyau et non en tant que partie du système de construction aosp, il est logique de le garder séparé. La branche commune pour le noyau est celle utilisée par l'émulateur. Il existe également des branches expérimentales, msm (plates-formes Qualcomm) et Omap (plate-forme TI) et peut-être d'autres. Si vous souhaitez utiliser le noyau Android avec du matériel, cela peut être plus intéressant pour vous.

55
BMB

Juste pour corriger certaines choses du post de BMB (qui m'a été très utile, cela a sauvé mon projet):

  • git clone git: //Android.git.kernel.org/kernel/common.git (le noya manqué);
  • git checkout -t Origin/Android-goldfish-2.6.29 -b poisson rouge (le même);
  • faire Arch = arm goldfish_defconfig (idem);
  • make Arch = arm CROSS_COMPILE = mydroid/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabiidem)
  • émulateur -avd my_avd -kernel mydroid/kernel/common/Arch/arm/boot/zImage (ici j'ai ajouté un --- (avd dans la commande, cela n'a pas fonctionné sans moi).

19
Arnaud LM

Depuis 2012, le téléchargement du noyau est bien documenté sur source.google.com, mais j'ai trouvé que la compilation a pris quelques essais. Voici les commandes que j'ai utilisées pour construire un noyau pour l'émulateur 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 &

Merci à tous ceux qui ont répondu à celle-ci - j'ai pu le faire avec des morceaux de cette réponse. Amaund's 'you need the AVD' a été le dernier morceau qui m'a posé problème.

8
JohnnyLambada

Ceci est une mise à jour des réponses de BMB et Arnaud LM.
Il semble que les noms de branches des poissons rouges aient été modifiés en date du 2011/03/03. Lors de la vérification de la branche poisson rouge, utilisez ceci:

git checkout -t Origin/archive/Android-gldfish-2.6.29 -b goldfish 

Notez le "o" manquant dans Android-gldfish-2.6.29!

J'espère que cela fait gagner du temps à quelqu'un.

8
hopia

Invité Android 8.1 entièrement automatisé sur l'hôte 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

Le répertoire de construction out/ Occupe environ 90 Go et le reste de l'arborescence environ 40 Go, à l'exception de CCACHE.

Environ 1 à 2 minutes après le démarrage de l'émulateur, l'écran d'accueil affiche:

et si vous appuyez sur Entrée sur le terminal hôte Android a été lancé à partir de, vous obtenez un shell sur le système Android sur votre terminal hôte:

enter image description here

Remarques:

  • ./repo init -b DOIT pointer vers une balise . master la branche est toujours cassée, tout comme les -release branches.

    La liste des balises peut être trouvée à: https: //Android.googlesource.com/platform/manifest ou en clonant ce dépôt.

    Il y a probablement deux raisons pour lesquelles les branches sont toujours cassées:

    • Android est développé derrière des portes closes et le code a chuté. Par conséquent, les développeurs Google et OEM ont déjà une tonne de cache en plus du "maître" public et ont déjà résolu le problème.

      Pour la même raison, il est probablement inutile d'essayer de signaler toute erreur de génération sur le maître: elles ont déjà été signalées et corrigées. Je vous mets également au défi de trouver le bon endroit officiel pour signaler les échecs de construction.

    • repo sync Sur une branche extrait simplement la dernière version de tous les dépôts 650 git constituant AOSP pour la branche donnée, sans les synchroniser comme des sous-modules. Rien ne garantit donc leur compatibilité. Les tags récupèrent cependant un tag spécifique de tous les repos.

  • --depth 1 Et sync -c --no-tags --no-clone-bundle Étaient une tentative pour accélérer le clone douloureusement lent. Je ne sais pas à quel point c'était réussi. Voir aussi: La synchronisation du repo AOSP prend trop de temps

  • Nous utilisons lunch aosp_x86_64-eng Au lieu de ARM car il s'exécute beaucoup plus rapidement en raison des extensions de virtualisation Host x86.

    Pour créer une version ARM à la place, utilisez simplement lunch aosp_arm-eng À la place.

    De plus, l'image ARM est boguée, peut-être à cause de la lenteur? Lorsque l'interface graphique démarre (si vous êtes chanceux), elle affiche "L'interface utilisateur système ne répond pas". Voir aussi: Le système de processus ne répond pas dans l'émulateur Android

  • -show-kernel Relie le terminal à une série, c'est-à-dire que vous voyez des messages de démarrage et obtenez un Shell à la fin, ce qui est très utile pour déboguer les choses.

  • type emulator Montre qu'il ne s'agit que d'un alias au emulator sans aucun argument. Exécutez ROM personnalisé sur l'émulateur Android vous demande comment passer des arguments pour sélectionner explicitement votre ROM.

    Les cibles de l'émulateur -help Sont étonnamment perspicaces:

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

    Vous pouvez déterminer les arguments de ligne de commande QEMU exacts donnés avec:

    emulator -verbose | grep 'emulator: argv'
    

    comme mentionné à: Comment montrer quelles options sont passées à QEMU lors du lancement de l'émulateur Android?

    Cela montre certaines options personnalisées, par exemple -Android-hw, Ils doivent donc avoir fourché QEMU: QEMU vs Android émulateur: options de ligne de commande La source se déplace l'emplacement toutes les 5 minutes apparemment: Modification du code source de l'émulateur Android

C'est facile. Suivez les instructions sur http://source.Android.com/download pour obtenir et compiler le code source pour tout Android. Cela prend du temps, mais ce n'est pas si compliqué.

En construisant cela, vous aurez votre sortie dans le <Android>/out répertoire. Cela inclut, en plus des images ROM, un tas d'outils aussi, y compris l'émulateur. Mon émulateur est à <Android>/out/Host/linux-x86/bin/emulator. Définissez simplement une variable d'environnement nommée Android_PRODUCT_OUT à <Android>/out/target/product/generic, puis exécuter l'émulateur sans aucune option exécutera votre ROM compilée.

6
Mostafa

Depuis mai 2012, j'ai constaté que vous ne pouvez pas utiliser le 'goldfish_defconfig' pour compiler le noyau. Vous devez utiliser goldfish_armv7_defconfig '. Cela expliquerait pourquoi la méthode de JonnyLambada pour extraire la configuration de l'émulateur (pour le noyau précompilé) fonctionne et est nécessaire.

Le goldfish_defconfig configure le noyau pour qu'il s'exécute sur un processeur ARM 926, mais l'émulateur est configuré pour fonctionner comme un Coretex A8 (qui est un ARM CPU V7) Vous devez donc utiliser la nouvelle configuration defconfig si vous voulez qu'elle fonctionne (ou extraire la configuration de l'émulateur).

Juste FYI.

4
Tim Bird

La façon dont j'ai pu démarrer la rom AOSP que j'ai compilée était de copier le system.img qui a été compilé dans ~/.Android/avd/Froyo.avd/Mais, quand j'extrais le system.img et ajoute la version enracinée de su et busybox, puis refaire le system.img, l'émulateur ne démarre pas. J'essaie toujours de comprendre cette partie: S

1
triki