Разработка и модификация прошивки для Android телефонов. Часть 2
В первой части мы научились перепаковывать официальную прошивку из формата RUU в формат пакета обновлений, что дало нам возможность использовать созданную нами прошивку, не опасаясь затирания модифицированного раздела восстановления (recovery rom). И тем временем, пока HTC воюет с хорошими ресурсами, мы продолжим изучать и улучшать прошивку. В предыдущей части, хоть мы и создали прошивку, которая загружается и работает как часы, мы бы хотели расширить базовый функционал оной. Одним из самых востребованных расширений является поддержка работы с правами суперпользователя (root). Также сюда можно отнести интегрирование busybox. Кроме того, мы научимся запускать произвольные скрипты при старте системы и адаптируем ramdisk под свои нужды.
Busybox
busybox — это набор консольных unix утилит, ориентированный на малый размер и производительность, что так актуально для мобильных систем. Вместе с системой android поставляется свой набор утилит — toolbox, который предоставляет минимально необходимых функционал для системы, и как следствие более простой в количественном и функциональном плане. Наличие busybox в системе, с одной стороны, позволит нам, как разработчикам, чувствовать себя более комфортно при удаленной работе на устройстве, с другой, позволит писать сложные скрипты, и, например, реализовать механизм запуска собственных скриптов при загрузке, используя run-parts. Также стоит учитывать, что для некоторых android приложений (особенно те, которые используют root) наличие busybox — обязательно.
- При общей схеме использования busybox/toolbox мы должны положить исполняемый файл и создать ссылки на него с именами апплетов. Ссылки должны быть доступны по пути из переменной $PATH. Где хранить ссылки для busybox? В /system/bin? /system/xbin? отдельная директория?
- Использовать заранее созданные ссылки, или генерировать на этапе установки прошивки? В примере из первой части мы использовали заранее созданные ссылки для toolbox. Но данный вариант затруднителен, если разработка прошивки ведется на системе Windows, где есть определенные проблемы с символическими ссылками.
- В зависимости от сборки busybox мы можем перекрыть набор команд, который уже доступен в toolbox. Кто главнее? С одной стороны, busybox предоставляет более широкий функционал (как пример: буквенное задание прав для chmod), но с другой стороны — мы можем захотеть исключить уже реализованные утилиты из busybox для уменьшения размера набора.
- $ adb remount && adb push busybox / cache /
- $ adb shell chmod 0755 / cache / busybox
- $ adb shell / cache / busybox |tail
- tcpsvd, tee , telnet, telnetd, test , tftp, tftpd, time , timeout, top,
- touch , tr , traceroute, true , tty, ttysize, tunctl, udpsvd, umount ,
- uname , uncompress, unexpand, uniq , unix2dos, unlzma, unlzop, unzip ,
- uptime , usleep, uudecode, uuencode, vconfig, vi , vlock, volname, watch,
- watchdog, wc , wget , which , who , whoami , xargs , yes , zcat , zcip
- $ find habrrom / system / bin / -type l -printf '%f, ' |tail
- getprop, insmod, ifconfig , setprop, wipe, watchprops, log, sync , schedtop, ioctl, rm ,
- sleep , notify, sendevent, dmesg , df , route, vmstat , mv , iftop, rmmod,
- dd , renice, kill , mount , start, rmdir , ps , ln , cmp , dumpcrash, top, getevent,
- umount , mkdir , setconsole, printenv, newfs_msdos, chown , cat , hd, chmod , date ,
- stop, smd, netstat , ls , lsmod , id ,
- $ ls -o habrrom / system / bin /|grep dumpstate
- lrwxrwxrwx 1 astar 9 2010 -06- 16 03: 59 dumpcrash - > dumpstate
- -rwxr-xr-x 1 astar 14296 2010 -06- 16 03: 55 dumpstate
- getevent, getprop, iftop, ioctl, log, newfs_msdos, notify, schedtop,
- sendevent, setprop, smd, start, stop, top, umount , vmstat , watchprops, wipe
- symlink dumpstate SYSTEM:bin / dumpcrash
- #
- symlink toolbox SYSTEM:bin / getprop
- # повторяем процедуру для необходимых апплетов toolbox
- symlink busybox SYSTEM:xbin /[
- # повторяем процедуру для всех апплетов busybox
- $ rm`find habrrom / system / bin / -type l `
- set_perm 0 0 04755 SYSTEM:xbin/busybox
- $ mkdir habrrom/system/xbin/bb
- $ touch habrrom/system/xbin/bb/placeholder
- symlink ../busybox SYSTEM:xbin/bb/[
- # и так далее
Модификация ramdisk
Однако, просто поместить ссылки в отдельную папку — мало. Нужно расширить путь поиска исполняемых файлов для системы. Для этого нам понадобиться дополнить переменную $PATH, которая в случае с андроидом на HTC Hero определяется в /init.rc
- $ adb shell cat /init.rc | grep "export PATH"
- export PATH /sbin:/system/sbin:/system/bin:/system/xbin
- $ cat habrrom.boot/ramdisk/init.rc | grep "export PATH"
- export PATH /sbin:/system/sbin:/system/bin:/system/xbin:/system/xbin/bb
- Возможность монтирования файловой системы с правами на запись
- Отладка по usb, включенная по-умолчанию. Иначе, если что-то пойдет не так, мы не сможем получить хоть какую-то полезную информацию о причинах, так как сервис adbd будет отключен и как следствие — adb logcat во время загрузки будет недоступен
- Запуск произвольных скриптов при загрузке системы (самыми популярными вариантами использования являются: включение app2sd, перенос dalvik-cache в /cache)
- ro.secure — используется то тут то там по всей системе, но из интересующих нас свойств, включает adb remount на запись а, также, adb shell выполняется с правами суперпользователя. Выставим значение в 0
- persist.service.adb.enable — отвечает за старт сервиса adbd, который нам помогает совершать удаленное взаимодействие с телефоном по средством adb. Выставляем в 1
Скрипты инициализации
- service sysinit /system/bin/logwrapper /system/xbin/busybox run-parts /system/etc/init.d
- disabled
- oneshot
- # не сейчас
- # class_start default
- start sysinit
- on property:habr.sysinit.done=1
- # вот сейчас
- class_start default
- $ cat habrrom/system/etc/init.d/00banner
- #!/system/bin/sh
- echo "Hello habrahabr!";
- $ cat habrrom/system/etc/init.d/99complete
- #!/system/bin/sh
- sync;
- setprop habr.sysinit.done 1
- set_perm_recursive 0 2000 0755 0755 SYSTEM:etc/init.d
Права суперпользователя. Root.
- native модуль su. Который при запросе на изменение прав перенаправляет запрос в собственный Activity и ждет реакции пользователя
- приложение Superuser.apk — набор интерфейсов (Activity), отвечающих за взаимодействие с пользователем, хранение настроек.
Для того, чтобы добавить в нашу прошивку указанный функционал — добавим модули в соответствующие разделы системы,