Как скомпилировать ядро Android AOSP и протестировать его с помощью эмулятора Android? - программирование
Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

С августа 2009 года ядро ​​больше не является частью стандартного манифеста repo, который вы получаете, когда следуете инструкциям по загрузке исходного кода для проекта с открытым исходным кодом 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 с оборудованием, это может быть более интересно вам.

Ответ 2

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

  • git clone git://android.git.kernel.org/kernel/common.git(ядро пропущено);
  • git checkout -t origin/android-goldfish-2.6.29 -b золотая рыбка (то же самое);
  • 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 (здесь я добавил в команду avd, это не сработало без меня).

Ответ 3

Полностью автоматизированный гость 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, включая KVM.

    Вместо этого, чтобы создать версию 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

Ответ 4

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

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

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

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

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

Просто FYI.

Ответ 8

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