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

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

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


person Zyris Development Team    schedule 27.11.2009    source источник


Ответы (8)


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

  • Получите ядро ​​Android, добавив его в манифест репо или вручную, запустив:
    git clone https://android.googlesource.com/kernel/goldfish.git
  • Найдите правильную ветку для работы с эмулятором, например, золотую рыбку:
    git checkout -t origin/android-goldfish-2.6.29 -b goldfish
  • Generate the emulator configuration (qemu emulator runs arm code, i.e. an arm config):
    make ARCH=arm goldfish_defconfig
    • if that doesn't work, try 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 с оборудованием, это может быть вам более интересно.

person BMB    schedule 17.02.2010
comment
Спасибо за дополнительную информацию! Поскольку большая часть документации Android представлена ​​в форме обсуждений в группах Google, подобные сообщения весьма полезны. - person Mr. Shickadance; 15.06.2010
comment
когда я пытаюсь загрузить исходный код ядра, я получаю следующую ошибку: android.git.kernel.org [0: 149.20.4.77]: errno = В соединении отказано, фатальный: невозможно подключить сокет (в соединении отказано, можете ли вы предложить мне альтернативный путь скачать исходный код. - person CoDe; 04.02.2012
comment
Местоположение ядра эмулятора изменилось с переходом на android.googlesource.com после простоя kernel.org. Я обновил сообщение, чтобы оно было правильным. - person BMB; 05.02.2012

Just to correct a few things from BMB's post (which was very useful to me, it saved my project) :

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

person Arnaud LM    schedule 20.07.2010
comment
Спасибо за дополнительную информацию. Я отредактировал свой пост, включив в него правильный путь к ядру, извините. - person BMB; 23.07.2010
comment
Как добавить несколько AVD с помощью скрипта prebuilts / devtools / tools / android? он дает ошибку ava.lang.ClassNotFoundException: com.android.sdklib.repository.SdkRepoConstants - person Toral; 17.10.2019

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

введите описание изображения здесь

Примечания:

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

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

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

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

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

    • 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

    Все «обычные высокоуровневые вещи», которые вы делаете в собственных API-интерфейсах Java / C ++, теоретически должны работать одинаково и на x86, и на ARM, поэтому это не имеет значения, если вы не достаточно хардкорны, чтобы вручную коснуться какой-либо сборки.

  • -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 vs Android emulator: параметры командной строки Источник перемещает местоположение каждые 5 минут, по-видимому: Изменение исходного кода эмулятора Android

person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 17.01.2018
comment
Не удается запустить эмулятор, отображается сообщение «Эмулятор: ОШИБКА: AVD не указан». С моей точки зрения, он должен собирать и строить образ, поэтому вы не указали ни один avd в своей команде. Есть ли у вас здесь какие-нибудь мысли? - person Gleichmut; 20.07.2018
comment
@Gleichmut хммм, я помню, что псевдоним emulator просто работал, я думаю, он указывал на все необходимые изображения. Я дважды проверю это позже, дайте мне знать, если вы что-нибудь узнаете. - person Ciro Santilli 新疆再教育营六四事件ۍ 20.07.2018
comment
Кстати, также на моей машине рано я столкнулся с одной проблемой, которая была решена этой строкой export LC_ALL = C. Возможно, это пригодится кому-то в будущем. - person Gleichmut; 20.07.2018
comment
@Gleichmut Я только что подтвердил, что только emulator работал над моей сборкой, появляется графический интерфейс эмулятора. Вы запускали и . build/envsetup.sh, и lunch aosp_x86_64-eng в оболочке перед запуском emulator? - person Ciro Santilli 新疆再教育营六四事件ۍ 22.07.2018
comment
Да. Мне удалось запустить образ руки, x86 все еще проблема. - person Gleichmut; 23.07.2018
comment
Загрузите исходный код. Занимает несколько минут, зеркало заняло почти 2880 минут на моем домашнем подключении :-) - person Olaf Dietsche; 17.10.2019
comment
@OlafDietsche хммм, это было у меня дома 38 Мбит / с, и я почти уверен, что это было не больше часа - person Ciro Santilli 新疆再教育营六四事件ۍ 17.10.2019
comment
Думаю, разница в загрузке всего зеркала и только ветки с --depth=1 - person Olaf Dietsche; 17.10.2019

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

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

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

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

person hopia    schedule 03.03.2011

По состоянию на 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» Амонда была последней статьей, которая доставила мне неприятности.

person JohnnyLambada    schedule 03.05.2012
comment
Это очень помогло, спасибо. Однако в вашем коде есть небольшая опечатка. Вместо make ARCM=arm menuconfig это make ARCH=arm menuconfig. Обнаружил это слепым копированием и вставкой и получением ядра x86 ;-) - person Diego Medaglia; 02.04.2013

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

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

person Mostafa    schedule 28.11.2009
comment
Мы не собирались компилировать эмулятор, а специально собирались скомпилировать ядро ​​Android и взять этот скомпилированный образ и запустить его в эмуляторе. - person Zyris Development Team; 29.11.2009
comment
Так можно запустить скомпилированный образ исходного кода Android. Я делаю это каждый день. Вы просто скомпилируете исходный код Android, и у вас будет эмулятор для его запуска. - person Mostafa; 29.11.2009
comment
Как мы уже говорили выше, не собирались компилировать исходный код эмулятора. Мы искали ядро ​​ANDROID (android.git.kernel.org) - person Zyris Development Team; 29.11.2009
comment
Этот ответ мне все равно помог :) - person Sungwon Jeong; 03.01.2011

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

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

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

person Tim Bird    schedule 04.05.2012

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

person triki    schedule 04.09.2010