Показано с 1 по 1 из 1

Тема: Собираем кастом для Android телефонов, на примере HTC Hero GSM

  1. #1
    Member
    Регистрация
    11.05.2005
    Адрес
    Kiev
    Сообщений
    295
    Спасибо
    57
    Благодарностей: 42 : 16

    Собираем кастом для Android телефонов, на примере HTC Hero GSM

    Не смотря на то, что все нижеследующее было сделано для HTC Hero, данные правила и особенности имеют полную силу для всех телефонов, особенно тех, которые разработаны компанией HTC и используют фирменную оболочку Sense.
    Для экспериментов нам понадобится:

    Android SDK желательно последней версии
    •Утилита apktool для реинжениринга системных приложений
    •Утилиты smali/baksmali для де-оптимизации системных приложений
    •Утилита unyaffs для извлечения системных файлов из образа
    •Скрипт split_bootimg.pl для извлечения ядра и ramdisk-а
    •Утилита testsign для подписывания пакета обновления и отдельных приложений
    •установленное и настроенное JRE
    •телефон с операционной системой Android
    •права суперпользователя и модифицированная подпрограмма восстановления (recovery rom)

    Все вышеперечисленное доступно в версиях как для системы Linux так и для Windows.
    Конечно же ни root-права ни recovery нам не нужен для того, чтобы начать разработку, однако если мы захотим опробовать наше творение, они нам понадобятся. Для HTC Hero можно использовать RA-hero-v1.6.2.
    Наверное, самое время напомнить, что использование неофициальных прошивок лишает нас гарантии, но где наша не пропадала. И несмотря на то, что большинство операций безопасно — всегда нужно четко понимать что и зачем делается, дабы не причинить необратимый вред своему андроиду

    Основа

    Существует несколько различных подходов к разработке прошивки.

    •Сборка из исходников Android Open Source Project
    •Сборка из исходников проекта CyanogenMod
    •Модификация прошивки, предоставляемой производителем телефона

    Несмотря на то, что платформа Android вроде как и является открытой, но в реальных телефонах используются закрытые компоненты. Это и драйверы распространяющиеся в бинарном виде (wifi/gps/fm), и ключевые компоненты системы, такие как Маркет и другие сервисы Google. Также сюда нужно добавить разработки компаний в области интерфейса, такие как HTC Sense, Motoblur, TouchWiz от Sumsung. Это создает местами непреодолимые трудности по разработке прошивки из исходных кодов.
    Я предлагаю остановиться на модификации готовых прошивок, предоставляемых вендорами телефонов.
    Прошивки для телефонов HTC существуют в двух видах:

    RUU. Rom Update Utility (Утилита обновления прошивки). Утилита для ОС Windows производящая обновление телефона
    OTA. Over the Air (Обновление по «воздуху»). Пакет, скачиваемый самим телефоном через wifi/gprs сети, который устанавливается на телефон без какого-либо участия компьютера

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


    Извлечение rom.zip


    1. Скачиваем подходящую версию RUU для интересующего нас телефона. Найти которую можно либо на сайте HTC, либо в других источниках. Для HTC Hero воспользуемся, вышедшей в начале июня версией Android 2.1 для оператора Chunghwa (Тайвань)
    2. RUU утилита при обновлении телефона прошивает сразу несколько областей:

    •загрузчик boot (hboot)
    •ядро linux + ramdisk (boot)
    •прошивка для радио-модуля (radio)
    •подпрограмма восстановления (recovery)
    •системный раздел (/system)
    •пользовательский раздел (/data)

    Однако мы не можем позволить RUU-утилите перезаписать наш любовно установленный загрузчик и recovery. Дабы иметь и далее возможность устанавливать не только официальные прошивки. Для этого нам необходимо извлечь радио/boot/system/data.
    В сущности RUU является InstallShield-овским инсталлятором, который несет в себе необходимые нам образы в rom.zip.
    Запускаем его и попадаем в заглавный приветственный экран. Не заходя дальше, открываем системную папку %TEMP%, в которой мы видим 2 новые папки, в одной из которых мы найдем файл rom.zip. Копируем в уединенное место и закрываем RUU отменой установки.


    Распаковка образов


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

    1.$ ls -1 rom
    2.boot.img
    3.Radio_Signed_HERO_63.18.55.06O_6.35.15.01.img
    4.system.img
    5.userdata.img

    Телефон несет в себе 512Мб NAND Flash, которые разбиты на следующие логические блоки

    1.$ adb shell cat /proc/mtd
    2.dev: size erasesize name
    3.mtd0: 00040000 00020000 "misc"
    4.mtd1: 00500000 00020000 "recovery"
    5.mtd2: 00280000 00020000 "boot"
    6.mtd3: 0aa00000 00020000 "system"
    7.mtd4: 08200000 00020000 "cache"
    8.mtd5: 0a5c0000 00020000 "userdata"

    Как мы видим, данные области памяти непосредственно связаны с полученными нами образами. RUU производит запись образов as-is, но мы хотим ведь изменить наполнение системы, поэтому нам необходимо распаковать их.
    В качестве файловой системы для NAND в android используется yaffs2

    1.$ adb shell mount | grep yaffs
    2./dev/block/mtdblock3 on /system type yaffs2 (ro)
    3./dev/block/mtdblock5 on /data type yaffs2 (rw,nosuid,nodev)
    4./dev/block/mtdblock4 on /cache type yaffs2 (rw,nosuid,nodev)

    Распакуем system и data (/cache остается пустым)

    1.$ mkdir system && cd system && unyaffs ../../../rom/system.img
    2.$ mkdir ../data && cd ../data && unyaffs ../../../rom/userdata.img

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


    Стоит учитывать, что в распакованном архиве содержатся символические ссылки, которые будут утеряны на файловых системах не поддерживающих оные (fat/ntfs). Которые мы можем восстановить через скрипт обновления, о чем будет рассказано в другой статье.


    Ядро

    Также нам понадобиться boot-раздел, который по сути является linux ядром (для выбранной прошивки это 2.6.29 armv6l) с ramdisk-ом и имеет следующий формат:

    ** +-----------------+
    ** | boot header | 1 page
    ** +-----------------+
    ** | kernel | n pages
    ** +-----------------+
    ** | ramdisk | m pages
    ** +-----------------+
    ** | second stage | o pages
    ** +-----------------+
    **
    ** n = (kernel_size + page_size - 1) / page_size
    ** m = (ramdisk_size + page_size - 1) / page_size
    ** o = (second_size + page_size - 1) / page_size
    Если мы захотим заменить ядро, либо модифицировать скрипты инициализации, нам необходимо их извлечь из boot-образа. Для этого нам понадобиться замечательный perl-скрипт split_bootimg.pl за авторством William Enck.

    1.$ split_bootimg.pl ../rom/boot.img
    2.$ ls
    3.boot.img-kernel boot.img-ramdisk.gz data system

    С самим ядром мы ничего не можем сделать, кроме как заменить его другим, а рамдиск можно распаковать для последующего изменения и настройки:

    1.$ mkdir ramdisk && cd ramdisk && gzip -dc ../boot.img-ramdisk.gz | cpio -i
    2.$ ls
    3.data default.prop dev init init.goldfish.rc init.hero.rc init.rc logo.rle proc sbin sys system

    В данной статье мы не хотим ничего делать ни с ядром ни с ramdisk-ом, а потому запакуем все обратно (либо вернемся на шаг назад и вообще не будем трогать boot)

    1.find . | cpio --quiet -o -H newc | gzip > ../new-ramdisk.gz
    2.$ cd .. && mkbootimg --kernel boot.img-kernel --ramdisk new-ramdisk.gz --cmdline "no_console_suspend=1 console=null" -o newboot --base 0x19200000

    Для других телефонов настроки базового смещения могут отличаться. Коммандлайн мы получаем из s
    plit_bootimg при распаковке.


    Скрипт обновления


    Для обновления будем использовать update-скрипт, который пишется на специальном скриптовом языке edify, о синтаксисе которого можно прочитать в исходниках android. Скрипт /META-INF/com/google/android/update-script может быть таким:

    1.show_progress 0.1 0
    2.format CACHE:
    3.format SYSTEM:
    4.copy_dir PACKAGE:
    5.system SYSTEM:
    6.set_perm_recursive 0 0 0755 0644 SYSTEM:
    7.set_perm_recursive 0 2000 0755 0755 SYSTEM:bin
    8.set_perm 0 3003 02755 SYSTEM:bin/netcfg
    9.set_perm 0 3004 02755 SYSTEM:bin/ping
    10.set_perm_recursive 1002 1002 0755 0440 SYSTEM:etc/bluez
    11.set_perm 0 0 0755 SYSTEM:etc/bluez
    12.set_perm 1002 1002 0440 SYSTEM:etc/dbus.conf
    13.set_perm 1014 2000 0550 SYSTEM:etc/dhcpcd/dhcpcd-run-hooks
    14.set_perm 0 2000 0550 SYSTEM:etc/init.goldfish.sh
    15.set_perm_recursive 0 0 0755 0555 SYSTEM:etc/ppp
    16.set_perm 0 0 04755 SYSTEM:etc/ppp/ip-up-vpn
    17.show_progress 0.1 10
    18.
    19.show_progress 0.2 0
    20.copy_dir PACKAGE:data DATA:
    21.show_progress 0.2 10
    22.
    23.show_progress 0.3 0
    24.format BOOT:
    25.write_raw_image PACKAGE:boot.img BOOT:
    26.show_progress 0.3 10

    Пока этот скрипт очень примитивен и единственное что он делает — подготавливает соответствующие разделы.


    Подпись пакета обновления


    Для того, чтобы мы смогли прошить нашу прошивку, нам необходимо подписать пакет обновления. Этот процесс аналогичен процессу подписывания jar-пакетов. К пакету добавляется ваш (либо тестовый) сертификат и сохраняются контрольные суммы для файлов внутри него.

    1.$ zip -r habrarom.zip .
    2.$ java -classpath ../../bin/testsign.jar testsign habrarom.zip habrarom-signed.zip

    Прошивка радио модуля

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

    1.show_progress 0.1 0
    2.write_radio_image PACKAGE:Radio_Signed_HERO_63.18.55.06O_6.35.15.01.img
    3.show_progress 0.1 10

    Не многое, что будет включено в данный пакет обновления.

    1.$ ls -1
    2.META-INF
    3.Radio_Signed_HERO_63.18.55.06O_6.35.15.01.img

    Всё это упаковывается и подписывается как делалось ранее.

    Прошивка

    Не смотря на то, что в полученную прошивку мы не добавили пока никакого нового функционала, мы бы хотили попробовать прошить и загрузиться в нее.
    Для этого
    1.Копируем в корень карты наш пакет обновления
    2.Загружаемся в recovery
    3.Делаем nanroid backup
    4.Делаем wipe
    5.Прошиваем
    6.Перегружаемся

    Радуемся тому, что наш больной пережил сложную операцию.

    В данный обзор не вошли следующие важные вопросы, которые затрагивают уже непосредственно модификацию подготовленной базовой прошивки. Вопросы с которыми сталкивается любой создатель кастомов, и столкнулся непосредственно я при создании русской версии прошивки 2.1 для HTC Hero GSM

    •Добавление root, busybox
    •Де-оптимизация (deodexing) пакетов. Использование smali/baksmali. Разрешение odex-зависимостей
    •удаленная odex-оптимизация приложений
    •Модификация системных пакетов. Подпись пакетов: когда нужна, и когда можно пренебречь. Упаковка приложений. Обновление ресурсов приложений без пересборки
    •Локализация системы, как пример масштабной модификации системы.
    •Декомпиляция и сборка ресурсов/байткода системных приложений. Исправление ошибок системных приложений
    •zip-align, png оптимизация
    •Подписывание приложений и проблема круговой поруки при использовании shared uid
    •Использование скриптов инициализации на примере переноса данных из одного раздела в другой (dalvik-cache2cache, app2sd)

  2. Спасибо сказали:

    splin2 (28.03.2012)

Похожие темы

  1. Sprint HTC Hero A6277 (HTC Hero 200)
    от GamalM в разделе CDMA800 для новичков
    Ответов: 7
    Последний ответ: 22.08.2013, 13:15
  2. HTC G3 Hero A6288(Hero 100)
    от krimidas в разделе HTC для новичков
    Ответов: 0
    Последний ответ: 19.04.2012, 13:41
  3. Разыскиваться прошивка Hero H6 Android
    от Злой снайпер в разделе Software для Китайских телефонов
    Ответов: 2
    Последний ответ: 13.12.2011, 21:05
  4. Ответов: 9
    Последний ответ: 08.06.2004, 19:04

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •  
  Рейтинг@Mail.ru