Я неофициально обновил свой flo до Андроид КитКат,ну что ж я если честно ожидал большего,но почитав changelog понял что все основные изменения произошли под капотом и Google-молодцы поняли чего им не хватало!Теперь ОС более яростно сражается за память(ОЗУ),как говорится,не байта врагу:),Также теперь ос перестанет лагать даже если у вас 512 мб Оперативной Памяти,это очень радостная новость для всех владельцев китайских смартфонов,теперь мы нечем не хуже Apple с их Айболитами!Для всех любителей социальных сетей,теперь смайлы есть сразу в клавиатуре,да и вмонтированый свайп тоже не может не радовать,для всех гиков теперь голосовой ввод всегда висит в фоне,а чтобы его вызвать нужно сказать кодовое слово(какое не говорят,партизаны фиговы!).К сожалению в плане UI изменения нулевые,помоему единственное изменение это перекрашеные индикаторы батареи и WIFI,теперь они серые!Если вы несмотря на все это захотели попробовать вот вам инструкция с сайта 4pda.ru(сразу предупреждаю-это долго,пока я пишу эту запись у меня скачиваются исходники,это идет уже наверное три часа):
Долго собирался, наконец сегодня взялся написать свой первый серьёзный мануал, а именно мануал по сборке андроида из исходников, ибо тот, что был до этого в шапке морально устарел))
Мануал будет разделен на этапы, с простым, понятным для новичков объяснением. Все буду объяснять на примере сборки андроида для своего текущего девайса, китайского телефона - Newman N2, а именно сборку CyanogenMod 10 с нуля, т.е. не имея никаких исходников от производителя. Будут присутствовать элементы портирования, также поделюсь некоторыми "ухищрениями", которые мне лично помогают. Постараюсь ответить на многие вопросы начинающих ромоделов, таких как: "Как начать?", "Что установить?", "Где взять?". И так, приступим!
Для вледельцев Nexus 7 2013(WIFI)(flo) или Nexus 7 2013(LTE)(deb) или Nexus 7(grouper) или Nexus 10(Manta) этот шаг не обязателен,они уже сразу есть в папке device,но ради уверености проверьте все ли файлы из мануала есть в папке!
7.1. Прошивка получившейся сборки через fastboot или recovery
Ну допустим все удачно собралось. Поздравляю! Теперь необходимо залить полученную сборку на телефон, но прежде выполним еще одно действие: подготовим рамдиск(ramdisk).
Распаковываем boot.img. Как его распаковывать, я рассказывать не буду, могу лишь порекомендовать одну известную кухню для линукса с XDA - dsixda's Android Kitchen. Получаем ramdisk и zImage(ядро).
Если же у вас рамдиск формата uboot, например у вас китайский телефон как у меня и нет boot.img как такового(рамдиск и ядро прошиваются отдельно), то качаем unzramdisk.sh.tar.gz ( 367 байт )
. Распаковываем скрипт в удобное для вас место, убеждаемся что разрешен запуск этого скрипта как программы, ложим рядом ramdisk-uboot.img и в терминале даем команду:
Далее и идем в папку ramdisk или boot.img-ramdisk(смотря какой метод распаковки использовали) и открываем init.rc, также открываем <папка_с_исходниками>/out/target/product/название_продукта/root/init.rc и из него копируем значение переменной BOOTCLASSPATH в тот файл init.rc, который из распакованного рамдиска. Т.е. например меняем строкой(из CyanogenMod 10) вида:
строку из стокового init.rc.
Сохраняем изменения и собираем рамдиск обратно. Для рамдиска формата uboot, сборка выглядит примерно след. образом:
******** - заголовок рамдиска в HEX-редакторе.
Рамдиск готов. Если нужно, объединяем его с ядром в boot.img.
После этого можно прошивать. Шить можно 2-мя способами: через fastboot и через рекавери. Тут могу дать совет: большие образы system.img > 200Мб не стоит шить через fastboot, лично у меня они не шьються! Если образ < 200Мб, то можно спокойно шить. Команда (для линукса):
если не работает эта команда(ПК видит устройство), то попробуйте эту команду:
П.С.:
*код вендора - тот же что когда мы настраивали ADB
*чтобы не прописывать путь к образу просто перекиньте его в окно терминала.
Теперь поговорим о прошивке через рекавери. Нам необходим update-архив формата zip со скриптом update-script. Тема по update-script есть ТУТ.
Наверняка местные ромоделы уже собирали для вашего девайса прошивки для рекавери, можно взять их, можно сделать самому на основе update.zip от других похожих аппаратов, главное вписать правильные пути монтирования разделов(их берем из пункта 5.1), например:
ext4, "/dev/block/mmcblk0p2" - знакомая нам информация из пункта 5.1.
Также обратите внимание на правильную расстановку разрешений(permissions) на файлы и на все ли файлы проставлены разрешения, особенно это актуально для того же CyanogenMod, в например есть папка init.d со скриптами, поэтому проставляем в update-script отдельно разрешение для папки init.d и ее содержимого:
Проверьте праильность написания имен файлов и синтаксис скрипта, из-за этого возможно возникновение ошибок при прошивке(status 7 и прочие).
В начале скрипта я рекомендую прописать форматирование разделов, полный вайп, для очистки от всего что было ранее(иначе возможны проблемы с запуском прошивки из-за хвостов старой прошивки):
Скрипт готов? сохраняем, пихаем его в архив и прошиваем.
7.2. Тестирование
Тут все просто, когда нужно снять лог (допустим лог загрузки девайса), вводим командув терминале:
По экрану побегут куча строк да еще и быстро...читать не удобно, не правда ли?) Это решается записью лога в файл:
В результате весь лог осядет в файле и вы можете его потом спокойно посмотреть.
П.С. файл с логом появится в той директории, откуда вы запустили эту команду!
Практически все ошибки в логе легко "гуглятся", либо понятны и так. Так что на этом останавливаться не будем. Главное - не останавливайтесь вы! Если не получается устранить проблему - пробуйте, пытайтесь - в конце концов ваши старания будут вознагграждены и все обязательно получиться!
Могу посоветовать сделать мини-апдейт архив для рекавери, в который пихать тестируемый модуль и прошивать его по ходу пьесы, чтобы не перешивать заново все прошивку.
Также можно глядеть системные логи на самом устройстве, тут:
Обычно там скапливаются логи крахов приложений или сервисов.
Ну вот пока и все, для начального старта думаю хватит! После того как полностью запустите все на своей первой собранной прошивке, можно браться за ядро. По возможности, если для похожего девайса имеются полные исходники, можно взять исходники той же библиотеки HAL audio.<platform>.so или любой другой, собрать из них нужные библиотеки и заменить ими проприетарные.
Удачи!
Долго собирался, наконец сегодня взялся написать свой первый серьёзный мануал, а именно мануал по сборке андроида из исходников, ибо тот, что был до этого в шапке морально устарел))
Мануал будет разделен на этапы, с простым, понятным для новичков объяснением. Все буду объяснять на примере сборки андроида для своего текущего девайса, китайского телефона - Newman N2, а именно сборку CyanogenMod 10 с нуля, т.е. не имея никаких исходников от производителя. Будут присутствовать элементы портирования, также поделюсь некоторыми "ухищрениями", которые мне лично помогают. Постараюсь ответить на многие вопросы начинающих ромоделов, таких как: "Как начать?", "Что установить?", "Где взять?". И так, приступим!
Спойлер (+/-) (Этап 1. Выбор среды развертывания. Хост или ВМ?)
Это как говорится по вкусу и по обстоятельствам. Если вы не хотите ставить линукс второй системой или же у вас на HDD всего 1 раздел и тот "битком набит", то лучше воспользоваться виртуальной машиной. Сгодится VM Ware или VirtualBox...НО! Я категорически советую вам не полениться и все таки разбить ваш жесткий диск на разделы и поставить второй осью линукс! Почему?
*работать будет быстрее
*не будет ошибок при компиляции. Дело в том, что работая в среде виртуализации, ваше железо эмулируется виртуальным и компилятор может попросту не найти инструкций для работы с таким "виртуальным железом".
*используя ВМ вы губите потенциал своего ПК, ведь если он у вас мощный - воспользуйтесь этим! следствие -> пункт №1
*опять же, в продолжении предыдущего пункта, при компиляции необходимо много свободной оперативной памяти, поэтому использование ВМ накладно.
Так что, ставьте линукс второй осью!
*работать будет быстрее
*не будет ошибок при компиляции. Дело в том, что работая в среде виртуализации, ваше железо эмулируется виртуальным и компилятор может попросту не найти инструкций для работы с таким "виртуальным железом".
*используя ВМ вы губите потенциал своего ПК, ведь если он у вас мощный - воспользуйтесь этим! следствие -> пункт №1
*опять же, в продолжении предыдущего пункта, при компиляции необходимо много свободной оперативной памяти, поэтому использование ВМ накладно.
Так что, ставьте линукс второй осью!
Спойлер (+/-) (Этап 2. Выбор ОС)
Можно компилировать в линуксе, можно в MAC OS. Я останавлюсь на линуксе, т.к. с маком дела не имел.
Собственно какой дистрибутив выбрать? Вопрос актуальный, особенно если вы новичок в линуксе или же только что пересели с Windows.
Мой ответ на этот вопрос - не парьтесь! Выбирайте Ubuntu, а лучше такой дистрибутив основанный на Ubuntu как Linux Mint! Простой, удобный и понятный!
Хорошо зарекомендовала себя версия Linux Mint 9. Стабильная, основанная на Ubuntu 10.04, в которой на 100% соберется все, что только на данный момент есть(вплоть до Android 4.3). Скачать можно ТУТ.
Но время не стоит на месте, сейчас уже доступна 15-я версия самого популярного линукс-дистрибутива. Linux Mint 15 "Olivia". Собственно на "Оливии" я сейчас и сижу, пишу для вас этот мануал . Красивая и очень быстрая!
Какую версию качать? Если вы в первый раз сталкиваетесь с таким выбором, то мой совет - качайте MATE, с кодеками. Разрядность соотвественно смотрите сами.
Собственно какой дистрибутив выбрать? Вопрос актуальный, особенно если вы новичок в линуксе или же только что пересели с Windows.
Мой ответ на этот вопрос - не парьтесь! Выбирайте Ubuntu, а лучше такой дистрибутив основанный на Ubuntu как Linux Mint! Простой, удобный и понятный!
Хорошо зарекомендовала себя версия Linux Mint 9. Стабильная, основанная на Ubuntu 10.04, в которой на 100% соберется все, что только на данный момент есть(вплоть до Android 4.3). Скачать можно ТУТ.
Но время не стоит на месте, сейчас уже доступна 15-я версия самого популярного линукс-дистрибутива. Linux Mint 15 "Olivia". Собственно на "Оливии" я сейчас и сижу, пишу для вас этот мануал . Красивая и очень быстрая!
Какую версию качать? Если вы в первый раз сталкиваетесь с таким выбором, то мой совет - качайте MATE, с кодеками. Разрядность соотвественно смотрите сами.
Спойлер (+/-) (Этап 3. Настройка рабочего окружения)
Окей. Ось скачали, установили, обои любимые на рабочий стол поставили теперь к делу)
Некоторые операции придется проделовать со скрытыми файлами, так что включите сразу их отображение: Вид -> Показывать скрытые файлы
3.1. Установка JDK(Java Development Kit)
Вот это надо установить первым делом. И не надо мне говорить что у вас уже стоит какой то там JDK!!! Да, действительно, в том же Linux Mint уже стоит предустанвленный OpenJDK, но скажу сразу - он для сборки андроида нам не подойдет, нужен JDK именно от компании Sun. Да и еще что версии 1.6 был! зачем старье, есть же новый 1.7?! Дело в том, что новый JDK пока не "дружит" с текущими исходниками и поэтому нужен именно версии 1.6.
И так, идем на сайт www.oracle.com, регаемся там(регистрация нужна чтобы скачать архивную JDK).
Далее, идем СЮДА и качаем в зависимости от разрядности jdk-6u45-linux-i586.bin или jdk-6u45-linux-x64.bin.
Скачали? Хорошо, теперь допустим это все добро скачалось к нам в домашний каталог(/home/<как_Вас_по_батьке/>), а если скачалось в др. место, преместите в домашний каталог для удобства. Теперь выполним некоторые манипуляции со скаченным файлом. Откройте свойства данного фйла и на вкладке "Права", поставьте крестик в пунтке "Позволять выполнение файла как программы". Открываем терминал и пишем:
или
В результате появится каталог jdk1.6.0_45. Для удобства переименуем его в jdk. Бинарник можно удалить.
Теперь чтобы компилятор знал где лежит наша ява, укажем к ней путь:
Чтобы каждый раз не писать эту строку заново, необхожимо закинуть ее в файл .bashrc, он расположен в домашнем каталоге. Если такого файлв нет, создайте его.
Отлично! С явой разобрались, двигаем дальше.
3.2. Установка пакетов.
Собственно я если честно, всегда пакеты ставлю как попало, какие попало и откуда придется Но можно последовать мудрому руководству от Google по настройке окружения. Там вы найдете все, но не все там так сладко да гладко, хотя бы с тем же JDK...
Там пакеты разделены на 4 списка, в зависимости от версии убунты. Копируем что нужно и ставим.
Лично у меня с этим возникла проблемка на "Оливии" (Mint 15, 64bit). Т.к. она основана на Ubuntu 13.04, у меня не получилось загрузить нужные пакеты из инструкции от гугла. Но это не проблема:
Нужные пакеты стоят. Идем дальше.
3.3. Android SDK, adb и fastboot.
Идем СЮДА и качаем Android SDK. Качаем, распаковываем и переименовываем для удобства в sdk.
Обновляем SDK:
Потом ставим ADB:
cd ~/sdk/tools && ./android update adb
Потом ставим fastboot:
Если эта команда не покатит, то сделайте так:
Скачайте в ручную http://dl.dropbox.com/u/6751304/fastboot ,закиньте в platform-tools, а потом
Чтобы воспользоваться fastboot, например хотим мы залить получившуюся прошивку через fastboot, или же просто выполнить манипуляции с устройством через adb, надо сделать так чтобы комп "увидел" наш телефон. На винде это называется "установить usb-дрова", а у нас на линуксе это называется "законнектиться по ADB"
Как это сделать:
ЛИБО
*идем в /etc/udev, выделяем папку rules.d и делаем клик по правой кнопке мыши, выбираем пункт "Открыть от администратора", вводим пароль.
*в открывшейся папке создаем файлик 51-android.rules
ЛИБО
*вставляем в него:
Как определить что вставлять за место "xxxx" и "y"?
Заместо "xxxx" у нас вставляется 4-х значный код вендора нашего девайса. Чтобы его узнать, отключите девайс от USB, выполните команду:
Затем подключите девайс к USB и повторите команду. Вы увидите новую строчку. Нам нужны символы после "ID" и перед ":". Например, для моего Newman N2, будет такая вот строчка:
283b - и есть код вендора.
Заместо "y" - название владельца и группы в кот. он находится. Узнаем командой:
Ну думаю тут и без объснений все будет понятно))
Пример. После всех манипуляций, применительно к моему Newman N2, я получил вот такой 51-android.rules:
Затем в ~/.android/adb_usb.ini нужно добавить строку:
применительно к моему Newman N2:
И наконец добавляем в ~/.bashrc (либо вводим в терминале, если файла .bashrc нет)
Все. Сохраняем. Закрываем.
Некоторые операции придется проделовать со скрытыми файлами, так что включите сразу их отображение: Вид -> Показывать скрытые файлы
3.1. Установка JDK(Java Development Kit)
Вот это надо установить первым делом. И не надо мне говорить что у вас уже стоит какой то там JDK!!! Да, действительно, в том же Linux Mint уже стоит предустанвленный OpenJDK, но скажу сразу - он для сборки андроида нам не подойдет, нужен JDK именно от компании Sun. Да и еще что версии 1.6 был! зачем старье, есть же новый 1.7?! Дело в том, что новый JDK пока не "дружит" с текущими исходниками и поэтому нужен именно версии 1.6.
И так, идем на сайт www.oracle.com, регаемся там(регистрация нужна чтобы скачать архивную JDK).
Далее, идем СЮДА и качаем в зависимости от разрядности jdk-6u45-linux-i586.bin или jdk-6u45-linux-x64.bin.
Скачали? Хорошо, теперь допустим это все добро скачалось к нам в домашний каталог(/home/<как_Вас_по_батьке/>), а если скачалось в др. место, преместите в домашний каталог для удобства. Теперь выполним некоторые манипуляции со скаченным файлом. Откройте свойства данного фйла и на вкладке "Права", поставьте крестик в пунтке "Позволять выполнение файла как программы". Открываем терминал и пишем:
Код
sh jdk-6u45-linux-i586.bin
или
Код
sh jdk-6u45-linux-x64.bin
В результате появится каталог jdk1.6.0_45. Для удобства переименуем его в jdk. Бинарник можно удалить.
Теперь чтобы компилятор знал где лежит наша ява, укажем к ней путь:
Код
export PATH=$PATH:~/jdk/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
Нужные пакеты стоят. Идем дальше.
3.3. Android SDK, adb и fastboot.
Идем СЮДА и качаем Android SDK. Качаем, распаковываем и переименовываем для удобства в sdk.
Обновляем SDK:
Код
cd ~/sdk/tools
sudo sh android update sdk -u
sudo sh android update sdk -u
Потом ставим ADB:
cd ~/sdk/tools && ./android update adb
Потом ставим fastboot:
Код
cd ~/sdk/platform-tools/ && wget [url="http://dl.dropbox.com/u/6751304/fastboot"]http://dl.dropbox.com/u/6751304/fastboot[/url] && sudo cp adb /usr/bin/adb && sudo cp fastboot /usr/bin/fastboot && sudo chmod 755 /usr/bin/adb && sudo chmod 755 /usr/bin/fastboot
Если эта команда не покатит, то сделайте так:
Скачайте в ручную http://dl.dropbox.com/u/6751304/fastboot ,закиньте в platform-tools, а потом
Код
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)*вставляем в него:
Код
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 (либо вводим в терминале, если файла .bashrc нет)
Код
export PATH=${PATH}:~/sdk/tools
export PATH=${PATH}:~/sdk/platform-tools
export PATH=${PATH}:~/sdk/platform-tools
Все. Сохраняем. Закрываем.
Спойлер (+/-) (Этап 4. Качаем исходники)
Еще немного понастраиваем))
4.1. Ставим repo
4.2. Качаем!
Ну наконец то мы все настроили! Пришло время скачать исходники андроида
Что качать дело ваше. AOSP или CyanogenMod, а может быть AOKP? Лично я рекомендую новичкам начинать с CyanogenMod. Там и косяков в коде меньше и поддержка сторонних девайсов гораздо шире.
Собственно как качать? картина дествий тут общая:
Создаем рабочий каталог
А дальше, инициализируем repo, соединяемся с хранилищем исходников. Тут есть варианты. Наиболее распространенные:
*Официальные исходники от Google(AOSP код):
*Другие исходники, например CyanogenMod с Github.com:
Что такое "ветвь"? Ветвь это как бы...тут написано
Как выбрать ветвь? Можно инициализировать ветку master( заодно и repo обновится до самого последнего):
а далее получить список всех доступных ветвей;
Либо можно зайти к примеру на гит цианогена, скажем СЮДА и щелкнуть по кнопке branch.
К примеру, я захотел собрать CyanogenMod 10 для своего Newman N2, так вот:
я создам рабочую директорию и инициализирую нужную ветвь.
Далее, последний этап и самый долгий:
Вводим эту команду и ждем...
П.С. если вдруг произошел обрыв или соединение нестабильное. используйте эту команду:
Да и вообще я всегда использую именно ее, т.к. с ней проблемы сводятся к минимуму.
4.1. Ставим repo
Код
mkdir ~/bin
PATH=~/bin:$PATH
PATH=~/bin:$PATH
Код
curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
chmod a+x ~/bin/repo
4.2. Качаем!
Ну наконец то мы все настроили! Пришло время скачать исходники андроида
Что качать дело ваше. AOSP или CyanogenMod, а может быть AOKP? Лично я рекомендую новичкам начинать с CyanogenMod. Там и косяков в коде меньше и поддержка сторонних девайсов гораздо шире.
Собственно как качать? картина дествий тут общая:
Создаем рабочий каталог
Код
mkdir WORKING_DIRECTORY
cd 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 <название нужной ветви>
Что такое "ветвь"? Ветвь это как бы...тут написано
Как выбрать ветвь? Можно инициализировать ветку 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
cd CM10
repo init -u git://github.com/CyanogenMod/android.git -b jellybean
я создам рабочую директорию и инициализирую нужную ветвь.
Далее, последний этап и самый долгий:
Код
repo sync
Вводим эту команду и ждем...
П.С. если вдруг произошел обрыв или соединение нестабильное. используйте эту команду:
Код
repo sync -f
Да и вообще я всегда использую именно ее, т.к. с ней проблемы сводятся к минимуму.
Для вледельцев Nexus 7 2013(WIFI)(flo) или Nexus 7 2013(LTE)(deb) или Nexus 7(grouper) или Nexus 10(Manta) этот шаг не обязателен,они уже сразу есть в папке device,но ради уверености проверьте все ли файлы из мануала есть в папке!
Спойлер (+/-) (Этап 5. Настройка конфигурации сборки)
Ну что же вот мы и подошли к самому интересному! Здесь я как раз и постараюсь ответить на многие вопросы начинающих.
5.1. Сбор информации об устройстве.
И так, первым делом мы должны узнать технические характеристики того устройства, для кторого будем делать прошивку.
Это можно сделать найдя описание в интернете, благо сейчас есть информация практически для любого устройства. Можно заглянуть в программы-тесты, например в тот же Antutu.
Вот например что написано о моем Newman N2:
Нет, я не наврал, это не SGS3, просто стоит маскировка под него
Собственно то что нам нужно - это модель процессора(ЦП, CPU), разрешение экрана и модель видеоускорителя(ГП, GPU).
Далее определяемся с архитектурой ядер процессора. Собственно, она нам уже известна - в данном случае это ARM v7. Но этого мало, надо определить какая именно: Cortex A7,8,9 или A15.
Для этого гуглим название архитектуры, зная чиповку. Чип(сокет) - это те самые MTK6589, Exynos 4412, Snapdragon S4 Pro и пр. знаменитые представители своих популярных ныне семейств.
Могу порекомендовать ЭТОТ источник, а также ЭТОТ.
В результате узнаем, что мой чип Exynos 4412 построен на архитектуре ARM v7 Cortex A9. А ваш?)
Также о чипе и архитектуре процессора, написано в файле /proc/cpuinfo (для его просмотра необходимы рут-права и Root Explorer)
Самое основное мы узнали. Далее пойдут спецификации.
Узнаем что у нас с разделами. Какого формата, размера и куда монтируются.
Подключаем устройство к компьютеру и в терминале вводим команду:
мы получим список точек монтирования разделов, а также их файловые системы. По сути дела, нам необходимы только разделы Data, System и Cache.
Далее узнаем размеры разделов:
В принципе это пока что все, нам этого хватит для начала. Дальнейшую спицифику: WiFi, Bluetooth и др. модули вы можете разобрать самомстоятельно, гугл в помощь как говорится)) Да и вообще все специфику знать необязательно, т.к. не на все есть исходники и вам вероятно просто можно будет взять необходимые части из стоковой прошивки.
5.2. Создание файлов конфигурации(.mk)
5.2.1. Создание папки девайса (device folder)
Сейчас будем создавать непосредственно конфигурацию для сборки. Если вы имеете готовые шаблоны или чьи то наработки - то вам повезло, но я в первую очередь расписываю это для тех, кто в первый раз сталкивается с этим и делает это с нуля не имея образца конфигов для такого же устройства. Что можно посоветовать - помоги сами себе поищите наработки на гитах, например зайдите в гугл и попробуйте повбивать запросы типа: <название вашего устройста> git, <название вашего устройста> github, <название чипа процессора> github. Вообще советую пользоваться именно Github.com, оттуда проще скачать исходники - просто заходите в нужный репозиторий и нажимате кнопку: "Download ZIP".
Можно также клонировать понравившийся гит:
Это касается примеров. Не ленитесь, поищите и посмотрите как можно больше примеров. Заметите общие особенности.
Старайтесь выбирать как можно более близкий по параметрам девайс и использовать его конфиг. Именно так я и поступил со своим 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. Это минимальный набор.
Сейчас на своем примере буду рассказывать что да как заполнять. По случаю можете глянуть мой гит с конфигом, он не претендует на звание образцового, но тем не менее пойдет для понимания общей картины:
https://github.com/Scorpio92/android_device_exynos4Brothers
Создаем Android.mk, заполняем:
У меня так:
Создаем AndroidProducts.mk, заполняем:
У меня так:
Создаем BoardConfig.mk, вот тут остановимся подробнее, это самый важный файл!. Помните о той информации которую мы собрали в пункте 5.1? Сейчас она нам пригодится. Заполняем:
Как минимум должно быть это. Опять же повторюсь, все давно сделано за вас не знаете как правильно написать - и не надо! загуглите по названию чипа конфиг на гите, там все есть, для любого чипа, любой платформы.
У меня так:
armeabi-v7a, arm, cortex-a9, exynos4 - вспоминаете эти строки?) Ищите конфиги по ним, все аналогично будет и у вас!
Обязательно не забываем про спецификации для каждого типа процессоров. Для них есть свои классы - их указывать обязательно! Опять же ищите примеры конфигураций процессоров. Обратите внимание на специфичные инструкции для своего процессора, такие как например NEON. Вот у меня например такие спецификации:
Собственно то, что мы сейчас разобрали это обязательные вещи, при правильно указании которых прошивка уже загрузится.
Едем дальше. Помните мы узнавали как у нас с памятью (в см. с памятью в устройстве)? Вот сейчас используем эти знания:
Первые три строчки практически везде одинаковые, последняя - смотря какая файловая система. Вот как у меня:
Можно еще указать размеры boot.img(бута) и recovery.img(рекавери), но нам это пока не надо, упрощаем себе задачу, возиться пока с ними не будем. Наша цель собрать правильный system.img - собственно сам андроид.
Дальше разберемся с флагами:
Это думаю понятно, нам не нужны эти образы, в данном случае пока что не нужны.
Т.к. у нас нет никаких исходников(предположим), у меня вот так например, то соотвтественно будем портировать, а не собирать из исходников нужные модули. Поэтому делаем как минимум так:
Т.е. говорим что мы не имеем исходников аудио и камеры.
Далее добавим еще несколько флагов.
Тааакс....ну пока это все. Что бы просто запустить сборку этого хватит, но естественно кое-что работать не будет. В последствии я еще раз вернусь к BoardConfig, а сейчас едем дальше.
Создаем Конфиг_файл_продукта.mk.
Ну для начала придумайте ему имя. У меня он называется newman.mk. Придумали? Тогда поехали заполнять(заполнять желательно в такой же последовательности):
Это переменная для сокращения прописываемоего пути. Полезная вещь.
У меня такой путь:
Далее прописываем разрешение экрана под которое будут собираться приложения и фреймворк:
Тут если сомниваетесь, то отталкивайтесь от показателя плотности точек(dpi). Помните циферку dpi из Antutu? Теперь гляньте в табл.1 ТУТ и вам станет понятно что писать.
Мое разрешение экрана: 1280х720, HD, плотность(dpi):320, следовательно:
Далее указываем папочку для переопределения исходных конфигураций(overlay):
Заодно и создайте ее сразу. Поговорим о ней сразу после обсуждения текущего конфига.
Далее укажем привязку, время и дату сборки:
Далее необходимо взять со стока ядро(zImage), не путать с boot.img!!! Как разобрать boot.img на ядро и рамдиск, ищите на форуме, тем много, все написано. Указываем где лежит наше ядро:
Т.е. положим его рядом с конфигами (device/ папка_с_именем_производителя_устройства/папка_с_именем_модели_устройства/zImage).
Далее пропишем пакеты которые нужно будет собрать(мимнимальный набор, всякие там живые обои и пр. если захотите добавьте сами):
Далее добавляем хардварные файлы, очень важно, список их можно уточнить, все зависит от того какое железо у вас в девайсе (датчики и пр.):
Далее вызываем проприетарный конфиг(копирование файлов со стока, на которых нет исходников):
У меня это:
Пока что просто создайте такую структуру. О вендорной папке с проприетариями мы поговорим в пункте 5.2.2. А сейчас дальше.
Далее база которая собирается по умолчанию, основа андроида + языковые пакеты и gps конфиг:
Ну и наконец последний штрих - указываем реквизиты))
Например, как у меня:
Создаем system.prop
Этот файлик с некоторыми конфигами, которые затем пойдут в файл build.prop. Наверняка про такой слышали))
Для начала возьмем со стока только самое необходимое, не надо сразу пихать туда всякие твики и пр.!
Первым делом добавим строки инициализации радиомодуля(ищем в своем build.prop со стока аналогичное):
Далее прописываем параметры Dalvik-машины:
Далее прописываем все те же параметры dalvik.vm.*** что и на стоке, от себя ничего придумывать не надо!
Прописываем параметр плотности экрана:
Указываем интерфейс Wi Fi:
Параметры USB:
Параметр OpenGL, обязательно!
Ну и параметры добавляющие производительность:
Внимательно посмторите остальные параметры со стока, также это могут быть парметры вида:
С конфигом устройства в принципе все. Можно добавить сборку нужных пакетов по вкусу + дописать вызов нужных .mk...Но пока я думаю оно вам не надо)))
Папка overlay
Песня отдельная конечно. Это папка для переопределения исходных параметров. Обычно в ней меняются пути монтирования карты памяти, назввания сетевых интерфейсов и просто корректируются такие дефолтные параметры как яркость, звук и пр. Сейчас разберемся с этим.
Первым делом необходимо взять со стока файл framework-res.apk и декомпилировать его. Как? ТУТ написано.
Далее в папке overlay создаем структуру: frameworks/base/core/res/res/values
У меня к примеру вот так: device/samsung/i9300/overlay/frameworks/base/core/res/res/values
Там создаем файл config.xml со след. содержимым:
Собственно пространство между тэгом resources мы сейчас будем с вами заполнять, используя значения со стока.
Далее шагаем по пути: <папка с разобранным фреймом>/res/values и открываем arrays.xml.
Открываем мой оверлейный config.xml и просто аналогично заменяем мои значения в конфигах на свои из стокового arrays.xml.
Например. Нам нужно записать в оверлейный конфиг(переопределить) параметр автояркости(если у вашего устройства есть датчик освещения конечно):
Копируем название параметра - config_autoBrightnessLevels и ищем его в стоковом arrays.xml. У меня в стоке прописан массив таких вот значений:
Соответсвенно в моем оверлейном конфиге появится вот такое переопределения параметра автояркости:
Ну я думаю дальше понятно, аналогично поступаем с остальными параметрами. Какие параметры менять - смотрим в моем примере, а также можно покопаться в сторонних, но я думаю моего хватит, у меня все самое основное.
Дальше будем разбираться с монтированием карт(ы) памяти.
Тут можно сделать проще: перенести файл storage_list.xml из <папка с разобранным фреймом>/res/xml/ в .../overlay/frameworks/base/core/res/res/xml/
А теперь давайте вернемся к BoardConfig.mk. Заметьте возвращаться придется много раз, больше чем Арнольд Шварценеггер)))
Добавим следующее:
Это у нас параметр драйвера карты памяти кот. нах в ядре. Путь у всех схожий.
Либо
Либо
Глянуть это все можно прям с устройтсва, при наличии root-прав и Root Explorer,а.
У меня так:
Еще, если у вас несколько карт памяти, допусти внутренняя и внешняя, то потребуется еще и этот параметр:
Ну я думаю пока с конфигом девайса и оверлеем достаточно. Это база, дальше смотрите примеры сами и добавляйте что вам по душе. Можно также переопределить настройки пакетов.
5.2.2. Создание папки вендора
Предлагаю ознакомится с мои примером на гите: https://github.com/Scorpio92/android_vendor_exynos4Brothers
Тут у нас будут лежать проприетарные файлы, т.е. те элементы прошивки, на которые нет исходников. Это могут быть бинарники, библиотеки, конфиги(*.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, у вас ничего не получится, а если даже и повезет, то работать будет очень криво! Возьмитесь за прошивку, которая будет основываться на той же версии андроида что и ваша оф. прошивка. Например возьмите и соберите CyanogenMod10.
*Добейтесь максимальной совместимости и выясните базу(спсиок проприетариев) необходимую для дальнейшего продвижения.
*для выяснения зависимостей между библиотеками и бинарниками очень поможет программа IDA. Скачать можно ТУТ.
*ну и конечно глядите примеры на гитах, пробуйте, экспериментируйте!
А теперь поговорим о самих проприетариях, какие файлы со стока надо тащить?
Нам понадобятся проприетарии графики, vold, тачскрина, key map, звука, камеры, кодеков, bluetooth, wi-fi, ril, gps, сенсоров. Самое первое что нужно перенести это: графика, vold, тачскрин, key map.
Поговорим о них по-отдельности.
Графика
Это в первую очередь драйвера видеоускорителя, а также библиотеки HAL(system/lib/hw): copybit(для андроид 2.3 и ниже), hwcomposer, gralloc.
С HAL в принципе все понятно, для всех устройств их список выглядит примерно так(на своем примере):
Где smdk4x12, как вы поняли - платформа на которой базируется ваше устройство.
С драйверами видеоускорителя чуть сложнее, в первую очередь это библиотеки OpenGL и конфиг egl.cfg, а также нек. специфичные библиотеки(приведу с возможными варинтами):
Например в моем случае(Android 4.1, Mali-400MP) для работы графики я тащил:
Vold
Этот сервис отвечает за монтирование КП. Частично мы с ним уже разобрались: прописали параметры lun-файла в BoardConfig, а также прописали точки монтирования в overlay.
Осталось только добавить файл из стока: system/etc/vold.fstab
Все, теперь наша(и) КП должны монтироваться!
Тачскрин
Помните куржочек-курсор на экране в CyanogenMod? Причина по которой он появляется - отсутствие драйвера тачскрина. Портировать его просто, необходимо взять из стока:
Key map
Чтобы правильно распознавались действия по нажатию на кнокпи девайса, необходима карта как физических так и виртуальных кнопок девайса, она есть в:
Звук
Обычно это одна-две библиотеки(в Андроид ICS и выше)
В Андроид 2.3 и ниже это:
Камера
Аналогично как и со звуком. В Андроид ICS и выше:
В Андроид 2.3 и ниже это:
В некоторых случаях может понадобиться библиотека:
Также может потребоваться специфика. Ее советую выяснять с помощью программы IDA.
Кодеки
Следующий элемент который тесно связан с камерой. Нет кодеков - не будет работать видеозапись в камере и не будет проигрываться видео. Обычно используются OpenMax кодеки.
или
Также иногда производители специально патчат стандартную библиотеку андроид - libstagefright.so. Возможно потребуется перенос со стока всех библиотек libstagefright***.so, т.к. они тоже могут быть пропатчены.
Bluetooth
Для работы необходима связка бинарников, библиотек, конфигов и возможно скриптов инициализации.
Обычно сам радио модуль это файл *.hcd, который располагается либо в system/bin либо в system/etc/bt. Там же может находится скрипт инициализации, но чаще всего он скрыт в рамдиске(ramdisk).
Еще может понадобиться:
Wi-Fi
Здесь ситуация практически однотипная:
И
Либо
Также вероятно потребуется библиотека libhardware_legacy.so.
RIL
Это библиотеки отвечающие за радиомодуль. Если все ril библиотеки на месте значит будет работать мобильная сеть и интернет.
Вот здесь как никогда пригодится IDA, бывает зависимостей куча, а бывает нужно всего пара библиотек:
Обязательно бинарник rild:
+ возможно еще какой нибудь бинарник, ищите по "gsm" в system/bin.
GPS
Обычно в ICS и выше, "железная" часть как всегда перенесена в HAL, поэтому для работы GPS потребуется всего-лишь:
В Андроид 2.3 и ниже:
В любом случае пригодятся конфиги:
Также среди бинарников может спрятаться и бинарник, отвечающий за GPS, но это как говорится - специфика.
Сенсоры
Датчики освещенности, гироскоп, компас и т.д. все это относится к сенсорам. И обычно представлены:
Ну я думаю кратко о проприетариях я вам рассказал, примерный их список у вас есть и вы их уже раскидали по подкаталогам папки system в вендорной папке. Теперь добавим копирование этих файлов в .mk файл вендора. Это очень просто.
Добавляем в файл переменную:
Она нужна для сокращения написания пути. У меня вот так:
Дальше для каждого проприетарного файла прописываем:
Например:
Обратите внимание на синтаксис, везде в .mk файлах где имеет место перечисление, ставится символ "\". На последнем элементе списка он не ставится, например:
или
Собственно о вендорной папке ВСЕ!
5.1. Сбор информации об устройстве.
И так, первым делом мы должны узнать технические характеристики того устройства, для кторого будем делать прошивку.
Это можно сделать найдя описание в интернете, благо сейчас есть информация практически для любого устройства. Можно заглянуть в программы-тесты, например в тот же Antutu.
Вот например что написано о моем Newman N2:
Нет, я не наврал, это не SGS3, просто стоит маскировка под него
Собственно то что нам нужно - это модель процессора(ЦП, CPU), разрешение экрана и модель видеоускорителя(ГП, GPU).
Далее определяемся с архитектурой ядер процессора. Собственно, она нам уже известна - в данном случае это ARM v7. Но этого мало, надо определить какая именно: Cortex A7,8,9 или A15.
Для этого гуглим название архитектуры, зная чиповку. Чип(сокет) - это те самые 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
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. Это минимальный набор.
Сейчас на своем примере буду рассказывать что да как заполнять. По случаю можете глянуть мой гит с конфигом, он не претендует на звание образцового, но тем не менее пойдет для понимания общей картины:
https://github.com/Scorpio92/android_device_exynos4Brothers
Создаем Android.mk, заполняем:
Код
LOCAL_PATH := $(call my-dir)
ifeq ($(TARGET_DEVICE),<название_модели_устройства>)
include $(call all-makefiles-under,$(LOCAL_PATH))
endif
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
ifeq ($(TARGET_DEVICE),i9300)
include $(call all-makefiles-under,$(LOCAL_PATH))
endif
Создаем AndroidProducts.mk, заполняем:
Код
PRODUCT_MAKEFILES := \
$(LOCAL_DIR)/<Конфиг_файл_продукта>.mk
$(LOCAL_DIR)/<Конфиг_файл_продукта>.mk
У меня так:
Код
PRODUCT_MAKEFILES := \
$(LOCAL_DIR)/newman.mk
$(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 :=
TARGET_CPU_ABI2 :=
TARGET_ARCH :=
TARGET_ARCH_VARIANT :=
TARGET_ARCH_VARIANT_CPU :=
TARGET_BOARD_PLATFORM :=
TARGET_SOC :=
Как минимум должно быть это. Опять же повторюсь, все давно сделано за вас не знаете как правильно написать - и не надо! загуглите по названию чипа конфиг на гите, там все есть, для любого чипа, любой платформы.
У меня так:
Код
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
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
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
Собственно то, что мы сейчас разобрали это обязательные вещи, при правильно указании которых прошивка уже загрузится.
Едем дальше. Помните мы узнавали как у нас с памятью (в см. с памятью в устройстве)? Вот сейчас используем эти знания:
Код
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_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
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
Можно еще указать размеры boot.img(бута) и recovery.img(рекавери), но нам это пока не надо, упрощаем себе задачу, возиться пока с ними не будем. Наша цель собрать правильный system.img - собственно сам андроид.
Дальше разберемся с флагами:
Код
TARGET_NO_BOOTLOADER := true
TARGET_NO_RADIOIMAGE := true
TARGET_NO_RECOVERY := true
TARGET_NO_RADIOIMAGE := true
TARGET_NO_RECOVERY := true
Это думаю понятно, нам не нужны эти образы, в данном случае пока что не нужны.
Т.к. у нас нет никаких исходников(предположим), у меня вот так например, то соотвтественно будем портировать, а не собирать из исходников нужные модули. Поэтому делаем как минимум так:
Код
BOARD_USES_GENERIC_AUDIO := true
USE_CAMERA_STUB := 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
$(LOCAL_PATH)/zImage:kernel
Т.е. положим его рядом с конфигами (device/ папка_с_именем_производителя_устройства/папка_с_именем_модели_устройства/zImage).
Далее пропишем пакеты которые нужно будет собрать(мимнимальный набор, всякие там живые обои и пр. если захотите добавьте сами):
Код
PRODUCT_PACKAGES += \
com.android.future.usb.accessory \
libnetcmdiface \
Stk
static_busybox \
make_ext4fs \
setup_fs
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
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. А сейчас дальше.
Далее база которая собирается по умолчанию, основа андроида + языковые пакеты и gps конфиг:
Код
$(call inherit-product, $(SRC_TARGET_DIR)/product/full_base_telephony.mk)
$(call inherit-product, $(SRC_TARGET_DIR)/product/languages_full.mk)
$(call inherit-product, device/common/gps/gps_us_supl.mk)
$(call inherit-product, $(SRC_TARGET_DIR)/product/languages_full.mk)
$(call inherit-product, device/common/gps/gps_us_supl.mk)
Ну и наконец последний штрих - указываем реквизиты))
Код
PRODUCT_NAME := имя_Конфига_файла_продукта
PRODUCT_DEVICE := имя_папки_с_именем_модели_устройства
PRODUCT_BRAND := имя_папки_с_именем_производителя_устройства
PRODUCT_MANUFACTURER := имя_папки_с_именем_производителя_устройства
PRODUCT_MODEL := ну_а_тут_модельку_устройства_пишем
PRODUCT_DEVICE := имя_папки_с_именем_модели_устройства
PRODUCT_BRAND := имя_папки_с_именем_производителя_устройства
PRODUCT_MANUFACTURER := имя_папки_с_именем_производителя_устройства
PRODUCT_MODEL := ну_а_тут_модельку_устройства_пишем
Например, как у меня:
Код
PRODUCT_NAME := newman
PRODUCT_DEVICE := i9300
PRODUCT_BRAND := samsung
PRODUCT_MANUFACTURER := samsung
PRODUCT_MODEL := GT-I9300
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/***
rild.libargs=-d /dev/***
Далее прописываем параметры Dalvik-машины:
Код
dalvik.vm.execution-mode=int:jit
- включаем JITДалее прописываем все те же параметры dalvik.vm.*** что и на стоке, от себя ничего придумывать не надо!
Прописываем параметр плотности экрана:
Код
ro.sf.lcd_density=
Указываем интерфейс Wi Fi:
Код
wifi.interface=wlan0
Параметры 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
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=
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>
</resources>
Собственно пространство между тэгом resources мы сейчас будем с вами заполнять, используя значения со стока.
Далее шагаем по пути: <папка с разобранным фреймом>/res/values и открываем arrays.xml.
Открываем мой оверлейный config.xml и просто аналогично заменяем мои значения в конфигах на свои из стокового arrays.xml.
Например. Нам нужно записать в оверлейный конфиг(переопределить) параметр автояркости(если у вашего устройства есть датчик освещения конечно):
Код
<integer-array name="config_autoBrightnessLevels">
<item>...</item>
...
<item>...</item>
</integer-array>
<item>...</item>
...
<item>...</item>
</integer-array>
Копируем название параметра - config_autoBrightnessLevels и ищем его в стоковом arrays.xml. У меня в стоке прописан массив таких вот значений:
Код
<item>3</item>
<item>150</item>
<item>3000</item>
<item>150</item>
<item>3000</item>
Соответсвенно в моем оверлейном конфиге появится вот такое переопределения параметра автояркости:
Код
<integer-array name="config_autoBrightnessLevels">
<item>3</item>
<item>150</item>
<item>3000</item>
</integer-array>
<item>3</item>
<item>150</item>
<item>3000</item>
</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,а.
У меня так:
Код
TARGET_USE_CUSTOM_LUN_FILE_PATH := "/sys/devices/platform/s3c-usbgadget/gadget/lun%d/file"
Еще, если у вас несколько карт памяти, допусти внутренняя и внешняя, то потребуется еще и этот параметр:
Код
BOARD_VOLD_EMMC_SHARES_DEV_MAJOR := true
Ну я думаю пока с конфигом девайса и оверлеем достаточно. Это база, дальше смотрите примеры сами и добавляйте что вам по душе. Можно также переопределить настройки пакетов.
5.2.2. Создание папки вендора
Предлагаю ознакомится с мои примером на гите: https://github.com/Scorpio92/android_vendor_exynos4Brothers
Тут у нас будут лежать проприетарные файлы, т.е. те элементы прошивки, на которые нет исходников. Это могут быть бинарники, библиотеки, конфиги(*.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, у вас ничего не получится, а если даже и повезет, то работать будет очень криво! Возьмитесь за прошивку, которая будет основываться на той же версии андроида что и ваша оф. прошивка. Например возьмите и соберите CyanogenMod10.
*Добейтесь максимальной совместимости и выясните базу(спсиок проприетариев) необходимую для дальнейшего продвижения.
*для выяснения зависимостей между библиотеками и бинарниками очень поможет программа 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
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
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
system/lib/libion2.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
system/lib/libion2.so
Vold
Этот сервис отвечает за монтирование КП. Частично мы с ним уже разобрались: прописали параметры lun-файла в BoardConfig, а также прописали точки монтирования в overlay.
Осталось только добавить файл из стока: system/etc/vold.fstab
Все, теперь наша(и) КП должны монтироваться!
Тачскрин
Помните куржочек-курсор на экране в CyanogenMod? Причина по которой он появляется - отсутствие драйвера тачскрина. Портировать его просто, необходимо взять из стока:
Код
/system/usr/idc/<все файлы *.idc, кроме qwerty и qwerty2>.idc
Key map
Чтобы правильно распознавались действия по нажатию на кнокпи девайса, необходима карта как физических так и виртуальных кнопок девайса, она есть в:
Код
system/usr/keylayout/<AVRCP, Generic, все кроме qwerty>.kl
Звук
Обычно это одна-две библиотеки(в Андроид ICS и выше)
Код
system/lib/hw/audio.primary.<platform>.so
system/lib/hw/audio_policy.<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
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/lib/libloc***.so
В любом случае пригодятся конфиги:
Код
system/etc/gps.conf
system/etc/gpsconfig.xml
system/etc/gpsconfig.xml
Также среди бинарников может спрятаться и бинарник, отвечающий за GPS, но это как говорится - специфика.
Сенсоры
Датчики освещенности, гироскоп, компас и т.д. все это относится к сенсорам. И обычно представлены:
Код
system/bin/akmd***
system/lib/hw/sensors.<platform>.so
system/lib/hw/sensors.<platform>.so
Ну я думаю кратко о проприетариях я вам рассказал, примерный их список у вас есть и вы их уже раскидали по подкаталогам папки system в вендорной папке. Теперь добавим копирование этих файлов в .mk файл вендора. Это очень просто.
Добавляем в файл переменную:
Код
LOCAL_PATH := vendor/папка_с_именем_производителя_устройства/папка_с_именем_модели_устройства
Она нужна для сокращения написания пути. У меня вот так:
Код
LOCAL_PATH := vendor/samsung/i9300
Дальше для каждого проприетарного файла прописываем:
Код
PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/путь_до_файла/проприетарный_файл:system/.../проприетарный_файл \
$(LOCAL_PATH)/путь_до_файла/проприетарный_файл:system/.../проприетарный_файл \
Например:
Код
PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/system/lib/libril.so:system/lib/libril.so \
$(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
$(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
Galaxy4 \
HoloSpiralWallpaper \
LiveWallpapers \
LiveWallpapersPicker \
MagicSmokeWallpapers \
NoiseField \
PhaseBeam \
VisualizationWallpapers \
librs_jni
Собственно о вендорной папке ВСЕ!
Спойлер (+/-) (Этап 6. Сборка проекта)
Все настроено, все готово. Ну так поехали!
Для сборки перейдите в папку с исходниками:
И дальше дайте команду на сборку. Если хотите собрать обычную сборку, пользовательскую, как говорится "в массы", то используйте эту команду:
если хотите собрать инженерную сборку, для тестов:
Вместо * указывайте количество потоков процессора у вашего ПК + 1. Например у меня Intel Core i5 3570k - 4 ядра, по 1 потоку на каждое, поэтому в моем случае команда на сборку будет выглядить след. образом:
Ну и наконец последнее действие: жмем Enter))) А дальше кому как больше по душе: или
На выходе(папка_с_исходниками/out/target/product/название_продукта/), если все сложится благополучно и сборка пройдет без ошибок, получите system.img и возможно нек. др. образы, смотря что указали в BoardConfig.
Если возникнут ошибки - гуглите, ищите решение(в шапке), спрашивайте тут, удачи!
Что делать с system.img расскажу в след. главе.
Для сборки перейдите в папку с исходниками:
Код
cd WORKING_DIRECTORY
И дальше дайте команду на сборку. Если хотите собрать обычную сборку, пользовательскую, как говорится "в массы", то используйте эту команду:
Код
make -j* PRODUCT-<название_продукта>-user dist
если хотите собрать инженерную сборку, для тестов:
Код
make -j* PRODUCT-<название_продукта>-eng
Вместо * указывайте количество потоков процессора у вашего ПК + 1. Например у меня Intel Core i5 3570k - 4 ядра, по 1 потоку на каждое, поэтому в моем случае команда на сборку будет выглядить след. образом:
Код
make -j5 PRODUCT-newman-user dist
Ну и наконец последнее действие: жмем Enter))) А дальше кому как больше по душе: или
На выходе(папка_с_исходниками/out/target/product/название_продукта/), если все сложится благополучно и сборка пройдет без ошибок, получите system.img и возможно нек. др. образы, смотря что указали в BoardConfig.
Если возникнут ошибки - гуглите, ищите решение(в шапке), спрашивайте тут, удачи!
Что делать с system.img расскажу в след. главе.
Спойлер (+/-) (Этап 7. Подготовка к прошивке. Тестирование)
7.1. Прошивка получившейся сборки через fastboot или recovery
Ну допустим все удачно собралось. Поздравляю! Теперь необходимо залить полученную сборку на телефон, но прежде выполним еще одно действие: подготовим рамдиск(ramdisk).
Распаковываем boot.img. Как его распаковывать, я рассказывать не буду, могу лишь порекомендовать одну известную кухню для линукса с XDA - dsixda's Android Kitchen. Получаем ramdisk и zImage(ядро).
Если же у вас рамдиск формата uboot, например у вас китайский телефон как у меня и нет boot.img как такового(рамдиск и ядро прошиваются отдельно), то качаем unzramdisk.sh.tar.gz ( 367 байт )
. Распаковываем скрипт в удобное для вас место, убеждаемся что разрешен запуск этого скрипта как программы, ложим рядом 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
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 и через рекавери. Тут могу дать совет: большие образы system.img > 200Мб не стоит шить через fastboot, лично у меня они не шьються! Если образ < 200Мб, то можно спокойно шить. Команда (для линукса):
Код
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");
set_perm(0, 0, 0755, "/system/etc/init.d");
set_perm(0, 0, 0755, "/system/etc/init.d");
Проверьте праильность написания имен файлов и синтаксис скрипта, из-за этого возможно возникновение ошибок при прошивке(status 7 и прочие).
В начале скрипта я рекомендую прописать форматирование разделов, полный вайп, для очистки от всего что было ранее(иначе возможны проблемы с запуском прошивки из-за хвостов старой прошивки):
Код
format("ext4", "EMMC", "/dev/block/mmcblk0p*", "0");
Скрипт готов? сохраняем, пихаем его в архив и прошиваем.
7.2. Тестирование
Тут все просто, когда нужно снять лог (допустим лог загрузки девайса), вводим командув терминале:
Код
adb logcat
По экрану побегут куча строк да еще и быстро...читать не удобно, не правда ли?) Это решается записью лога в файл:
Код
adb logcat > log.txt
В результате весь лог осядет в файле и вы можете его потом спокойно посмотреть.
П.С. файл с логом появится в той директории, откуда вы запустили эту команду!
Практически все ошибки в логе легко "гуглятся", либо понятны и так. Так что на этом останавливаться не будем. Главное - не останавливайтесь вы! Если не получается устранить проблему - пробуйте, пытайтесь - в конце концов ваши старания будут вознагграждены и все обязательно получиться!
Могу посоветовать сделать мини-апдейт архив для рекавери, в который пихать тестируемый модуль и прошивать его по ходу пьесы, чтобы не перешивать заново все прошивку.
Также можно глядеть системные логи на самом устройстве, тут:
Код
data/system/dropbox
Обычно там скапливаются логи крахов приложений или сервисов.
Ну вот пока и все, для начального старта думаю хватит! После того как полностью запустите все на своей первой собранной прошивке, можно браться за ядро. По возможности, если для похожего девайса имеются полные исходники, можно взять исходники той же библиотеки HAL audio.<platform>.so или любой другой, собрать из них нужные библиотеки и заменить ими проприетарные.
Удачи!
Комментариев нет:
Отправить комментарий