Как скомпилировать ядро ​​Android AOSP и протестировать его с помощью эмулятора Android? - PullRequest
49 голосов
/ 27 ноября 2009

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

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

Ответы [ 8 ]

55 голосов
/ 17 февраля 2010

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

  • Получите ядро ​​Android, добавив его в манифест репо или вручную, запустив:
    git clone https://android.googlesource.com/kernel/goldfish.git
  • Проверьте правильную ветку для работы с эмулятором, т.е. goldfish:
    git checkout -t origin/android-goldfish-2.6.29 -b goldfish
  • Генерация конфигурации эмулятора (эмулятор qemu запускает код охраны, то есть конфигурацию охраны):
    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 с аппаратным обеспечением, оно может быть более интересным для вас.

19 голосов
/ 20 июля 2010

Просто чтобы исправить некоторые вещи из поста 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 (idem);
  • make ARCH = arm CROSS_COMPILE = mydroid / prebuilt / linux-x86 / toolchain / arm-eabi-4.2.1 / bin / arm-eabi- (idem)
  • эмулятор -avd my_avd -kernel mydroid / kernel / common / arch / arm / boot / zImage (здесь я добавил avd в команду, без меня она не работала).

8 голосов

Полностью автоматизированный гость 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 минуты после запуска эмулятора на главном экране отображается:

image

and if you press enter on the host terminal Android was launched from, you get a shell on to the Android system on your host terminal:

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, поэтому они, должно быть, разветвились *

8 голосов
/ 03 мая 2012

Начиная с 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» был последним произведением, которое доставило мне неприятности.

8 голосов
/ 04 марта 2011

Это обновление для ответов BMB и Arnaud LM.
Похоже, что фирменные наименования золотых рыбок были изменены с 2011/03/03. При проверке ветви золотой рыбки используйте это:

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

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

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

6 голосов
/ 28 ноября 2009

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

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

4 голосов
/ 04 мая 2012

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

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

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

1 голос
/ 05 сентября 2010

Способ, которым я смог загрузить скомпилированный AOSP, состоял в том, чтобы скопировать system.img, скомпилированный в ~ / .android / avd / Froyo.avd / Но когда я извлекаю system.img и добавляю рутированные версии su и busybox, а затем переделываю system.img, эмулятор не загружается. Я все еще пытаюсь понять эту часть: S

...