5 мая 2013 г.

Компиляция ядра Linux для Android устройств с помощью NDK или Linaro


В этой статья я постарался написать универсальную инструкцию по сборке ядра для android устройств.

ВНИМАНИЕ: Всё действия, описанные в данной статье, вы будете делать на свой страх и риск. Автор не несёт никакой ответственности за повреждение вашего устройства.

Рекомендую тщательно изучить специализированный материал по вашему аппарату.
Приведённые ниже команды нужно выполнять в терминале.

I. Подготовка

1.1. Для начала нужно установить 64-разрядный Linux дистрибутив Ubuntu (для компиляции ядра я использовал Ubuntu 13.04 x64). В принципе, если у вас нормальный ПК, то можно поставить на виртуальную машину. Как установить Ubuntu в VirtualBox по версии Google.

1.2. Также нужно иметь исходный код ядра вашего устройства (например, для Nook Color). Вот несколько ссылок, по которым вы можете получить исходники:
HTC
LG
SAMSUNG
SONY
1.3. Установить Android SDK Tools

1.4. Скачать NDK Linux 32-bit (x86)

1.5. Скачать Linaro инструментарий

1.6. После установки нужно создать необходимые папки в домашней директории:
mkdir -p ~/Kernel ~/Kernel_output/modules ~/NDK ~/LINARO
Kernel - Корневая директория исходного кода ядра вашего устройства. Его можно получить через git clone (например, если располагается на github.com) или просто распаковав скачанный архив c исходниками.

ПРИМЕР: Получения нужных файлов с GitHub.com для планшета B&N Nook Color (encore):
git clone https://github.com/CyanogenMod/android_kernel_bn_encore.git
Kernel_output - Здесь будет итоговый файл ядра после компиляции (uImage).
Kernel_output/modules - А здесь будут располагаться модули ядра (*.ko) после компиляции.
NDK - Корневая директория NDK. Сюда распаковываем скаченный ранее NDK Linux 32-bit (x86).
LINARO - Корневая директория Linaro. Сюда распаковываем скаченный ранее Linaro инструментарий.

II. Компиляция ядра с помощью NDK или Linaro

2.1. Переходим в корневую папку ядра
cd Kernel
2.2. Делаем экспорт системных переменных (работают только на сессию с текущим терминалом)

2.2.1. Во первых, объявим переменную, которая указывает на целевую архитектуру компиляции (ARM)
export ARCH=arm
2.2.2. Во вторых, также объявим переменную, которая указывает на сами исполняемые файлы инструментария для NDK (пункт 2.2.2.1) или для Linaro (пункт 2.2.2.2).

Для заметки: Можно использовать только одну переменную CROSS_COMPILE, если вы введёте все ниже следующие команды, то последняя окажется действующей. Можно проверить командой export без параметров и посмотреть ваши переменные.

2.2.2.1. Для NDK (GCC 4.4.3, GCC 4.6.x или GCC 4.7.x соответственно)
export CROSS_COMPILE=~/NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-
или
export CROSS_COMPILE=~/NDK/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/arm-linux-androideabi-
или
export CROSS_COMPILE=~/NDK/toolchains/arm-linux-androideabi-4.7/prebuilt/linux-x86/bin/arm-linux-androideabi-
2.2.2.2. Для Linaro
 export CROSS_COMPILE=~/LINARO/bin/arm-linux-androideabi-
2.3. Чистим директорию ядра от прошлых операций и приводим в порядок
make clean && make mrproper
На некоторых 64 разрядных дистрибутивах Ubuntu необходимо установить 32 битные библиотеки, чтобы избежать ошибку "... : Command not found"
sudo apt-get install ia32-libs
2.4. Получаем файл конфигурации

2.4.1. Он обычно находится в ~/Kernel/arch/arm/configs, где нужный файл будет примерно таким: *_defconfig или *.defconfig (где * - (кодовое) название вашего устройства)

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

Способ 1. На самом девайсе в Terminal Emulator набрать
cp /proc/config.gz /sdcard
На microSD карте появиться архив config.gz, распаковываем его в корневую директорию исходников ядра (~/Kernel) и переименовываем файл из config в .config

Способ 2. Через ADB
adb pull /proc/config.gz .
gunzip config.gz
mv config .config
Если вы получили файл конфигураций с устройства, то переходите к пункту 2.5

2.4.2. Введите следующую команду
make *_defconfig
2.5.  Если нужно, производим модификации файла конфигурации
make menuconfig
На некоторых дистрибутивах Ubuntu (например, 12.04) чтобы использовать "make menuconfig" необходимо установить ncurses
sudo apt-get install libncurses5 libncurses5-dev
Если требуется подгружать в ядро собственные модули, то необходимо выбрать соответсвующий пункт в меню:
[*] Enable loadable module support
После внесённых изменений необходимо сохранить файл конфигурации.

2.6.  Компилируем ядро
make -j4 uImage
или
make -j4 zImage
или
make -j4 Image
Выполняем подходящую команду компиляции. В случаем компиляции uImage или zImage не cжатый образ ядра Image компилируется автоматически.

Цифра после -j означает количество ядер центрального процессора ПК (у меня 4).

uImage, zImage или просто Image - образ скомпилированного ядра.

Если в процессе компиляции uImage у вас выходит ошибка "mkimage" command not found - U-Boot images will not be built, то установите недостающий пакет:
sudo apt-get install uboot-mkimage
и начните с пункта 2.3

2.7.  Если необходимы модули ядра, то компилируем и их
make modules
2.8)  Копируем скомпилированное ядро в директорию ~/Kernel_output
cp arch/arm/boot/uImage ../Kernel_output/uImage
или
cp arch/arm/boot/zImage ../Kernel_output/zImage
или
cp arch/arm/boot/Image ../Kernel_output/Image
Выполняем команду соответствующую нужному скомпилированному ядру.

2.9. Если компилировали и модули, то копируем их в директорию ~/Kernel_output/modules
find . -name "*.ko" -exec cp {} ../Kernel_output/modules \;
III. Установка ядра (и модулей к нему) на устройство

Для устройств с boot.img - нужно сначала собрать соответствующий вашему устройству образ boot.img, а только потом уже проводить нижеследующие операции.
Несколько ссылок для размышлений:
Инструкции по распаковке, редактированию и запаковке boot.img
Очень удобные скрипты для редактирования boot.img

Способов установки ядра (и модулей к нему) на устройство несколько, рассмотрим основные:

3.1. Простая замена файлов *.zip архив обновления ядра или прошивки для ClockworkMod Recovery (CWM)

Нужно заполучить *.zip архива обновления ядра или прошивки для CWM под ваше устройство и произвести замену файлов на новые. В корне архива может находится kernel или uImage или zImage или boot.img - нужно его удалить и взамен поместить ваши файлы с названием удалённого файла (если был kernel, то конечный файл тоже должен быть kernel). А модули поместить в директорию system\lib\modules\. Произвести инсталляцию через CWM.

3.2. Поместить скомпилированные файлы на девайс с помощью ADB и Fastboot. Более подробно можно почитать здесь.

IV. Заключение

Если вы снова захотите скомпилировать ядро, то повторите все шаги начиная с пункта 2.1

Комментариев нет

Отправить комментарий