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

quelqu'un A compilé le noyau android et testé dans l'émulateur Android, et si oui, est-il quelque chose de spécial qui doit être fait?

la Documentation pour le SDK est excellente, cependant la documentation pour compiler le noyau et configurer une machine personnalisée dans l'émulateur a été difficile à trouver pour moi.

47

8 réponses

depuis août 2009, le noyau ne fait plus partie du Manifeste repo standard que vous obtenez lorsque vous suivez les instructions pour télécharger le code source pour le projet open source android. Les étapes nécessaires pour télécharger, compiler et exécuter avec succès un noyau spécifique sur l'émulateur sont les suivantes:

  • récupérez le noyau Android soit en l'ajoutant à votre manifeste repo, soit en exécutant manuellement:

    git clone https://android.googlesource.com/kernel/goldfish.git
  • vérifier la branche correcte pour travailler avec l'émulateur, c.-à-d. poisson rouge:

    git checkout -t origin/android-goldfish-2.6.29 -b goldfish
  • génère la configuration de l'émulateur (l'émulateur qemu exécute le code arm, c.-à-d. une configuration arm)):

    make ARCH=arm goldfish_defconfig
    • si cela ne fonctionne pas, essayez make ARCH=arm goldfish_armv7_defconfig
  • construisez maintenant le noyau en utilisant les outils de compilation croisés 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 finir dans le dossier arch/arm/boot de votre arborescence de noyau (où vous avez mis le code du clone git)
  • pour exécuter l'émulateur avec votre noyau il y a deux alternatives, Copiez-le dans le dossier prébuilt kernel du projet open source pour remplacer le noyau standard. L'autre option est de lancer l'émulateur avec le noyau option:

    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 Modifier pour ce qui s'applique à votre configuration. Il a été un certain temps depuis la dernière fois que j'ai testé, 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 dossier mydroid/prebuilt/android-arm/kernel et le code source n'est pas inclus. Le source du noyau a été supprimé du manifeste par défaut pour deux raisons que je prends. La première est qu'il faut beaucoup de bandwith 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 compilation du noyau et non pas dans le cadre du système de compilation aosp, il est logique de le garder séparé. La branche commune du noyau est celle utilisée par l'émulateur. Il existe également des branches pour les plateformes expérimentales, MSM (Qualcomm)) et Omap (plateforme TI) et peut-être plus. Si vous souhaitez utiliser le noyau Android avec du matériel, ceux-ci peuvent être plus intéressants pour vous.

54
répondu BMB 2012-05-05 09:06:27

juste pour corriger quelques petites choses du post de BMB (qui m'a été très utile, il a sauvé mon projet) :

  • git clone git: / / android.git.kernel.org/kernel / common.git (the kernel missed);
  • git checkout -t origine/android-goldfish-version 2.6.29 -b le poisson rouge (le même) ;
  • 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)
  • emulator-avd my_avd-kernel mydroid/kernel/common/arch/arm/boot / zImage (ici j'ai ajouté un avd dans la commande, cela ne fonctionnait pas sans pour moi).


19
répondu Arnaud LM 2017-03-04 12:57:22

C'est une mise à jour pour BMB et Arnaud LM réponses.

Il semble que les noms de branchies du poisson rouge ont été changés en 2011/03/03. En vérifiant la branche de 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 ça fera gagner du temps à quelqu'un.

8
répondu hopia 2011-03-04 01:36:45

depuis 2012, le téléchargement du noyau est bien documenté sur source.google.com cependant, 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. Le "you need the AVD" d'Amaund était la dernière pièce qui m'a causé des problèmes.

8
répondu JohnnyLambada 2013-04-02 15:06:45

c'est facile. Suivez les instructions à http://source.android.com/download pour obtenir et compiler le code source pour l'androïde entier. Qui prend du temps, mais n'est pas compliquée.

en construisant cela, vous aurez votre sortie dans le répertoire <android>/out . Cela inclut, outre les images ROM, un tas d'outils aussi, y compris l'émulateur. Mon émulateur est au <android>/out/host/linux-x86/bin/emulator . Juste définir une variable d'environnement nommée ANDROID_PRODUCT_OUT à <android>/out/target/product/generic , et ensuite exécuter l'émulateur sans aucune option exécutera votre ROM compilé.

6
répondu Mostafa 2009-11-28 12:56:55

depuis mai 2012, j'ai découvert 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ébuilé) fonctionne, et est nécessaire.

le goldfish_defconfig configure le noyau pour qu'il tourne sur un processeur ARM 926, mais l'émulateur est configuré pour fonctionner comme un Coretex A8 (qui est un processeur ARM V7). Si vous avez besoin d'utiliser la plus récente defconfig si vous le souhaitez (ou extraire la configuration de l'émulateur).

POUR INFO.

4
répondu Tim Bird 2012-05-04 17:33:24

procédure entièrement automatisée pour Android 8.1 guest et Ubuntu 17.10 host

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
. build/envsetup.sh
lunch aosp_x86_64-eng
USE_CCACHE=1 CCACHE_DIR=ccache make -j $(($(nproc) - 2))
emulator -show-kernel

le répertoire de compilation out/ prend environ 90 Go, et le reste de l'arbre Environ 40 Go, à l'exclusion de CCACHE.

Notes:

  • ./repo init -b doit pointer vers une étiquette . La branche master est toujours cassée, tout comme les branches -release .

    la liste des étiquettes peut être trouvée à: https://android.googlesource.com/platform/manifest ou en clonant ce repo.

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

    • Android est développé derrière des portes fermées et Code tombé. Par conséquent, Google et OEM devs ont déjà une tonne de pêches sur le "maître" public, et ont déjà corrigé le problème.

      pour la même raison, il est probablement inutile d'essayer de signaler des erreurs de construction sur master: elles ont déjà été signalées et corrigées. Je vous défie aussi de trouver le bon endroit officiel pour signaler les échecs de construction.

    • repo sync " sur une branche tire simplement n'importe quelle dernière version de tous les 650 git repos constitue AOSP pour la branche donnée, sans les synchroniser comme des sous-modules. Par conséquent, rien ne garantit qu'elles sont compatible. Les étiquettes récupèrent cependant une étiquette spécifique de toutes les repos.

  • --depth 1 et sync -c --no-tags --no-clone-bundle étaient une tentative de faire de la lente et douloureuse clone plus rapide. Pas sûr de savoir comment il était réussie. Voir aussi: PSBA pensions de synchronisation prend trop de temps

  • nous utilisons lunch aosp_x86_64-eng au lieu de " ARM " parce qu'il tourne beaucoup plus vite en raison des extensions de virtualisation de l'hôte x86.

    pour construire une version ARM à la place, il suffit d'utiliser lunch aosp_arm-eng à la place.

    en outre, l'image du bras est buggy, peut-être en raison de la lenteur? Lorsque L'interface graphique commence (si vous avez de la chance), elle affiche "L'interface graphique 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 les messages de démarrage, et obtenir un interpréteur de commandes à la fin, ce qui est très utile pour déboguer les choses.

  • type emulator montre que c'est juste un alias au emulator sans aucun argument. Run custom ROM on Android Emulator demande comment passer certains arguments pour sélectionner explicitement votre ROM.

    l'émulateur -help les cibles sont étonnamment perspicaces:

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

la façon dont j'ai pu démarrer le rom AOSP que j'avais compilé était de copier le système.img qui a été compilé à~/.android / avd / Froyo.avd/ Mais, quand j'ai extrait le système.img et ajouter la version enracinée de su et busybox, puis remake le système.img, l'émulateur ne démarre pas. J'essaie toujours de comprendre cette partie :s

1
répondu triki 2010-09-04 20:42:19