Сборка из исходников

Настройка среды

Сборка проекта производится в линукс Ubuntu 16.04. Установите ОС. Запустите терминал.

Далее следует установить дополнительные компоненты, необходимые для работы системы сборки. Для этого выполняем следующие команды

sudo apt-get update
sudo apt-get install git-core gnupg flex bison gperf zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip libssl-dev

Загрузка исходных кодов Андроид

Далее необходимо загрузить исходные коды Андроид.

Для загрузки из репозитория Штрих-М выполните команду

> git clone http://gitim.shtrih-m.ru/shtrih/im4.git

Подготовка к сборке

В составе с исходными кодами поставляется скрипт сборки SL8541E_E_unisoc_userdebug.sh. Он предназначен для комплексной сборки всего проекта с предварительной очисткой результатов предыдущей сборки. Выполнять его при каждом изменении нерационально, т.к. пересборка занимает значительное время. Однако в первый раз его следует запустить для подготовки среды сборки и компиляции необходимых библиотек, утилит и т.д. Также при его запуске произойдет компиляция множества пакетов Андроид, которые вряд ли потребуют изменения в будущем. Запустите этот скрипт, указав режим сборки userdebug

SL8541E_E_unisoc_userdebug.sh userdebug

Создайте в корне проекта следующие скрипты для более целевой компиляции необходимых компонентов проекта

Примечание

Эти скрипты сделаны из скрипта SL8541E_E_unisoc_userdebug.sh и выполняют частные случаи запуска для облегчения и упрощения работы

!!! в строке запуска make внутри скриптов следует заменить порядок аргументов. Должно быть make bootloader -j8, а на make -j8 bootloader.

Примечание

Необходимо отметить, что для получения корректного результата, сборка требует определенной последовательности выпонения скриптов. Не все скрипты выполняют все действия «до конца». Например, сборка модулей ядра не выполняется при сборке кернела линукса, а только при выполнениее скрипта make_super.sh, который собирает так называемый супер image. После компиляции модули ядра должны быть помещены в образ socko.img. Скрипт make_super.sh этого не делает. Для обновления socko.img необходимо запускать make_all.sh. Только он собирает образ socko.img Но он не перекомпилирует модули ядра. Т.о. если в модуль ядра были внесены изменения или в файлы конфигурации проекта добавлены новые модули, то запуск make_all.sh не добавит их в socko.img, а поместит в него старые файлы модулей. Т.е. для правильной сборки нового модуля необходимо сперва выполнить make_super.sh, а затем make_all.sh.

Файл общих параметров проекта

В нем указывается название проекта и дополнительные параметры, которые используются во всех скриптах сборки

config.sh

#!/bin/bash

project=sl8541e_1h10wifi5g_32b_Natv-userdebug-gms
project_out=sl8541e_1h10wifi5g_32b
board_type=sl8541e_1h10wifi5g_32b_Natv
user_variant=userdebug
option=gsm
CODE_ROOT_PATH=`pwd`

Скрипт сборки uboot

Данный скрипт пересобирает uboot и формируют образ загрузчика u-boot-sign.bin. Дополнительно этот скрипт формирует образы fdl2-sign.bin, u-boot-autopoweron-sign.bin. Все эти файлы участвуют в сборке конечного образа, загружаемого в модуль.

make_uboot.sh

#!/bin/bash
. config.sh
source build/envsetup.sh
choosecombo 1 $board_type $user_variant $option
make bootloader -j8 2>&1

Скрипт сборки ядра линукс

Данный скрипт пересобирает ядро линукс и формирует образ boot.img. Также он формирует образ dtb.img, содержащий Device-tree

make_kernel.sh

#!/bin/bash
. config.sh
source build/envsetup.sh
choosecombo 1 $board_type $user_variant $option
make bootimage -j8 2>&1

Скрипт сборки system.img

Данный скрипт выполняет работу предыдущих скриптов (uboot, kernel, DT), пересобирает системную область Андроида и формирует образ system.img. Также он пересобирает и формирует образ recovery.img, ramdisk-recovery.img

Также пересобирает модули ядра (!!! но не формируется образ socko.img).

make_system.sh

#!/bin/bash
. config.sh
source build/envsetup.sh
choosecombo 1 $board_type $user_variant $option
make systemimage -j8 2>&1

Скрипт сборки vendor.img

Данный скрипт выполняет сборку образа vendor.img, включающего исходные коды, специфичные для производителей чипсета и внешнего оборудования, такого как камеры и т.д.

make_vendor.sh

#!/bin/bash
. config.sh
source build/envsetup.sh
choosecombo 1 $board_type $user_variant $option
make vendorimage -j8 2>&1

Скрипт сборки супер образа

Данный скрипт выполняет работу предыдущих скриптов: пересобирает uboot, ядро линукс, Device-tree, модули ядра. !!! При этом для Device-tree пересобираются также оверлейные модули (образ dtbo.img), которые не затрагиваются при выполнении make_kernel.sh и make_system.sh.

Дополнительно формирует следующие образы: fdl1-sign.bin, sml-sign.bin, super.img, super-gsi32.img, tos-sign.bin, uboot-spl-16k-sign.bin.

make_super.sh

#!/bin/bash
. config.sh
source build/envsetup.sh
choosecombo 1 $board_type $user_variant $option
make superimage -j8 2>&1

Скрипт сборки product.img

Данный скрипт выполняет сборку образа product.img.

make_product.sh

#!/bin/bash
. config.sh
source build/envsetup.sh
choosecombo 1 $board_type $user_variant $option
make productimage -j8 2>&1

Скрипт сборки userdata.img

Данный скрипт выполняет сборку образа userdata.img.

make_userdata.sh

#!/bin/bash
. config.sh
source build/envsetup.sh
choosecombo 1 $board_type $user_variant $option
make userdataimage -j8 2>&1

Завершающий скрипт сборки

Данный скрипт выполняет окончательную сборку проекта, формирование различных необходимых .img и .bin файлов, образа socko.img.

make_all.sh

#!/bin/bash
. config.sh
source build/envsetup.sh
choosecombo 1 $board_type $user_variant $option
make all -j8 2>&1
. note::

Данный скрипт не всегда пересобирает изменения, сделанные в исходных кодах. В основном он формирует файлы образов из скомпилированных ранее (другими скриптами) готовых объектных и бинарных файлов. Необходимо это учитывать и выполнять сборку, сперва запуская скрипты, предназначенные для перекомпиляции изменений в конкретных частях проекта.

Скрипт сборки PAC файла

Конечной стадией сборки является формирование PAC файла для заливки его в модуль утилитой ResearchDownloader, поставляемой производителем чипсета. Скрипт формирует файл, в который входят все .img и .bin файлы, которые были сформированы на предыдущих этапах.

make_pac.sh

#!/bin/bash
echo SL8541E-E > PROJECT_NAME
project=sl8541e_1h10wifi5g_32b_Natv-userdebug-gms
CODE_ROOT_PATH=`pwd`
RELEASE_IDH_PATH=vendor/sprd/release/IDH
source build/envsetup.sh
choosecombo 1 sl8541e_1h10wifi5g_32b_Natv userdebug gms
project_out=${project%_*}
SW_VERSION_NAME=`sed -n 's/unisoc.full.sw.version=\(.*\)/\1/p' < $CODE_ROOT_PATH/out/target/product/${project_out}/system/build.prop`
cp_sign
echo "cp sign finish\n\n"
echo " SW_VERSION_NAME:$SW_VERSION_NAME"
sed -i "s/ProductVer=.*/ProductVer=${SW_VERSION_NAME}/" $CODE_ROOT_PATH/out/target/product/${project_out}/cp_sign/SHARKLE_8541e_32b_halo/pac.ini
makepac
if [ ! $? -eq 0 ]; then
        echo "pac error"
        return
fi
echo "##################### END TO COMPILE ANDROID CODE ####################"
echo ${SW_VERSION_NAME}.pac
TMP_PAC_PATH=out/target/product/sl8541e_1h10wifi5g_32b/cp_sign/SHARKLE_8541e_32b_halo
cp $TMP_PAC_PATH/*.pac ${SW_VERSION_NAME}.pac

Процесс сборки

После формирования всех скриптов и учитывая все вышеописанные комментарии, последовательность сборки проекта такая:

> ./SL8541E_E_unisoc_userdebug.sh userdebug
> ./make_super.sh
> ./make_product.sh
> ./make_userdata.sh
> ./make_all.sh

После выполнения данных скриптов следует проверить, что все необходимые образы

u-boot-sign.bin
u-boot-autopoweron-sign.bin
uboot-spl-16k-sign.bin
fdl1-sign.bin
fdl2-sign.bin
boot.img
dtb.img
dtbo.img
system.img
recovery.img
ramdisk-recovery.img
vendor.img
sml-sign.bin
super.img
super-gsi32.img
tos-sign.bin
product.img
userdata.img
socko.img
odmko.img
cache.img
persist.img
prodnv.img

находятся в папке

out/target/product/sl8541e_1h10wifi5g_32b/

Далее запускаем скрипт

> ./make_pac.sh

Если все прошло успешно, результирующий .pac файл должен появиться в корневой папке проекта