Russian Chinese (Simplified) English
Войти

Представляю вам небольшой ремейк статьи (инструкции, мануала), которую я в свое время опубликовал на 4PDA. Многим статья понравилась и мне это очень приятно!
Однако как и в любой другой статье, в ней имелись некоторые неточности и, в общем, было что добавить (учитывая просьбы и вопросы форумчан 4PDA).
Сразу оговоримся, я не буду рассказывать как собрать андроид 5.x и выше, для себя я остановился на 4.4 (если интересно почему я так не люблю все что выше KitKat - пишите в личку, растолкую). Объяснять буду также на примере 4.1 и надеюсь, что многие в последствии поймут, что цифры не имеют значения, т.к. для любой версии Android процесс похож на 90%.

И еще, не поленитесь изучить самые базовые основы ОС Linux и основные терминальные команды (для тех кто в "Виндоус", командная строка).

Инструкция будет разделена на этапы, с простым, понятным для новичков объяснением. Все буду объяснять на примере сборки андроида для одного из своих девайсов, китайского телефона - Newman N2, а именно сборку CyanogenMod 10 с нуля, т.е. не имея никаких исходников от производителя. Будут присутствовать элементы портирования, также поделюсь некоторыми "ухищрениями", которые мне лично помогают. Постараюсь ответить на многие вопросы начинающих ромоделов, таких как: "Как начать?", "Что установить?", "Где взять?".  И так, приступим!

Этап 1. Выбор среды развертывания. Хост или ВМ?

Это как говорится по вкусу и по обстоятельствам. Если вы не хотите ставить линукс второй системой или же у вас на HDD всего 1 раздел и тот "битком набит", то лучше воспользоваться виртуальной машиной. Для развертывания ВМ сгодится VM Ware или VirtualBox...НО! Если вы всерьез решили заняться этим делом, я категорически советую вам не полениться, и все таки разбить ваш жесткий диск на разделы и поставить второй осью линукс!

Почему?
* Работать будет быстрее.
* Не будет ошибок при компиляции. Дело в том, что работая в среде виртуализации, ваше железо эмулируется виртуальным и компилятор может попросту не найти инструкций для работы с таким "виртуальным железом".
* Используя ВМ вы губите потенциал своего ПК, ведь если он у вас мощный - воспользуйтесь этим! следствие -> пункт №1.
* Опять же, в продолжении предыдущего пункта, при компиляции необходимо много свободной оперативной памяти, поэтому использование ВМ накладно.
Так что, ставьте линукс второй осью!

Этап 2. Выбор ОС

Можно компилировать в линуксе, можно в MAC OS. Я останавлюсь на линуксе, т.к. с маком дела не имел.
Собственно какой дистрибутив выбрать? Вопрос актуальный, особенно если вы новичок в линуксе или же только что пересели с Windows.
Мой ответ на этот вопрос - не парьтесь! Выбирайте Ubuntu, а лучше такие дистрибутивы основанные на Ubuntu как Linux Mint или Elementary OS.
На момент написания статьи (последней редакции), лично я использовал Linux Mint 17.1. Также была протестирована Elementary OS Freya.
Какую версию качать? Если вы в первый раз сталкиваетесь с таким выбором, то мой совет - качайте Mint MATE, с кодеками, в случае, если вы пересели на линукс с мака, вам может прийтись по вкусу Elementary OS. Разрядность соотвественно смотрите сами. Конечно желательно 64bit.

Этап 3. Настройка рабочего окружения

Ось скачали, установили, обои любимые на рабочий стол поставили :D  Теперь к делу!
Некоторые операции придется проделовать со скрытыми файлами, так что включите сразу их отображение: Вид -> Показывать скрытые файлы (если вы на Mint)

 

3.1. Установка JDK(Java Development Kit)
Вот это надо установить первым делом. И не надо мне говорить что у вас уже стоит какой то там JDK!!!  Да, действительно, в том же Linux Mint уже стоит предустанвленный OpenJDK, но скажу сразу - он для сборки андроида нам не подойдет, нужен JDK именно от компании Sun. Да и еще чтоб версии 1.6 был! зачем старье, есть же новый 1.7?! Дело в том, что встроенный JDK обычно "не дружит" с текущими исходниками и поэтому нужен именно версии 1.6 от Sun. П.С. Поправка - для 5.x и выше нужен 1.7 (но это уже другая история, см. первый абзац).
И так, идем на сайт www.oracle.com, регаемся там (регистрация нужна чтобы скачать архивную JDK).
Далее, идем СЮДА и качаем в зависимости от разрядности jdk-6u45-linux-i586.bin или jdk-6u45-linux-x64.bin.
Скачали? Хорошо, теперь допустим это все добро скачалось к нам в домашний каталог(/home/<как_Вас_по_батьке/>), а если скачалось в др. место, преместите в домашний каталог для удобства. Теперь выполним некоторые манипуляции со скаченным файлом.
Открываем терминал и пишем:


chmod +x jdk-6u45-linux-i586.bin
sh jdk-6u45-linux-i586.bin


или


chmod +x jdk-6u45-linux-x64.bin
sh jdk-6u45-linux-x64.bin


В результате появится каталог jdk1.6.0_45. Для удобства переименуем его в jdk. Бинарник можно удалить.
Далее в терминале, конфигурируем Java:


sudo update-alternatives --install /usr/bin/java java ~/jdk/bin/java 1
sudo update-alternatives --install /usr/bin/javac javac ~/jdk/bin/javac 1
sudo update-alternatives --install /usr/bin/javaws javaws ~/jdk/bin/javaws 1


И:


sudo update-alternatives --config java
sudo update-alternatives --config javac
sudo update-alternatives --config javaws


Теперь чтобы компилятор знал где лежит наша ява, укажем к ней путь:


export PATH=$PATH:~/jdk/bin
export PATH=$PATH:~/jdk/jre/bin


Чтобы каждый раз не писать эту строку заново, необхожимо закинуть ее в файл .bashrc, который расположен в домашнем каталоге. Если такого файлв нет, создайте его:


cd ~
touch .bashrc
echo 'PATH=$PATH:~/jdk/bin' > .bashrc
echo 'PATH=$PATH:~/jdk/jre/bin' >> .bashrc


Отлично!  С явой разобрались, двигаем дальше.

 

3.2. Установка пакетов
Можно последовать мудрому руководству от Google по настройке окружения. Там вы найдете все, но не все там так сладко да гладко, хотя бы с тем же JDK...
Там пакеты разделены на 4 списка, в зависимости от версии убунты. Копируем что нужно и ставим.
Лично у меня с этим возникла проблемка на "Оливии" (Mint 15, 64bit). Т.к. она основана на Ubuntu 13.04, у меня не получилось загрузить нужные пакеты из инструкции от гугла. Но это не проблема:


sudo apt-get install -y git-core gnupg flex bison gperf libsdl1.2-dev libesd0-dev libwxgtk2.8-dev squashfs-tools build-essential zip curl libncurses5-dev zlib1g-dev pngcrush schedtool g++-multilib lib32z1-dev lib32ncurses5-dev lib32readline-gplv2-dev libxml2-utils u-boot-tools libc6-dev x11proto-core-dev libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 libgl1-mesa-dev mingw32 tofrodos python-markdown xsltproc


Теже самые пакеты (с зависимостями, которые ставятся автоматом) отлично встают и на Mint17 и на Elementary OS.
Нужные пакеты стоят. Идем дальше.

 

3.3. Android SDK, adb и fastboot
Идем СЮДА и качаем Android SDK, распаковываем и переименовываем для удобства в sdk.
Обновляем SDK:


cd ~/sdk/tools
sudo sh android update sdk -u


Потом ставим ADB:


cd ~/sdk/tools && ./android update adb


Потом ставим fastboot.Для этого добавляем репозиторий с нужным пакетом, обновляем и качаем:


sudo add-apt-repository ppa:nilarimogard/webupd8
sudo apt-get update && sudo apt-get install android-tools-fastboot


А потом:


cd ~/sdk/platform-tools/ &&sudo cp adb /usr/bin/adb && sudo cp fastboot /usr/bin/fastboot && sudo chmod 755 /usr/bin/adb && sudo chmod 755 /usr/bin/fastboot


Чтобы воспользоваться fastboot, например хотим мы залить получившуюся прошивку через fastboot, или же просто выполнить манипуляции с устройством через adb, надо сделать так чтобы комп "увидел" наш телефон. На винде это называется "установить usb-дрова", а у нас на линуксе это называется "законнектиться по ADB".
Как это сделать:
ЛИБО
идем в /etc/udev, выделяем папку rules.d и делаем клик по правой кнопке мыши, выбираем пункт "Открыть от администратора", вводим пароль.
В открывшейся папке создаем файлик 51-android.rules
ЛИБО


sudo gedit /etc/udev/rules.d/51-android.rules (если вы на Ubuntu)
sudo pluma /etc/udev/rules.d/51-android.rules (если вы на Mint 15)
sudo nano /etc/udev/rules.d/51-android.rules (универсальный вариант)
sudo vim /etc/udev/rules.d/51-android.rules (универсальный вариант)


вставляем в него:


SUBSYSTEM=="usb", ATTR{idVendor}=="xxxx", MODE="0666", OWNER="y"


Как определить что вставлять за место "xxxx" и "y"?
Заместо "xxxx" вставляется 4-х значный код вендора нашего девайса. Чтобы его узнать, отключите девайс от USB, выполните команду:


lsusb


Затем подключите девайс к USB и повторите команду. Вы увидите новую строчку. Нам нужны символы после "ID" и перед ":". Например, для моего Newman N2, будет такая вот строчка:


Bus 003 Device 009: ID 283b:3011


283b и есть код вендора.
Заместо "y" - название владельца и группы в которой он находится. Узнаем командой:


id


Ну думаю тут и без объснений все будет понятно))
Пример. После всех манипуляций, применительно к моему Newman N2, я получил вот такой 51-android.rules:


SUBSYSTEM=="usb", ATTR{idVendor}=="283b", MODE="0666", OWNER="scorpio92"


Затем в ~/.android/adb_usb.ini нужно добавить строку:


0x"xxxx"


применительно к моему Newman N2:


0x283b


И наконец добавляем в .bashrc:


cd ~
echo 'PATH=${PATH}:~/sdk/tools' > .bashrc
echo 'PATH=${PATH}:~/sdk/platform-tools' >> .bashrc


Все.

Этап 4. Качаем исходники

Еще немного понастраиваем))

 

4.1. Ставим repo


mkdir ~/bin
PATH=~/bin:$PATH
curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

 

4.2. Качаем!
Ну наконец то мы все настроили! Пришло время скачать исходники андроида.
Что качать дело ваше. Лично я рекомендую новичкам начинать с CyanogenMod. Там и косяков в коде меньше и поддержка сторонних девайсов гораздо шире.
Собственно как качать? Картина дествий тут общая.
Создаем рабочий каталог:


mkdir WORKING_DIRECTORY
cd WORKING_DIRECTORY


А дальше, инициализируем repo, соединяемся с хранилищем исходников. Тут есть варианты. Наиболее распространенные:
* Официальные исходники от Google(AOSP код):


repo init -u https://android.googlesource.com/platform/manifest -b <название нужной ветви>


* Другие исходники, например CyanogenMod с Github.com:


repo init -u git://github.com/CyanogenMod/android.git -b <название нужной ветви>


Что такое "ветвь"? Ветвь это как бы... ТУТ написано :D
Как выбрать ветвь? Можно инициализировать ветку master( заодно и repo обновится до самого последнего):


repo init -u https://android.googlesource.com/platform/manifest


а далее получить список всех доступных ветвей:


git --git-dir .repo/manifests/.git/ branch -a


Либо можно зайти к примеру на гит цианогена, скажем СЮДА и щелкнуть по кнопке branch.
К примеру, я захотел собрать CyanogenMod 10 для своего Newman N2, так вот:


mkdir CM10
cd CM10
repo init -u git://github.com/CyanogenMod/android.git -b jellybean


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


repo sync


Вводим эту команду и ждем...
П.С. если вдруг произошел обрыв или соединение нестабильное. Используйте эту команду:


repo sync -f


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

Этап 5. Настройка конфигурации сборки

Ну что же вот мы и подошли к самому интересному! Здесь я как раз и постараюсь ответить на многие вопросы начинающих.

 

5.1. Сбор информации об устройстве
И так, первым делом мы должны узнать технические характеристики того устройства, для которого будем собирать прошивку.
Это можно сделать найдя описание в интернете, благо сейчас есть информация практически для любого устройства. Можно заглянуть в программы-тесты, например в тот же Antutu.
Собственно то что нам нужно - это модель процессора(ЦП, CPU), разрешение экрана и модель видеоускорителя(ГП, GPU).
Далее определяемся с архитектурой ядер процессора. В основном случае это ARM v7 (хотя сейчас уже много ARM v8). Но этого мало, надо определить какое именно семейство (Cortex).
Для этого гуглим название архитектуры, зная чиповку. Чип(сокет) - это те самые MTK6589, Exynos 4412, Snapdragon S4 Pro и пр. знаменитые представители своих популярных ныне семейств (тут я немного отстал).
Могу порекомендовать ЭТОТ источник, а также ЭТОТ.
В результате узнаем, что мой чип Exynos 4412 построен на архитектуре ARM v7 Cortex A9. А ваш?)
Также о чипе и архитектуре процессора, написано в файле /proc/cpuinfo (для его просмотра необходимы рут-права и Root Explorer или терминальный доступ)
Самое основное мы узнали. Далее пойдут спецификации.
Узнаем что у нас с разделами. Какого формата, размера и куда монтируются.
Подключаем устройство к компьютеру и в терминале вводим команду:


adb shell mount


Мы получим список точек монтирования разделов, а также их файловые системы. По сути дела, нам необходимы только разделы Data, System и Cache.
Далее узнаем размеры разделов:


adb shell
df


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

 

5.2. Создание файлов конфигурации(.mk)

5.2.1. Создание папки девайса (device folder)
Сейчас будем создавать непосредственно конфигурацию для сборки. Если вы имеете готовые шаблоны или чьи то наработки - то вам повезло, но я в первую очередь расписываю это для тех, кто в первый раз сталкивается с этим и делает это с нуля не имея образца конфигов для такого же устройства. Что можно посоветовать в первую очередь - помоги сами себе! Поищите наработки на гитах, например зайдите в гугл и попробуйте повбивать запросы типа: <название вашего устройста> git, <название вашего устройста> github, <название чипа процессора> github. Вообще советую пользоваться именно Github.com, оттуда проще скачать исходники - просто заходите в нужный репозиторий и нажимате кнопку: "Download ZIP".
Можно также клонировать понравившийся гит:


git clone git://github.com/нужный_репозиторий.git -b <название_ветки>


Это касается примеров. Не ленитесь, поищите и посмотрите как можно больше примеров. Заметите общие особенности.
Старайтесь выбирать как можно более близкий по параметрам девайс и использовать его конфиг. Именно так я и поступил со своим Newman N2 - я взял за основу конфиг от Samsung Galaxy S3.
Итак, поехали создавать структуру.
Зайдите в папку с исходниками. В папке device создайте папку с именем производителя устройства (в моем случае samsung), далее в созданной папке создайте папку с именем модели устройства (в моем случае i9300).
У меня получилось так: CM10/device/samsung/i9300
Далее создадим следующие файлы в последнем каталоге (в моем случае в CM10/device/samsung/i9300): Android.mk, AndroidProducts.mk, BoardConfig.mk, конфиг_файл_продукта.mk, system.prop. Это минимальный набор.
Сейчас на своем примере буду рассказывать что да как заполнять. По случаю можете глянуть мой гит с конфигом, он не претендует на звание образцового, но тем не менее пойдет для понимания общей картины.

Заполняем Android.mk:


LOCAL_PATH := $(call my-dir)
ifeq ($(TARGET_DEVICE),<название_модели_устройства>)
include $(call all-makefiles-under,$(LOCAL_PATH))
endif

 

У меня так:


LOCAL_PATH := $(call my-dir)
ifeq ($(TARGET_DEVICE),i9300)
include $(call all-makefiles-under,$(LOCAL_PATH))
endif

 

Что это означает? Это означает, что когда сборочным скриптом вызывается Android.mk (стандартный кстати файл для сборки всех вещей, например библиотек, приложений и пр. компонентов), он вызывает все mk файлы в папке с конфигом девайса, при условии, что вызывается сборка для данного устройства (TARGET_DEVICE).

Заполняем AndroidProducts.mk:


PRODUCT_MAKEFILES := \
    $(LOCAL_DIR)/<Конфиг_файл_продукта>.mk

 

У меня так:


PRODUCT_MAKEFILES := \
    $(LOCAL_DIR)/newman.mk

 

Заполняем BoardConfig.mk, вот тут остановимся подробнее, это самый важный конфиг!. Помните о той информации которую мы собрали в пункте 5.1? Сейчас она нам пригодится. Заполняем:


TARGET_CPU_ABI :=
TARGET_CPU_ABI2 :=
TARGET_ARCH :=
TARGET_ARCH_VARIANT :=
TARGET_ARCH_VARIANT_CPU :=
TARGET_BOARD_PLATFORM :=
TARGET_SOC :=


Как минимум должно быть это. Опять же повторюсь, все давно сделано за вас не знаете как правильно написать - и не надо! Загуглите по названию чипа конфиг на гите, там все есть, для любого чипа, любой платформы (ну для 99% точно).
У меня так:


TARGET_CPU_ABI := armeabi-v7a
TARGET_CPU_ABI2 := armeabi
TARGET_ARCH := arm
TARGET_ARCH_VARIANT := armv7-a-neon
TARGET_ARCH_VARIANT_CPU := cortex-a9
TARGET_BOARD_PLATFORM := exynos4
TARGET_SOC := exynos4x12

 

armeabi-v7a, arm, cortex-a9, exynos4 - вспоминаете эти строки?) Ищите конфиги по ним, все аналогично будет и у вас!
Обязательно не забываем про спецификации для каждого типа процессоров. Для них есть свои классы - их указывать обязательно! Вся эта инфа по процессору нужна компилятору, чтобы он смог собрать библиотеки и оптимизировать их именно под ваш камень. Опять же ищите примеры конфигураций процессоров. Обратите внимание на специфичные инструкции для своего процессора, такие как например NEON. Вот у меня например такие спецификации:


TARGET_CPU_SMP := true
ARCH_ARM_HAVE_NEON := true
ARCH_ARM_HAVE_TLS_REGISTER := true
TARGET_GLOBAL_CFLAGS += -mtune=cortex-a9 -mfpu=neon -mfloat-abi=softfp
TARGET_GLOBAL_CPPFLAGS += -mtune=cortex-a9 -mfpu=neon -mfloat-abi=softfp
EXYNOS4X12_ENHANCEMENTS := true
EXYNOS4_ENHANCEMENTS := true
ifdef EXYNOS4X12_ENHANCEMENTS
COMMON_GLOBAL_CFLAGS += -DEXYNOS4_ENHANCEMENTS
COMMON_GLOBAL_CFLAGS += -DEXYNOS4X12_ENHANCEMENTS
COMMON_GLOBAL_CFLAGS += -DDISABLE_HW_ID_MATCH_CHECK
endif

 

Собственно то, что мы сейчас разобрали это обязательные вещи, при правильно указании которых прошивка уже загрузится (50%).
Едем дальше. Помните мы узнавали как у нас с памятью (в см. с памятью в устройстве)? Вот сейчас используем эти знания:


BOARD_NAND_PAGE_SIZE := 4096
BOARD_NAND_SPARE_SIZE := 128
BOARD_FLASH_BLOCK_SIZE := 4096
BOARD_SYSTEMIMAGE_PARTITION_SIZE := размер_раздела_в_мб*1024*1024
BOARD_USERDATAIMAGE_PARTITION_SIZE := размер_раздела_в_мб*1024*1024
TARGET_USERIMAGES_USE_EXT4 := true

 

Первые три строчки практически везде одинаковые, последняя - смотря какая файловая система. Вот как у меня:


BOARD_NAND_PAGE_SIZE := 4096
BOARD_NAND_SPARE_SIZE := 128
BOARD_FLASH_BLOCK_SIZE := 4096
BOARD_SYSTEMIMAGE_PARTITION_SIZE := 515899392
BOARD_USERDATAIMAGE_PARTITION_SIZE := 1198522368
TARGET_USERIMAGES_USE_EXT4 := true

 

Данный блок вовсе не обязательный. Он нужен преимущественно для сборки загрузочных образов (*.img). Без указания всего этого андроид соберется, однако все же лучше разобраться. Лишним точно не будет. Можно указать размеры boot.img(бута) и recovery.img(рекавери), но нам это пока не надо, упрощаем себе задачу, возиться пока с ними не будем. Наша цель собрать правильный system.img - собственно сам андроид.
Дальше разберемся с флагами:


TARGET_NO_BOOTLOADER := true
TARGET_NO_RADIOIMAGE := true
TARGET_NO_RECOVERY := true


Это думаю понятно, нам не нужны эти образы, в данном случае пока что не нужны.
Т.к. у нас нет никаких исходников(предположим), у меня вот так например, то соответственно будем портировать, а не собирать из исходников нужные модули. Поэтому делаем как минимум так:


BOARD_USES_GENERIC_AUDIO := true
USE_CAMERA_STUB := true


Т.е. говорим что мы не имеем исходников аудио и камеры.
Далее добавим еще несколько флагов.


DISABLE_DEXPREOPT := true - Включает деодекс по-умолчанию
BOARD_USE_LEGACY_TOUCHSCREEN := true - пригодится для портирования драйвера тач-скрина


Тааакс....ну пока это все. Что бы просто запустить сборку этого хватит, но естественно кое-что (что греха таить, почти все!) работать не будет. В последствии я еще раз вернусь к BoardConfig, а сейчас едем дальше.

Заполняем Конфиг_файл_продукта.mk.
Ну для начала придумайте ему имя. У меня он называется newman.mk. Придумали? Тогда поехали заполнять(заполнять желательно в такой же последовательности):


LOCAL_PATH := device/ папка_с_именем_производителя_устройства/папка_с_именем_модели_устройства


Это переменная для сокращения прописываемоего пути. Полезная вещь.
У меня такой путь:


LOCAL_PATH := device/samsung/i9300


Далее прописываем разрешение экрана под которое будут собираться приложения и фреймворк:


PRODUCT_AAPT_CONFIG :=ldpi mdpi hdpi xhdpi - практически все возможные разрешения от мала до велика...
PRODUCT_AAPT_PREF_CONFIG := <разрешение экрана вашего устройтсва>


Тут если сомниваетесь, то отталкивайтесь от показателя плотности точек(dpi). Помните циферку dpi из Antutu? Теперь гляньте в табл.1 ТУТ и вам станет понятно что писать.
Мое разрешение экрана: 1280х720, HD, плотность(dpi):320, следовательно:


PRODUCT_AAPT_PREF_CONFIG := xhdpi


Далее указываем папочку для переопределения исходных конфигураций(overlay):


DEVICE_PACKAGE_OVERLAYS += $(LOCAL_PATH)/overlay


Заодно и создайте ее сразу. Поговорим о ней сразу после обсуждения текущего конфига.
Далее укажем привязку, время и дату сборки:


PRODUCT_BUILD_PROP_OVERRIDES += BUILD_UTC_DATE=0


Далее необходимо взять со стока ядро(zImage), не путать с boot.img!!! Как разобрать boot.img на ядро и рамдиск, ищите на форуме, тем много, все написано. Указываем где лежит наше ядро:


PRODUCT_COPY_FILES += \
    $(LOCAL_PATH)/zImage:kernel


Т.е. положим его рядом с конфигами (device/ папка_с_именем_производителя_устройства/папка_с_именем_модели_устройства/zImage).

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


PRODUCT_PACKAGES += \
    com.android.future.usb.accessory \
    libnetcmdiface \
    Stk \
    static_busybox \
    make_ext4fs \
    setup_fs

 

Это просто пример для ознакомления, можно пропустить.

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


PRODUCT_COPY_FILES += \
    frameworks/native/data/etc/android.hardware.audio.low_latency.xml:system/etc/permissions/android.hardware.audio.low_latency.xml \
    frameworks/native/data/etc/android.hardware.camera.autofocus.xml:system/etc/permissions/android.hardware.camera.autofocus.xml \
    frameworks/native/data/etc/android.hardware.camera.flash-autofocus.xml:system/etc/permissions/android.hardware.camera.flash-autofocus.xml \
    frameworks/native/data/etc/android.hardware.camera.front.xml:system/etc/permissions/android.hardware.camera.front.xml \
    frameworks/native/data/etc/android.hardware.camera.xml:system/etc/permissions/android.hardware.camera.xml \
    frameworks/native/data/etc/android.hardware.location.gps.xml:system/etc/permissions/android.hardware.location.gps.xml \
    frameworks/native/data/etc/android.hardware.location.xml:system/etc/permissions/android.hardware.location.xml \
    frameworks/native/data/etc/android.hardware.sensor.accelerometer.xml:system/etc/permissions/android.hardware.sensor.accelerometer.xml \
    frameworks/native/data/etc/android.hardware.sensor.compass.xml:system/etc/permissions/android.hardware.sensor.compass.xml \
    frameworks/native/data/etc/android.hardware.sensor.gyroscope.xml:system/etc/permissions/android.hardware.sensor.gyroscope.xml \
    frameworks/native/data/etc/android.hardware.sensor.light.xml:system/etc/permissions/android.hardware.sensor.light.xml \
    frameworks/native/data/etc/android.hardware.sensor.proximity.xml:system/etc/permissions/android.hardware.sensor.proximity.xml \
    frameworks/native/data/etc/android.hardware.touchscreen.multitouch.jazzhand.xml:system/etc/permissions/android.hardware.touchscreen.multitouch.jazzhand.xml \
    frameworks/native/data/etc/android.hardware.touchscreen.multitouch.xml:system/etc/permissions/android.hardware.touchscreen.multitouch.xml \
    frameworks/native/data/etc/android.hardware.touchscreen.xml:system/etc/permissions/android.hardware.touchscreen.xml \
    frameworks/native/data/etc/android.hardware.usb.accessory.xml:system/etc/permissions/android.hardware.usb.accessory.xml \
    frameworks/native/data/etc/android.hardware.usb.host.xml:system/etc/permissions/android.hardware.usb.host.xml \
    frameworks/native/data/etc/android.hardware.wifi.direct.xml:system/etc/permissions/android.hardware.wifi.direct.xml \
    frameworks/native/data/etc/android.hardware.wifi.xml:system/etc/permissions/android.hardware.wifi.xml \
    frameworks/native/data/etc/android.software.sip.voip.xml:system/etc/permissions/android.software.sip.voip.xml \
    frameworks/native/data/etc/android.software.sip.xml:system/etc/permissions/android.software.sip.xml \
    frameworks/native/data/etc/handheld_core_hardware.xml:system/etc/permissions/handheld_core_hardware.xml \
    frameworks/native/data/etc/android.hardware.telephony.gsm.xml:system/etc/permissions/android.hardware.telephony.gsm.xml

 

Далее вызываем проприетарный конфиг(копирование файлов со стока, на которых нет исходников):


$(call inherit-product-if-exists, vendor/папка_с_именем_производителя_устройства/папка_с_именем_модели_устройства/название_конфига_какое_душе_угодно.mk)


У меня это:


$(call inherit-product-if-exists, vendor/samsung/i9300/newman.mk)


Пока что просто создайте такую структуру. О вендорной папке с проприетариями мы поговорим в пункте 5.2.2. А сейчас дальше.
Далее база которая собирается по умолчанию, основа андроида + языковые пакеты:


$(call inherit-product, $(SRC_TARGET_DIR)/product/full_base_telephony.mk)
$(call inherit-product, $(SRC_TARGET_DIR)/product/languages_full.mk)


Ну и наконец последний штрих - указываем реквизиты))


PRODUCT_NAME := имя_Конфига_файла_продукта
PRODUCT_DEVICE := имя_папки_с_именем_модели_устройства
PRODUCT_BRAND := имя_папки_с_именем_производителя_устройства
PRODUCT_MANUFACTURER := имя_папки_с_именем_производителя_устройства
PRODUCT_MODEL := ну_а_тут_модельку_устройства_пишем


Например, у меня:


PRODUCT_NAME := newman
PRODUCT_DEVICE := i9300
PRODUCT_BRAND := samsung
PRODUCT_MANUFACTURER := samsung
PRODUCT_MODEL := GT-I9300

 

Создаем system.prop
Этот файлик с некоторыми конфигами, которые затем пойдут в файл build.prop. Наверняка про такой слышали))
Для начала возьмем со стока только самое необходимое, не надо сразу пихать туда всякие твики и пр.!
Первым делом добавим строки инициализации радиомодуля(ищем в своем build.prop со стока аналогичное):


rild.libpath=/system/lib/lib***ril***.so
rild.libargs=-d /dev/***


Далее прописываем параметры Dalvik-машины:
параметры dalvik.vm.*** что и на стоке, от себя ничего придумывать не надо!
Прописываем параметр плотности экрана:


ro.sf.lcd_density=


Параметры USB:


persist.sys.usb.config=mass_storage,adb


Параметр OpenGL, обязательно!


ro.opengles.version=131072


Ну и параметры добавляющие производительность (их лучше брать не со стока, а от похожего девайса, с того андроида кторый собираете):


debug.sf.hw=1
video.accelerate.hw=1
debug.performance.tuning=1
debug.composition.type=gpu
debug.gralloc.vsync=0
hwui.render_dirty_regions=false
media.stagefright.enable-player=true
media.stagefright.enable-meta=false
media.stagefright.enable-scan=false
media.stagefright.enable-http=true
media.stagefright.enable-aac=true
media.stagefright.enable-qcp=true

 

Внимательно посмторите остальные параметры со стока, также это могут быть парметры вида:


ro.product.camera=
ro.bt.bdaddr_path=
persist.rild.nitz***=
mobiledata.interfaces=
ro.ril.baseband=


С конфигом устройства в принципе все. Можно добавить сборку нужных пакетов по вкусу + дописать вызов нужных .mk...Но пока я думаю оно вам не надо)))

Папка overlay.
Песня отдельная конечно. Это папка для переопределения исходных параметров. Обычно в ней меняются пути монтирования карты памяти, назввания сетевых интерфейсов и просто корректируются такие дефолтные параметры как яркость, звук и пр. Сейчас разберемся с этим.
Первым делом необходимо взять со стока файл framework-res.apk  и декомпилировать его. Как? ТУТ написано.
Далее в папке overlay создаем структуру: frameworks/base/core/res/res/values
У меня к примеру вот так: device/samsung/i9300/overlay/frameworks/base/core/res/res/values
Там создаем файл config.xml со следующим содержимым:


<?xml version="1.0" encoding="utf-8"?>
<resources>

</resources>


Собственно пространство между тэгом resources мы сейчас будем с вами заполнять, используя значения со стока.
Далее шагаем по пути: <папка с разобранным фреймом>/res/values и открываем arrays.xml.
Открываем мой оверлейный config.xml и просто аналогично заменяем мои значения в конфигах на свои из стокового arrays.xml. Делайте так если решили потренироваться и тоже собрать СМ10, если что-то другое - лучше ищите аналоги, т.к. в зависимости от версии Android, некоторых параметров может и не быть.
Например. Нам нужно записать в оверлейный конфиг (переопределить) параметр автояркости (если у вашего устройства есть датчик освещения конечно):


<integer-array name="config_autoBrightnessLevels">
        ...
        ...
        ...
</integer-array>


Копируем название параметра - config_autoBrightnessLevels и ищем его в стоковом arrays.xml. У меня в стоке прописан массив таких вот значений:


        3
        150
        3000


Соответсвенно в моем оверлейном конфиге появится вот такое переопределения параметра автояркости:


<integer-array name="config_autoBrightnessLevels">
        3
        150
        3000
</integer-array>


Ну я думаю дальше понятно, аналогично поступаем с остальными параметрами. Какие параметры менять - смотрим в моем примере, а также можно покопаться в сторонних, но я думаю моего хватит, у меня все самое основное.
Дальше будем разбираться с монтированием карт(ы) памяти.
Тут можно сделать проще: перенести файл storage_list.xml из <папка с разобранным фреймом>/res/xml/ в .../overlay/frameworks/base/core/res/res/xml/
А теперь давайте вернемся к BoardConfig.mk. Заметьте возвращаться придется много раз, больше чем Арнольд Шварценеггер)))
Добавим следующее:


TARGET_USE_CUSTOM_LUN_FILE_PATH :=


Это у нас параметр драйвера карты памяти который находится в ядре. Путь у всех схожий.
Либо


TARGET_USE_CUSTOM_LUN_FILE_PATH := "/sys/class/android_usb/android0/f_mass_storage/lun/file" - в старых девайсах такое обычно встречается


Либо


TARGET_USE_CUSTOM_LUN_FILE_PATH := "/sys/devices/platform/бла-бла-бла-usbgadget/gadget/lun%d/file" - в новых девайсах


Глянуть это все можно прям с устройтсва, при наличии root-прав и Root Explorer или терминала. Можно прям с компа по adb.
У меня так:


TARGET_USE_CUSTOM_LUN_FILE_PATH := "/sys/devices/platform/s3c-usbgadget/gadget/lun%d/file"


Еще, если у вас несколько карт памяти, допусти внутренняя и внешняя, то потребуется еще и этот параметр:


BOARD_VOLD_EMMC_SHARES_DEV_MAJOR := true


Также еще нужно в проприетариях указать vold.fstab со стока.
То что сейчас было по картам памяти, относится к Android 4.3 и ниже. Начиная с KitKat ситуация изменилась: файла vold.fstab нет, все прописывается в рамдиске (ramdisk), простое гугление даст примеры как заполнять. В общем случае это выглядит так:
* файлик fstab.*, например fstab.qcom. Это аналог vold.fstab
* конфигурация точек монтирования (создание и права) в файле init.*.rc или init.rc
Блок с картами памяти можно тоже пока пропустить, андроид без этого запуститься.

Ну я думаю пока с конфигом девайса и оверлеем достаточно. Это база, дальше смотрите примеры сами и добавляйте что вам по душе.

 

5.2.2. Создание папки вендора
Предлагаю ознакомится с моим примером на гите.
Тут у нас будут лежать проприетарные файлы, т.е. те элементы прошивки, на которые нет исходников. Это могут быть бинарники, библиотеки, конфиги(*.conf, *.xml), скрипты(*.sh).
В предыдущем пункте мы уже создали необходимую структуру: vendor/папка_с_именем_производителя_устройства/папка_с_именем_модели_устройства
У меня это выглядит следующим образом:vendor/samsung/i9300
Необходим еще .mk файл в котором будет прописано копирование проприетариев и который будет вызываться из device/папка_с_именем_производителя_устройства/папка_с_именем_модели_устройства/Конфиг_файл_продукта.mk
Сперва создайте файл конфига, у меня это newman.mk.
Далее для удобства, в том же каталоге создайте папку system, а в ней папки: app, bin, etc, lib, usr, vendor, xbin.
Теперь нам необходимо эти папки наполнить, т.е. взять из стоковой прошивки необходимые файлы и положить их в соответсвующие папки в вендорную папке. Как это сделать и что брать? Распакуйте system.img со стока либо возьмите прошивку для рекавери формата *.zip и распакуйте ее.
Для начала несколько советов:
* в качестве донора - оф. прошивки с которой будете тащить проприетарии, берите самую последнюю оф. прошивку.
* если ваша последняя оф. прошивка не выше android 2.3, то без исходников вам не удастся нормально запустить android 4.x, если же исходников на ваш девайс вообще не существует в свободном доступе, то ищите максимально похожий на ваш девайс и берите что нужно с него.
* не пытайтесь сразу перепрыгнуть несколько версий андроида и собрать самую последнюю версию. Т.е. если ваша последняя оф. прошивка базируется на андроиде 4.1, то не пытайтесь сразу собрать 4.2 или 4.3, у вас скорее всего ничего не получится, а если даже и повезет, то работать будет очень криво! Возьмитесь за прошивку, которая будет основываться на той же версии андроида что и ваша оф. прошивка. Например возьмите и соберите CyanogenMod.
* добейтесь максимальной совместимости и выясните базу(список проприетариев) необходимую для дальнейшего продвижения.
* для выяснения зависимостей между библиотеками и бинарниками может очень помочь программа IDA. Скачать можно ТУТ
* ну и конечно глядите примеры на гитах, пробуйте, экспериментируйте!
А теперь поговорим о самих проприетариях, какие файлы со стока надо тащить?
Нам понадобятся проприетарии графики, vold (монтирование памяти), тачскрина, key map, звука, камеры, кодеков, bluetooth, wi-fi, ril,  gps, сенсоров. Самое первое что нужно перенести это: графика, vold, тачскрин, key map.
Поговорим о них по-отдельности.

 

Графика
Самое важное. Я рекомендую налегать в первую очередь на неё, т.к. это единственное без чего андроид не сможет запуститься. Все остальное, запомните, НЕ обязательно для запуска!
Это в первую очередь драйвера видеоускорителя, а также библиотеки HAL(system/lib/hw): copybit(для андроид 2.3 и ниже), hwcomposer, gralloc.
С HAL в принципе все понятно, для всех устройств их список выглядит примерно так(на своем примере):


system/lib/hw/hwcomposer.smdk4x12.so
system/lib/hw/gralloc.smdk4x12.so


Где smdk4x12, как вы поняли - платформа на которой базируется ваше устройство.
С драйверами видеоускорителя чуть сложнее, в первую очередь это библиотеки OpenGL и конфиг egl.cfg, а также некоторые специфичные библиотеки(приведу с возможными варинтами):


system/lib/egl/egl.cfg
system/lib/libEGL***.so
system/lib/libGLES***.so
system/lib/libgsl.so
system/lib/libsc***.so
system/lib/libOpenVG.so
system/lib/libUMP.so
system/lib/lib<специфика, например Mali, Adreno и т.д.>.so
:system/lib/egl/libq3dtools***.so
system/lib/egl/eglsubAndroid.so
system/etc/firmware/yamato***.fw
system/etc/***_config.txt

 

Например в моем случае(Android 4.1, Mali-400MP) для работы графики я тащил:


system/lib/hw/hwcomposer.smdk4x12.so
system/lib/hw/gralloc.smdk4x12.so
system/lib/egl/egl.cfg
system/lib/egl/libEGL_mali.so
system/lib/egl/libGLESv1_CM_mali.so
system/lib/egl/libGLESv2_mali.so
system/lib/libEGL.so
system/lib/libGLES_trace.so
system/lib/libGLESv1_CM.so
system/lib/libGLESv2.so
system/lib/libMali.so
system/lib/libUMP.so
system/lib/libion.so

 

Vold
Этот сервис отвечает за монтирование КП. Частично мы с ним уже разобрались: прописали параметры lun-файла в BoardConfig, а также прописали точки монтирования в overlay.

Осталось только добавить файл из стока: system/etc/vold.fstab (опять напоминаю про KitKat)
Все, теперь наша(и) КП должна(ы) монтироваться!

 

Тачскрин
Помните куржочек-курсор на экране в CyanogenMod? Причина по которой он появляется - отсутствие драйвера тачскрина. Портировать его просто, необходимо взять из стока: /system/usr/idc/<все файлы *.idc, кроме qwerty.idc


Это в общем случае. Если не поможет, можно попробовать стянуть библиотеку libinput.so, НО она обязательно должна быть с той же версии андроида что собираете вы! Иначе получите бутлуп.

 

Key map
Чтобы правильно распознавались действия по нажатию на кнокпи девайса, необходима карта как физических так и виртуальных кнопок девайса, она есть в: system/usr/keylayout/<AVRCP, Generic, все кроме qwerty>.kl

 

Звук
Обычно это одна-две библиотеки(в Андроид ICS и выше)


system/lib/hw/audio.primary.<platform>.so
system/lib/hw/audio_policy.<platform>.so


В Андроид 2.3 и ниже это:


system/lib/libaudio.so


Тут обычно просто переносом библиотек не обойтись, смиритесь если звука не будет. Лучше пока пропустить этот шаг.

 

Камера
Аналогично как и со звуком. В Андроид ICS и выше:


system/lib/hw/camera.<platform>.so


В Андроид 2.3  и ниже это:


system/lib/libcamera.so


В некоторых случаях может понадобиться библиотека:


system/lib/libcamera_client.so


Также может потребоваться специфика. Ее советую выяснять с помощью программы IDA.

 

Кодеки
Следующий элемент который тесно связан с камерой. Нет кодеков - не будет работать видеозапись в камере и не будет проигрываться видео. Обычно используются OpenMax кодеки.


system/lib/omx/*.so


или


system/lib/lib***OMX***.so


Также иногда производители специально патчат стандартную библиотеку андроид - libstagefright.so. Возможно потребуется перенос со стока всех библиотек libstagefright***.so, т.к. они тоже могут быть пропатчены.

 

Bluetooth
Для работы необходима связка бинарников, библиотек, конфигов и возможно скриптов инициализации.
Обычно сам радио модуль это файл *.hcd, который располагается либо в system/bin либо в system/etc/bt. Там же может находится скрипт инициализации, но чаще всего он скрыт в рамдиске(ramdisk).
Еще может понадобиться: system/etc/bluetooth/main.conf

 

Wi-Fi
Здесь ситуация практически однотипная:
system/bin/wpa_supplicant
И
system/etc/wifi/*.bin, cal, conf, txt
Либо
system/etc/wl/*.bin, cal, conf, txt
Также вероятно потребуется библиотека libhardware_legacy.so. Однако ее можно брать если версия андроида такая же как на стоке!

 

RIL
Это библиотеки отвечающие за радиомодуль. Если все ril библиотеки на месте значит будет работать мобильная сеть и интернет.
Вот здесь как никогда пригодится IDA, бывает зависимостей куча, а бывает нужно всего пара библиотек:


system/lib/libril.so
system/lib/libreference-ril.so


Обязательно бинарник rild: system/bin/rild
+ возможно еще какой нибудь бинарник, ищите по "gsm" в system/bin.

 

GPS
Обычно в ICS и выше, "железная" часть как всегда перенесена в HAL, поэтому для работы GPS потребуется всего-лишь:


system/lib/hw/gps.<platform>.so


В Андроид 2.3 и ниже:


system/lib/libgps.so
system/lib/libloc***.so


В любом случае пригодятся конфиги:


system/etc/gps.conf
system/etc/gpsconfig.xml


Также среди бинарников может спрятаться и бинарник, отвечающий за GPS, но это как говорится - специфика.

 

Сенсоры
Датчики освещенности, гироскоп, компас и т.д. все это относится к сенсорам. И обычно представлены:


system/bin/akmd***
system/lib/hw/sensors.<platform>.so

 

Ну я думаю кратко о проприетариях я вам рассказал, примерный их список у вас есть и вы их уже раскидали по подкаталогам папки system в вендорной папке. Теперь добавим копирование этих файлов в .mk файл вендора. Это очень просто.
Добавляем в файл переменную:


LOCAL_PATH := vendor/папка_с_именем_производителя_устройства/папка_с_именем_модели_устройства


Она нужна для сокращения написания пути. У меня вот так:


LOCAL_PATH := vendor/samsung/i9300


Дальше для каждого проприетарного файла прописываем:


PRODUCT_COPY_FILES += \
    $(LOCAL_PATH)/путь_до_файла/проприетарный_файл:system/.../проприетарный_файл \


Например:


PRODUCT_COPY_FILES += \
    $(LOCAL_PATH)/system/lib/libril.so:system/lib/libril.so \


Обратите внимание на синтаксис, везде в .mk файлах где имеет место перечисление, ставится символ "\". На последнем элементе списка он не ставится, например:


PRODUCT_COPY_FILES += \
    $(LOCAL_PATH)/system/lib/libril.so:system/lib/libril.so \
    $(LOCAL_PATH)/system/lib/libreference-ril.so:system/lib/libreference-ril.so \
    $(LOCAL_PATH)/system/bin/rild:system/bin/rild \
        $(LOCAL_PATH)/system/bin/gsm0710muxd:system/bin/gsm0710muxd


или


PRODUCT_PACKAGES += \
    Galaxy4 \
    HoloSpiralWallpaper \
    LiveWallpapers \
    LiveWallpapersPicker \
    MagicSmokeWallpapers \
    NoiseField \
    PhaseBeam \
    VisualizationWallpapers \
    librs_jni


Собственно о вендорной папке ВСЕ!
Еще раз по данному пункту. Очень советую сделать так: взять исходники той же версии что и сток, выяснить список проприетариев связанных с графикой и скопировать их в вендорную папку, правильно заполнить BoardConfig (помните про минимум! лепить до кучи ни в коем случае не надо!), взять ядро от стока с которого берете графику (очень важно, т.к. HAL библиотеки напрямую взяимодействуют с драйверами графики в ядре и нужно чтобы они соответсвовали друг другу, иначе прошивка не стартанет), с остальным кроме графики возиться советую уже после того как загрузитесь до рабочего стола в своей текущей прошивке.

Этап 6. Сборка проекта

Все настроено, все готово. Ну так поехали!
Для сборки перейдите в папку с исходниками:


cd WORKING_DIRECTORY


И дальше дайте команду на сборку. Если хотите собрать обычную сборку, пользовательскую, как говорится "в массы", то используйте эту команду:


make -j* PRODUCT-<название_продукта>-userdebug


если хотите собрать инженерную сборку, для тестов(с нее и рекомендую начать):


make -j* PRODUCT-<название_продукта>-eng


Вместо * указывайте количество потоков процессора у вашего ПК + 1. Например у меня Intel Core i5 3570k - 4 ядра, по 1 потоку на каждое, поэтому в моем случае команда на сборку будет выглядить след. образом:


make -j5 PRODUCT-newman-userdebug


Ну и наконец последнее действие: жмем Enter)))
На выходе(папка_с_исходниками/out/target/product/название_продукта/), если все сложится благополучно и сборка пройдет без ошибок, получите system.img и возможно нек. др. образы, смотря что указали в BoardConfig.
Если возникнут ошибки - гуглите или спрашивайте на 4PDA в соответствующей теме. Все ошибки типовые. Опять напоминию про основы работы с терминалом, основы Linux, самые базовые знания программирования (ООП), интуиция и логика - это то,  что вам поможет решить любую проблему.
Что делать с system.img расскажу в след. главе.

Этап 7. Подготовка к прошивке. Тестирование

7.1. Прошивка получившейся сборки через fastboot или recovery
Ну допустим все удачно собралось. Поздравляю! Теперь необходимо залить полученную сборку на телефон, но прежде выполним еще одно действие: подготовим рамдиск(ramdisk).
Распаковываем boot.img. Как его распаковывать, я рассказывать не буду, могу лишь порекомендовать одну известную кухню для линукса с XDA - dsixda's Android Kitchen. Получаем ramdisk и zImage(ядро).
Если же у вас рамдиск формата uboot, например у вас китайский телефон как у меня и нет boot.img как такового(рамдиск и ядро прошиваются отдельно), то качаем набор утилит для распаковки (можно найти на гитхабе). Распаковываем скрипт в удобное для вас место, убеждаемся что разрешен запуск этого скрипта как программы, ложим рядом ramdisk-uboot.img и в терминале даем команду:


./unzramdisk.sh -c ramdisk-uboot.img


Далее и идем в папку ramdisk или boot.img-ramdisk(смотря какой метод распаковки использовали) и открываем init.rc, также открываем <папка_с_исходниками>/out/target/product/название_продукта/root/init.rc и из него копируем значение переменной BOOTCLASSPATH в тот файл init.rc, который из распакованного рамдиска. Т.е. например меняем строкой(из CyanogenMod 10) вида:


export BOOTCLASSPATH /system/framework/core.jar:/system/framework/core-junit.jar:/system/framework/bouncycastle.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/framework2.jar:/system/framework/android.policy.jar:/system/framework/services.jar:/system/framework/apache-xml.jar


строку из стокового init.rc.
Сохраняем изменения и собираем рамдиск обратно. Для рамдиска формата uboot, сборка выглядит примерно след. образом:


cd ramdisk
find . | cpio -o -H newc | gzip > ../ramdisk-out.cpio.gz
cd ..
mkimage -A ARM -O Linux -T ramdisk -C none -a 0x******** -e 0x******** -n ramdisk -d ./ramdisk-out.cpio.gz ramdisk.img


******** - заголовок рамдиска (глянуть можно в HEX-редакторе).
Рамдиск готов.
Если нужно, объединяем его с ядром в boot.img.
После этого можно прошивать. Шить можно 2-мя способами: через fastboot и через рекавери.
Команда (для линукса):


fastboot flash ramdisk <путь_до_образа>/образ.img


если не работает эта команда(ПК не видит устройство), то попробуйте эту команду:


fastboot -i 0x<код_вендора> flash ramdisk <путь_до_образа>/образ.img


П.С.:
* код вендора - тот же что когда мы настраивали ADB
* чтобы не прописывать путь к образу просто перекиньте его в окно терминала.

Теперь поговорим о прошивке через рекавери. Нам необходим update-архив формата zip со скриптом update-script. Тема по update-script есть ТУТ.
Наверняка местные ромоделы уже собирали для вашего девайса прошивки для рекавери, можно взять их, можно сделать самому на основе update.zip от других похожих аппаратов, главное вписать правильные пути монтирования разделов(их берем из пункта 5.1), например:


mount("ext4", "EMMC", "/dev/block/mmcblk0p2", "/system");


ext4, "/dev/block/mmcblk0p2" - знакомая нам информация из пункта 5.1.
Также обратите внимание на правильную расстановку разрешений(permissions) на файлы и на все ли файлы проставлены разрешения, особенно это актуально для того же CyanogenMod, например есть папка init.d со скриптами, поэтому проставляем в update-script отдельно разрешение для папки init.d и ее содержимого:


set_perm_recursive(0, 2000, 0755, 0750, "/system/etc/init.d");


Проверьте праильность написания имен файлов и синтаксис скрипта, из-за этого возможно возникновение ошибок при прошивке(status 7 и прочие).
В начале скрипта я рекомендую прописать форматирование разделов, полный вайп, для очистки от всего что было ранее(иначе возможны проблемы с запуском прошивки из-за хвостов старой прошивки):


format("ext4", "EMMC", "/dev/block/mmcblk0p*", "0");


Скрипт готов? сохраняем, пихаем его в архив, туда же файлы собранной прошивки и прошиваем.

 

7.2. Тестирование
Тут все просто, когда нужно снять лог (допустим лог загрузки девайса), вводим командув терминале:


adb logcat


По экрану побегут куча строк да еще и быстро...читать не удобно. Это решается записью лога в файл:


adb logcat > log.txt


В результате весь лог осядет в файле и вы можете его потом спокойно посмотреть.
П.С. файл с логом появится в той директории, откуда вы запустили эту команду!
Практически все ошибки типовые и легко "гуглятся", либо понятны и так. Так что на этом останавливаться не будем. Главное - не останавливайтесь вы! Если не получается устранить проблему - пробуйте, пытайтесь - в конце концов ваши старания будут вознаграждены и все обязательно получиться!
Могу посоветовать сделать мини-апдейт архив для рекавери, в который пихать тестируемый модуль и прошивать его по ходу пьесы, чтобы не перешивать заново все прошивку.
Пригодятся также логи dmesg:


adb shell
dmesg


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


Ну вот пока и все, для начального старта думаю хватит!
Если вы воспользовались моим советом и собрали прошивку в минимальной конфигурации (брали от стока только графику), все должно получиться. Если прошивка загрузится - беритесь по очереди за звук, камеру и т.д. пока не доведете прошивку до стабильного рабочего состояния.
После того как полностью запустите все на своей первой собранной прошивке, можно браться за ядро. Но ядро - это уже другая, отдельная тема))

 

Статья большая, поэтому возможны неточности и ошибки. Заметите их - пишите мне, постараюсь исправить оперативно.