Как скомпилировать ядро ​​Android AOSP и протестировать его с помощью эмулятора Android?

StackOverflow https://stackoverflow.com/questions/1809774

Вопрос

Кто-нибудь успешно скомпилировал ядро ​​Android и протестировал его в эмуляторе Android, и если да, то нужно ли сделать что-то особенное?

Документация для SDK отличная, однако мне было трудно найти документацию по компиляции ядра и настройке специальной машины в эмуляторе.

Это было полезно?

Решение

С августа 2009 года ядро ​​больше не является частью стандартного манифеста репозитория, который вы получаете, следуя инструкциям по загрузке исходного кода проекта Android с открытым исходным кодом.Шаги, необходимые для успешной загрузки, сборки и запуска определенного ядра на эмуляторе, следующие:

  • Получите ядро ​​Android, добавив его в манифест репозитория или вручную, выполнив:
    git clone https://android.googlesource.com/kernel/goldfish.git
  • Посмотрите правильную ветку по работе с эмулятором, т.е.золотая рыбка:
    git checkout -t origin/android-goldfish-2.6.29 -b goldfish
  • Сгенерируйте конфигурацию эмулятора (эмулятор qemu запускает код Arm, т.е.конфигурация руки):
    make ARCH=arm goldfish_defconfig
    • если это не сработает, попробуй make ARCH=arm goldfish_armv7_defconfig
  • Теперь соберите ядро, используя инструменты кросс-компиляции, поставляемые вместе с проектом с открытым исходным кодом:
    make ARCH=arm CROSS_COMPILE=mydroid/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-
  • Ядро, созданное таким образом, должно оказаться в папке Arch/arm/boot вашего дерева ядра (куда вы поместили код из git clone).
  • Чтобы запустить эмулятор с вашим ядром, есть два варианта: либо скопировать его в предварительно созданную папку ядра проекта с открытым исходным кодом, чтобы заменить стандартное ядро.Другой вариант — запустить эмулятор с установленными параметрами ядра:
    emulator -kernel mydroid/kernel/common/arch/arm/boot/zImage

Обратите внимание, что в приведенном выше описании я использовал пути по умолчанию, вам необходимо изменить их на те, которые применимы к вашей настройке.Прошло некоторое время с тех пор, как я в последний раз проверял это, но думаю, что это должно сработать.

Некоторая дополнительная информация:В стандартном дистрибутиве Android с открытым исходным кодом ядро ​​распространяется в виде предварительно собранного двоичного файла в виде mydroid/prebuilt/android-arm/kernel папка и исходный код не включены.Исходный код ядра был удален из манифеста по умолчанию по двум причинам.Во-первых, для компонента платформы, с которым большинство людей не будут много работать, требуется много полосы пропускания и дискового пространства.Другая причина заключается в том, что, поскольку ядро ​​собирается с помощью системы сборки ядра, а не как часть системы сборки aosp, имеет смысл хранить его отдельно.Общая ветка ядра — это та, которая используется эмулятором.Также есть ветки для экспериментальных, MSM (платформы Qualcomm) и Omap (платформа TI) и, возможно, еще какие-то.Если вы хотите использовать ядро ​​Android с аппаратным обеспечением, это может быть вам более интересно.

Другие советы

Просто исправлю несколько вещей из сообщения BMB (что было очень полезно для меня, оно спасло мой проект):

  • git clone git://android.git.kernel.org/kernel/common.git ( ядро пропущенный) ;
  • git checkout -t origin/android-goldfish-2.6.29 -b goldfish (то же самое) ;
  • make ARCH=arm goldfish_defconfig (то же самое) ;
  • make ARCH=arm CROSS_COMPILE=mydroid/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- (то же самое)
  • эмулятор -avd my_avd -kernel mydroid/kernel/common/arch/arm/boot/zImage (здесь я добавил AVD в команде, у меня без этого не получилось).

Это обновление ответов BMB и Арно Л.М.
Кажется, названия ветвей золотых рыбок были изменены с 3 марта 2011 г.При проверке ветки золотых рыбок используйте это:

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

Обратите внимание на отсутствующую букву «o» в android-gldfish-2.6.29!

Надеюсь, это сэкономит кому-то время.

По состоянию на 2012 год загрузка ядра хорошо документирована на source.google.com, однако я обнаружил, что для его компиляции потребовалось несколько попыток.Вот команды, которые я использовал для сборки ядра для эмулятора 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 &

Спасибо всем, кто ответил на этот вопрос - я смог сделать это с помощью фрагментов этого ответа.«Вам нужен AVD» Амунда было последним произведением, которое доставило мне неприятности.

Полностью автоматизированный гость Android 8.1 на хосте 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

А out/ Каталог сборки занимает около 90Гб, а остальная часть дерева около 40Гб, не считая CCACHE.

Примерно через 1-2 минуты после запуска эмулятора на главном экране появляется:

и если вы нажмете Enter на хост-терминале, с которого был запущен Android, вы получите оболочку для системы Android на вашем хост-терминале:

enter image description here

Примечания:

  • ./repo init -b ДОЛЖЕН указывать на тег. master ветка всегда сломана, и так было -release ветви.

    Список тегов можно найти по адресу: https://android.googlesource.com/platform/manifest или клонировав это репо.

    Вероятно, есть две причины, по которым ветки всегда ломаются:

    • Android разрабатывается за закрытыми дверями, а код отсутствует.Поэтому разработчики Google и OEM уже имеют массу патчей поверх общедоступного «master» и уже устранили проблему.

      По той же причине, вероятно, бесполезно пытаться сообщать об ошибках сборки на мастере:о них уже сообщили и исправили.Также я смею вас даже найти подходящее официальное место, чтобы сообщить об ошибках сборки.

    • repo sync в ветке просто извлекается последняя версия всех 650 репозиториев git, составляющих AOSP для данной ветки, без синхронизации их, как подмодулей.Поэтому ничто не гарантирует их совместимость.Однако теги извлекают определенный тег из всех репозиториев.

  • --depth 1 и sync -c --no-tags --no-clone-bundle были попыткой сделать мучительно медленный клон быстрее.Не уверен, насколько это было успешно.Смотрите также: Синхронизация репозитория AOSP занимает слишком много времени

  • Мы используем lunch aosp_x86_64-eng вместо ARM, поскольку он работает намного быстрее благодаря расширениям виртуализации хоста x86.

    Вместо этого, чтобы создать версию ARM, просто используйте lunch aosp_arm-eng вместо.

    Кроме того, образ ARM глючит, возможно, из-за медлительности?Когда запускается графический интерфейс (если вам повезет), он показывает: «Системный интерфейс не отвечает».Смотрите также: Система процессов не отвечает в эмуляторе Android

  • -show-kernel привязывает терминал к последовательному порту, т.е.вы видите загрузочные сообщения и в конце получаете оболочку, что очень полезно для отладки.

  • type emulator показывает, что это просто псевдоним emulator без всяких аргументов. Запустите пользовательское ПЗУ на эмуляторе Android спрашивает, как передать некоторые аргументы, чтобы явно выбрать ваше ПЗУ.

    Эмулятор -help цели на удивление проницательны:

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

    Вы можете определить точные аргументы командной строки QEMU, заданные с помощью:

    emulator -verbose | grep 'emulator: argv'
    

    как упоминалось в: Как показать, какие параметры передаются в QEMU при запуске эмулятора Android?

    Здесь показаны некоторые пользовательские параметры, например. -android-hw, поэтому они, должно быть, разветвили QEMU: QEMU против эмулятора Android:параметры командной строки Судя по всему, источник меняет местоположение каждые 5 минут: Изменение исходного кода эмулятора Android

Это легко.Следуйте инструкциям на http://source.android.com/download для получения и компиляции исходного кода всего андроида.Это занимает некоторое время, но не так уж и сложно.

Построив это, вы получите вывод в <android>/out каталог.Помимо образов ПЗУ это включает в себя множество инструментов, включая эмулятор.Мой эмулятор находится по адресу <android>/out/host/linux-x86/bin/emulator.Просто установите переменную среды с именем ANDROID_PRODUCT_OUT к <android>/out/target/product/generic, а затем запуск эмулятора без каких-либо опций запустит ваш скомпилированный ПЗУ.

По состоянию на май 2012 года я обнаружил, что вы не можете использовать «goldfish_defconfig» для компиляции ядра.Вам нужно использовать goldfish_armv7_defconfig'.Это объясняет, почему метод JonnyLambada по извлечению конфигурации из эмулятора (для предварительно собранного ядра) работает и необходим.

goldfish_defconfig настраивает ядро ​​для работы на процессоре ARM 926, но эмулятор настроен для работы в качестве процессора Coretex A8 (который является процессором ARM V7).Поэтому вам нужно использовать более новую версию defconfig, если вы хотите, чтобы она работала (или вытащить конфигурацию из эмулятора).

Просто к вашему сведению.

То, как я смог загрузить AOSP ROM, который я скомпилировал, было скопировать систему. Img, которая была скомпилирована в ~/.Android/avd/froyo.avd/, но когда я извлекаю систему и добавляю корневую версию SU и BusyBox, затем переделать систему. Имг, эмулятор не загружается.Я все еще пытаюсь понять эту часть :S

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top