Question

Quelqu'un at-il réussi à compiler le noyau Android et à le tester dans l'émulateur Android? Si tel est le cas, y a-t-il quelque chose de particulier à faire?

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

Était-ce utile?

La solution

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 au téléchargement, à la création et à l’exécution d’un noyau spécifique sur l’émulateur sont les suivantes:

  • Obtenez le noyau Android en l'ajoutant à votre manifeste de référentiel ou manuellement en exécutant:
    git clone https://android.googlesource.com/kernel/goldfish.git
  • Recherchez la branche appropriée pour travailler avec l'émulateur, à savoir goldfish:
    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 bras, c'est-à-dire une configuration bras):
    make ARCH=arm goldfish_defconfig
    • si cela ne fonctionne pas, essayez make ARCH=arm goldfish_armv7_defconfig
  • Construisez maintenant le noyau à l'aide des 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 ainsi construit devrait se retrouver dans le dossier arch / arm / boot de votre arborescence (où vous avez mis le code du clone git)
  • Pour exécuter l'émulateur avec votre noyau, vous avez deux possibilités: copiez-le dans le dossier du noyau pré-construit du projet open source pour remplacer le noyau standard. L'autre option consiste à démarrer l'émulateur avec le jeu 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 quelque 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 open source standard d'Android, le noyau est distribué sous la forme d'un fichier binaire pré-construit dans le dossier mydroid/prebuilt/android-arm/kernel et le code source n'est pas inclus. La source du noyau a été supprimée du manifeste par défaut pour deux raisons. La première est qu'il faut beaucoup de bande passante et d'espace disque pour un composant de plateforme sur lequel la plupart des gens ne travailleront pas beaucoup. L'autre raison est que, comme le noyau est construit avec le système de construction du noyau et non dans le cadre du système de construction 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 experimental, msm (plates-formes Qualcomm) et Omap (plate-forme TI), voire davantage. Si vous souhaitez utiliser le noyau Android avec du matériel, cela peut vous intéresser davantage.

Autres conseils

Juste pour corriger quelques éléments du message 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 noyau manquant);
  • git checkout -t origine / android-goldfish-2.6.29 -b poisson rouge (identique);
  • make ARCH = arm goldfish_defconfig (idem);
  • make ARCH = arm CROSS_COMPILE = mydroid / préconfiguré / 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 moi).

Ceci est une mise à jour des réponses de BMB et Arnaud LM.
Il semble que les noms de branches de poisson rouge aient été modifiés à partir du 2011/03/03. Lors de la vérification de 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 cela fait gagner du temps à quelqu'un.

À partir de 2012, le téléchargement du noyau est bien documenté sur source.google.com. Toutefois, 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 à cette question - j'ai pu le faire avec des fragments de cette réponse. "Vous avez besoin du DAV" d'Amaund a été la dernière pièce qui m'a posé problème.

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 out/ répertoire de construction occupe environ 90 Go, et le reste de l’arbre environ 40 Go, à l’exclusion de CCACHE.

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

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

 entrer la description de l'image ici

Notes:

  • ./repo init -b DOIT pointer vers une balise . master branche est toujours en panne, de même que -release branches.

    La liste des balises est disponible à l'adresse suivante: https://android.googlesource.com/platform/ manifeste 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é à huis clos et le code est abandonné. Par conséquent, les développeurs Google et OEM ont déjà une tonne de paches au-dessus du public & "Maître &"; Et ont déjà résolu le problème.

      Pour la même raison, il est probablement inutile d'essayer de signaler les erreurs de construction 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 version la plus récente de tous les 650 dépôts git constituant un point de départ uniformisé pour une branche donnée, sans les synchroniser comme des sous-modules. Par conséquent, rien ne garantit leur compatibilité. Les tags récupèrent toutefois un tag spécifique de tous les dépôts.

  • --depth 1 et sync -c --no-tags --no-clone-bundle tentaient de rendre le clone extrêmement lent plus rapidement. Je ne sais pas à quel point c'était réussi. Voir aussi: La synchronisation des référentiels AOSP prend trop de temps

  • Nous utilisons lunch aosp_x86_64-eng au lieu d'ARM, car l'exécution est beaucoup plus rapide en raison des extensions de virtualisation hôte x86.

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

    De plus, l’image ARM est défectueuse, peut-être à cause de la lenteur? Lorsque l'interface graphique démarre (si vous avez de la chance), elle indique & "L'interface utilisateur système ne répond pas &". Voir aussi: Le système de traitement ne répond pas dans l'émulateur Android

  • -show-kernel relie le terminal à un port série, c’est-à-dire que vous voyez les messages d’amorçage et que vous obtenez un shell à la fin, ce qui est très utile pour déboguer des choses.

  • type emulator montre qu'il ne s'agit que d'un alias de emulator sans aucun argument. Exécuter une ROM personnalisée sur l'émulateur Android vous demande comment passer des arguments afin de 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 exacts de la ligne de commande QEMU à l'aide de:

    emulator -verbose | grep 'emulator: argv'
    

    tel que mentionné à: Comment afficher les options transmises à QEMU lors du lancement de l'émulateur Android?

    Ceci montre certaines options personnalisées, par exemple -android-hw, ils doivent donc avoir spécifié QEMU: Emulateur QEMU vs Android: ligne de commande options La source change apparemment de lieu toutes les 5 minutes: 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 de l'androïde entier. Cela prend un certain temps, mais n’est-ce pas compliqué?

En construisant cela, vous aurez votre sortie dans le répertoire <android>/out. Cela inclut, outre les images ROM, de nombreux outils, 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 sur <android>/out/target/product/generic. Ensuite, si vous exécutez l’émulateur sans aucune option, votre ROM compilée sera exécutée.

À compter de mai 2012, j'ai constaté que vous ne pouviez pas utiliser "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é-construit) fonctionne et est nécessaire.

goldfish_defconfig configure le noyau pour qu'il s'exécute sur un processeur ARM 926, mais l'émulateur est configuré pour s'exécuter en tant que Coretex A8 (qui est un processeur ARM V7). Vous devez donc utiliser le nouveau defconfig si vous voulez que cela fonctionne (ou extrayez la configuration de l'émulateur).

Seulement pour info.

La manière dont j'ai pu démarrer la rom AOSP que j'ai compilée a été de copier le fichier system.img compilé dans ~ / .android / avd / Froyo.avd / Mais, lorsque j'extrais le fichier system.img et que j'ajoute la version enracinée de su et busybox, puis que je refais le fichier system.img, l'émulateur ne démarre pas. J'essaie encore de comprendre cette partie: S

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top