Создание updater-script для собственной прошивки
Итак, допустим, вам надоело «играться» с чьими-то неофициальными, то есть кастомными творениями, и возникло желание создать свою прошивку. Очень важно уметь создать для неё файл updater-script, ведь он содержит в себе полный сценарий всего процесса установки прошивки на Android-устройство.
С этим мы сейчас и разберемся.
Полный перечень поддерживаемых файлом updater-script команд мы разбирали в другом материале. Сейчас же мы подойдем к данному вопросу больше с практической точки зрения.
Для начала, очень желательно полностью прописать, для каких именно Android-устройств подходит созданная прошивка.
assert(getprop(«getprop(«ro.product.device») == «Device1» ||
getprop(«ro.product.board») == » Device1″ ||
getprop(«ro.build.product») == » Device1″ ||
getprop(«ro.product.model») == » Device1″ ||);
Далее можем прописать любой текст, который будет выведен на экран устройства, например, о создателе прошивки и целях её создания.
ui_print(«Text»);
Настраиваем полосу прогресса во время установки прошивки, например, вот так:
show_progress(0.200000, 0);
После этого следует размонтировать такие диски, как data, cache и system.
unmount(«/data»);
unmount(«/cache»);
unmount(«/system»);
После размонтирования, указанные диски (блоки) можно и нужно полностью форматировать.
format(«rfs», «EMMC», «/dev/block/Block_name»);
RFS – это файловая система, можно указать также EXT4 вместо неё, а Block_name – название блока, соответственно. Через терминал можно узнать, что именно и куда монтируется, используя следующие команды:
su
mount > /sdcard/dv.log
После форматирования, размонтированные блоки необходимо монтировать обратно.
mount(«rfs», «EMMC», «/dev/block/ Block_name1», «/data»);
mount(«rfs», «EMMC», «/dev/block/ Block_name2», «/system»);
mount(«rfs», «EMMC», «/dev/block/ Block_name3», «/cache»);
Очищаем Dalvik-кэш.
delete_recursive(«/data/dalvik-cache»)
Копируем содержимое папки data в прошивке в папку data уже на устройстве (если, конечно, в прошивке есть что копировать).
package_extract_dir(«data», «/data»);
Назначаем права.
set_perm_recursive(1000, 1000, 0771, 0644, «/data/app»);
set_perm(2000, 2000, 0771, «/data/local»);
Проводим копирование папки system из самой прошивки на прошиваемое устройство.
package_extract_dir(«system», «/system»);
После этого создаем символические ссылки на соответствующие папки.
symlink(«toolbox», «/system/bin/cat»);
symlink(«toolbox», «/system/bin/chmod»);
symlink(«toolbox», «/system/bin/chown»);
symlink(«toolbox», «/system/bin/cmp»);
symlink(«toolbox», «/system/bin/date»);
symlink(«toolbox», «/system/bin/dd»);
symlink(«toolbox», «/system/bin/df»);
symlink(«toolbox», «/system/bin/dmesg»);
symlink(«toolbox», «/system/bin/getevent»);
symlink(«toolbox», «/system/bin/getprop»);
symlink(«toolbox», «/system/bin/hd»);
symlink(«toolbox», «/system/bin/id»);
symlink(«toolbox», «/system/bin/ifconfig»);
symlink(«toolbox», «/system/bin/iftop»);
symlink(«toolbox», «/system/bin/insmod»);
symlink(«toolbox», «/system/bin/ioctl»);
symlink(«toolbox», «/system/bin/ionice»);
symlink(«toolbox», «/system/bin/kill»);
symlink(«toolbox», «/system/bin/ln»);
symlink(«toolbox», «/system/bin/log»);
symlink(«toolbox», «/system/bin/ls»);
symlink(«toolbox», «/system/bin/lsmod»);
symlink(«toolbox», «/system/bin/lsof»);
symlink(«toolbox», «/system/bin/mkdir»);
symlink(«toolbox», «/system/bin/mount»);
symlink(«toolbox», «/system/bin/mv»);
symlink(«toolbox», «/system/bin/nandread»);
symlink(«toolbox», «/system/bin/netstat»);
symlink(«toolbox», «/system/bin/newfs_msdos»);
symlink(«toolbox», «/system/bin/notify»);
symlink(«toolbox», «/system/bin/printenv»);
symlink(«toolbox», «/system/bin/ps»);
symlink(«toolbox», «/system/bin/reboot»);
symlink(«toolbox», «/system/bin/renice»);
symlink(«toolbox», «/system/bin/rm»);
symlink(«toolbox», «/system/bin/rmdir»);
symlink(«toolbox», «/system/bin/rmmod»);
symlink(«toolbox», «/system/bin/route»);
symlink(«toolbox», «/system/bin/schedtop»);
symlink(«toolbox», «/system/bin/sendevent»);
symlink(«toolbox», «/system/bin/setconsole»);
symlink(«toolbox», «/system/bin/setprop»);
symlink(«toolbox», «/system/bin/sleep»);
symlink(«toolbox», «/system/bin/smd»);
symlink(«toolbox», «/system/bin/start»);
symlink(«toolbox», «/system/bin/stop»);
symlink(«toolbox», «/system/bin/sync»);
symlink(«toolbox», «/system/bin/top»);
symlink(«toolbox», «/system/bin/umount»);
symlink(«toolbox», «/system/bin/uptime»);
symlink(«toolbox», «/system/bin/vmstat»);
symlink(«toolbox», «/system/bin/watchprops»);
symlink(«toolbox», «/system/bin/wipe»);
symlink(«toolbox», «/system/bin/lsof»);
symlink(«toolbox», «/system/bin/touch»);
symlink(«dumpstate», «/system/bin/dumpcrash»);
symlink(«debuggerd», «/system/bin/csview»);
symlink(«mksh», «/system/bin/sh»);
symlink(«Roboto-Regular.ttf», «/system/fonts/DroidSans.ttf»);
symlink(«Roboto-Bold.ttf», «/system/fonts/DroidSans-Bold.ttf»);
Назначаем права доступа блоку system, а также bin, в том числе выдаем права для Root, если он есть – в большинстве случаев есть, и заканчиваем выдачу прав доступа всему, что только можно.
set_perm_recursive(0, 0, 0755, 0644, «/system»);
set_perm_recursive(0, 2000, 0755, 0755, «/system/bin»);
set_perm(0, 3003, 06755, «/system/bin/ip»);
set_perm(0, 3003, 02750, «/system/bin/netcfg»);
set_perm(0, 3004, 02755, «/system/bin/ping»);
set_perm(0, 2000, 06750, «/system/bin/run-as»);
set_perm(0, 0, 06755, «/system/bin/su»);
set_perm_recursive(1002, 1002, 0755, 0440, «/system/etc/bluetooth»);
set_perm(0, 0, 0755, «/system/etc/bluetooth»);
set_perm(1000, 1000, 0640, «/system/etc/bluetooth/auto_pairing.conf»);
set_perm(3002, 3002, 0444, «/system/etc/bluetooth/blacklist.conf»);
set_perm(1002, 1002, 0440, «/system/etc/dbus.conf»);
set_perm(1014, 2000, 0550, «/system/etc/dhcpcd/dhcpcd-run-hooks»);
set_perm(0, 2000, 0550, «/system/etc/init.goldfish.sh»);
set_perm_recursive(0, 0, 0755, 0555, «/system/etc/ppp»);
set_perm_recursive(0, 2000, 0755, 0644, «/system/vendor»);
set_perm_recursive(0, 0, 0755, 0644, «/system/vendor/firmware»);
set_perm(0, 2000, 0755, «/system/vendor/firmware»);
set_perm_recursive(0, 2000, 0755, 0755, «/system/xbin»);
set_perm(0, 2000, 04755, «/system/xbin/busybox»);
set_perm(0, 0, 06755, «/system/xbin/su»);
Также, если ядро прошивки поддерживает выполнение init.d, то указываем его выполнение в сценарии.
set_perm_recursive(0, 0, 0755, 0755, «/system/etc/init.d»);
Приступаем к прошивке самого ядра, чаще всего оно имеет название zImage или boot.img. Дополнительно выводим на экран информацию об этом.
ui_print(«Kernel now flashing.»);
assert(package_extract_file(«zImage», «/tmp/zImage»),
write_raw_image(«/tmp/zImage», «boot»),
delete(«/tmp/zImage»));
Повторно выполняем очистку Dalvik-кэша.
delete_recursive(«/data/dalvik-cache»);
Опять размонтируем блоки.
run_program(«/sbin/umount», «/system»);
run_program(«/sbin/umount», «/cache»);
run_program(«/sbin/umount», «/data»);
Выводим на экран сообщение об успешном завершении процесса.
ui_print(«All done! Installation succesful!»);
Прописываем строку для перезагрузки, дабы она выполнилась автоматически.
run_program(«/sbin/reboot»);
Где взять такую же шапку на andoid 7.0