Модификация updater-script
Файл updater-script содержит полный сценарий установки прошивки на Android-устройства. В него можно добавить или удалить сценарии по добавлению или удалению различных файлов и папок, отображению информации во время процесса прошивания девайса, производить рутирование прямо во время прошивания и так далее.
В данном материале мы разберемся с основными командами, которые поддерживает данный файл.

Находится updater-script по пути:
Открывать его можно любым текстовым редактором, но настоятельно рекомендуется использовать программу Notepad++. Теперь давайте разберемся с полным списком команд, которые поддерживает updater-script.
package_extract_dir
Копирует содержимое папки. Файлы, уже имеющиеся в такой же папке, перезаписываются.
Пример: package_extract_dir(«dir1″,»/dir1»); Производит копирование файлов из папки update.zip/dir1 в /dir1
package_extract_file
Синтаксис: package_extract_file(«источник»,»куда копировать»);
Копирует указанный файл. При совпадении имен, файл перезаписывается.
Пример: package_extract_file(«file.sh»,»/dir1/file.sh»); Копирует file.sh из update.zip в указанный путь /dir1/file.sh
format
Форматирует указанный раздел.
Пример: format(«MTD»,»dir1″); Полностью форматирует раздел dir1. Внимание! Данные при форматировании удаляются безвозвратно!
delete
Удаляет файл (файлы).
Пример: delete(«/dir1/program.apk»); Удаляет файл program.apk из dir1.
delete_recursive
Рекурсивно удаляет папку или папки со всем их содержимым.
Пример: delete_recursive(«/dir1/data»); Производит удаление директории /dir1/data со всем её содержимым.
run_program
Запускает программу (программы) или скрипты.
Пример: run_program(«/dir1/install_prog.sh»); Запускает скрипт, расположенный по пути: /dir1/install_prog.sh
set_perm
Команда устанавливает группу, владельца и разрешения для папки или файла, аналогично «chmod», «chown», и «chgrp», но сразу всё в одном.
Пример: set_perm(0, 2000, 0550, «/dir1/tmp/init.test.sh») Установит владельца, группу и разрешения для указанного файла, расположенного по пути: /dir1/tmp/init.test.sh
set_perm_recursive
Рекурсивно устанавливает разрешения, владельца и группу для папки со всем её содержимым. включая другие папки и файлы.
Пример: set_perm_recursive(0, 0, 0755, 0644, «/dir1/tmp»); устанавливает права для всего содержимого папки /dir1/tmp, для папок, соответственно, — 0755, а для файлов — 0644.
show_progress
Устанавливает прогресс полоски выполнения на определенную долю за указанное количество секунд. Значение может быть равно нулю для продвижения его не по времени, а используя команду set_progress.
Пример: show_progress(0.200000, 3); прогресс будет увеличиваться на 0.2 часть за 3 секунды.
set_progress
Команда устанавливает определенное положение прогресс-бара.
Пример: set_progress(0.700000); полоса выполнения будет заполнена на 0.7 часть.
symlink
Синтаксис: symlink(«»,»Создает символическую ссылку одной директории на другую (как «ln-s»). Первое значение пишется в формате root:path, а второе – в формате целевой файловой системы (которое, соответственно, может быть относительным)
Пример: symlink(«/dir1/test_s», «/sys1/test»). Будет создана символическая ссылка на директорию /dir1/test_s для папки /sys1/test
mount
Монтирует указанную директорию по указанному пути. Соответственно, должно быть название раздела, если это «MTD», или блок памяти – если это «vfat».
unmount
Демонтирует (отключает) указанную директорию.
ui_print
При помощи данной команды на экран устройства выводится указанное сообщение.
Пример: ui_print(«Currently formatting DIR1…»); на экране будет отображено сообщение «Currently formatting DIR1…».
Python recursion permutations
Im having trouble trying to make a permutation code with recursion. This is suppose to return a list back to the use with all the posible position for each letter. so for the word cat it is suppose to return [‘cat’,’act’,atc,’cta’,’tca’,’tac’] . so far i have this
There are steps there but im not sure how to use them
![]()
10 Answers 10
You want to do recursion, so you first have to find out how the recursion would work. In this case it is the following:
And as a final condition:
So the recursion splits up the list in sublists with one element extracted each time. Then this element is added to the front of each of the permutations of the sublist.
So in pseudo-code:
Recursively, think about the base case and build from that intuition.
1) What happens when there’s only one character ‘c’? There’s only one permutation of that element, and so we return a list containing only that element.
2) How can we generate the next permutation given the last one? Adding an additional letter ‘a’ at all possible positions in the previous permutation ‘c’ gives us ‘ca’, ‘ac’.
3) We can continue building larger and larger permutations by adding an additional character at all possible positions in each earlier permutation.
The following code returns a list of one character if the string has one character or less. Otherwise, for all permutations not including the last character in the string s[-1], we generate a new string for each position where we could include that character and append the new string to our current list of permutations.
Что такое set perm recursive в программирование
FAQ по созданию патча update.zip для прошивки через рекавери
Редактирование Updater-script. Информация, решения, команды, подпись патчей.
Инструкция по установке системных и пользовательских приложений с помощью recovery
Редактирование установленной прошивки и удаление системных приложений
(ключевые слова)
Напоминаю, тут не стол заказов.. Посты с просьбой собрать zip для «хххх» Recovery оффтоп
Сообщения, не относящиеся к теме обсуждения (оффтоп), удаляются без предупреждения
- Добавление нескольких пользовательских/системных приложений «за один клик» (одним патчем).
- Добавление/удаление системных приложений без root прав и вспомогательных программ.
- Изменение прошивки (замена файлов, украшательства и т.д.).
- Обновление программы или прошивки.
- Переразметка памяти (обсуждения в другой теме)
- Получение root прав SuperUser, SuperSU, Magisk
- Установленный на телефоне кастомный рекавери (CWM/TWRP)
(редактор с сохранением Unix формата) - Zip_signer (подписчик архивов)
- Файл-заготовка sample.zip (либо update-binary для ручной сборки)
Zip_signer.rar ( 13.28 КБ )
sample-patch.rar ( 4.77 МБ )
update-binary.rar ( 113.25 КБ ) - Дополнительные версии бинарника. binary_all.rar ( 649.36 КБ )
- Бинарники (архив/исходники)
Исходники бинарника, основная ссылка:
https://android.google…ootable/recovery/+refs
выбираем к примеру «android-9.0.0_r18» , потом ищем папку «updater», в папке «updater» исходники бинарника
К примеру https://android.google…droid-9.0.0_r18/updater — можно глянуть все команды которые может выполнить бинари в андроид 9.0.0 (в файле install.cpp, в самом низу)
- Собрать свой update.zip (из заготовки sample.zip)
- Подписать update.zip утилитой Zip_signer(Не обязательно!)
- Закинуть на флэшку и установить в аппарат через ClockWorkMod Recovery
- Разархивировать архив sample.zip
- Удалить файлы подписи META-INF/CERT.RSA, CERT.SF, MANIFEST.MF (т.к. 2м шагом мы их будем создавать для своей сборки)
- Поместить в папку /data/app свое пользовательское приложение (xxxxx.apk)
- При необходимости отредактировать файл updater-script (подробнее позже)
- Заархивировать всё (META-INF и data) ZIP’ом без сжатия
- Переименовать Ваш отредактированный (т.е. уже с приложением внутри) sample.zip в update.zip
- Поместить его в папку с программой Zip_signer
- Запустить файл zip_signer.bat
- Дождаться, пока процесс будет завершен
- В папке появится файл update-finished.zip — это и есть подписанный файл
- Переименовать update-finished.zip по своему усмотрению (согласно логике патча)
- Перекинуть (переименованный) update-finished.zip на флэшку и установить его в аппарат через TWRP или CWM (install zip from sdcard -> chooze zip from internal sdcard -> Yes, install sample.zip)
- Перезагрузить аппарат
- Скачиваем signapk.zip и разархивируем в папку <папка-signapk>
- Назначаем права для всего содержимого — «rwxrwxrwx» (chmod -R 777
Внимание! Патчи создаются только для мод.рекавери и результативно работают только в них. В стоковых рекавери (на аппаратах «из коробки») патчи не работают.
- папка META-INF
- папка источник установки приложений (system, data, sdcard, cache, sd-ext)
Обязательные файлы: - META-INF/com/google/android/update-binary — системное средство запуска данного патча, также создает временную рабочую папку tmp
- META-INF/com/google/android/updater-script — выполняемый скрипт по которому и происходят операции копирования и т.д.
Разберем sample.zip
Патч добавляет пользовательское приложение MyPiano в Data.
• package_extract_dir
Синтаксис: package_extract_dir(«<src-dir>», «<dst-dir>»);
Копирует содержимое <src-dir> в <dst-dir>. Файлы в <dst-dir> имеющиеся в <src-dir> перезаписываются.
Пример: package_extract_dir(«system», «/system»); Скопирует файлы из папки update.zip/system в /system
• package_extract_file
Синтаксис: package_extract_file(«<src-file>», «<dst-file>»);
Копирует файл <src-file> в <dst-file>. Если файл <dst-file> существует, то он перезаписывается.
Пример: package_extract_file(«test.sh», «/tmp/test.sh»); Скопирует файл test.sh из update.zip в /tmp/test.sh
• format
Синтаксис: format(«MTD», «<root>»);
Форматирует раздел <root>(см. приложение).
Пример: format(«MTD», «system»); Полностью отформатирует /system . Примечание: форматирование удаляет данные необратимо.
Пример 2: format(«ext4», «EMMC», «/dev/block/mtdblock5», «0», «/system»);
Определение номера блока под спойлером «инфо и материалы».
• delete
Синтаксис: delete(«<file1>»[, «file2», . «fileN»]);
Удаляет файл(ы)
Пример: delete(«/system/app/Calculator.apk»); Удалит Calculator.apk из папки system/app.
• delete_recursive
Синтаксис: delete_recursive(«<dir1>»[, «dir2», . «dirN»]);
Рекурсивно удаляет папку(и) со всем содержимым
Пример: delete_recursive(«/data/dalvik-cache»); Удалит папку /data/dalvik-cache со всем содержимым.
• run_program
Синтаксис: run_program(«<filetorun>»[, «<opt1>», «<opt2>», «<opt3>»]);
Запускает программу(скрипт) <filetorun>.
Пример: run_program(«/tmp/install_busybox.sh»); Запустит скрипт /tmp/install_busybox.sh.
• set_perm
Синтаксис: set_perm(<uid>, <gid>, <mode>, «<pathtofile>»[, . «pathtofileN»]);
Устанавливает владельца, группу и разрешения для файла или папки, как ‘chmod’, ‘chown’, и ‘chgrp’ всё в одном
Пример: set_perm(0, 2000, 0550, «/system/etc/init.goldfish.sh»); Установит владельца, группу и разрешения для файла /system/etc/init.goldfish.sh
• set_perm_recursive
Синтаксис: set_perm_recursive(<uid>, <gid>, <dir-mode>, <file-mode>, «<path>»[, . «<pathN>»])
Рекурсивно устанавливает владельца, группу и разрешения для содержимого папки. <dir-mode> — для папок, <file-mode> — для файлов.
Пример: set_perm_recursive(0, 0, 0755, 0644, «/system/app»); Установит права для содержимого /system/app, для папок — 0755, для файлов — 0644.
• show_progress
Синтаксис: show_progress(<fraction>, <duration>);
Продвижение прогрессбара на долю <fraction> за <duration> секунд. <duration> может быть нулевым для продвижения его по командe set_progress, а не по времени.
Пример: show_progress(0.100000, 1); Увеличит прогресс на 0.1 часть за 1 секунду
• set_progress
Синтаксис: set_progress(<fraction>);
Устанавливает положение прогрессбара на долю <fraction>, для самого последнего вызова команды show_progress.
Пример: set_progress(0.500000);
• symlink
Синтаксис: symlink(«<link-target>», «<link-path1″[, «<link-path2>», «<link-path3>»]);
Создает символическую ссылку (как ‘ln-s’). <link-path> пишется в формате root:path, а <link-target> в формате целевой файловой системы (и может быть относительным). Википедия Symlink.
Пример: symlink(«/data/app_s», «/system/app»); Создаст символическую ссылку на папку /data/app_s для папки /system/app
• mount
Синтаксис: mount(«<kind>», «<what>», «<path>»);
Монтирует <what> в путь <path>. <what> должно быть название раздела, если <kind> это «MTD», или блок памяти если <kind> это «vfat»
Пример: mount(«MTD», «userdata», «/data»);
• unmount
Синтаксис: unmount(«<path>»);
Отключает <path>.
Пример: unmount(«/data»);
• ui_print
Синтаксис: ui_print(«<message>»);
Выводит на экран сообщение <message>
Пример: ui_print(«Formatting SYSTEM. «);
• sleep
Синтаксис: sleep(<time>);
Пауза процесса на <time> секунд
Пример: sleep(5); — пауза 5 секунд, после чего код скрипта выполняется дальше.
• set_metadata / set_metadata_recursive
Синтаксис: set_metadata (. );
Устанавливает владельца, группу и разрешения (новая команда взамен set_perm для andriod 4.4.*)
Примеры: Android update-script (Пост #32151495)
Создание патча update.zip для прошивки через рекавери (Пост kory-vadim #81945464)
• set_metadata / set_metadata_recursive
Синтаксис:
set_metadata(«имя файла», «ключ1», «значение1», «ключ2», «значение2», . )
set_metadata_recursive(«имя директории», «ключ1», «значение1», «ключ2», «значение2», . )
Ключи:
* uid
* gid
* mode (set_perm_extd only)
* fmode (set_perm_extd_recursive only)
* dmode (set_perm_extd_recursive only)
* selabel
* capabilities
первые три (uid, gid, mode) это тоже самое что и в chmod, заполняется «uid», 0, «gid», 1000, «mode», 06754.
для установки прошивки хватает трех ключей «uid», 0, «gid», 1000, «mode», 06754.
Пример: set_metadata(«/system/xbin/shelld», «uid», 0, «gid», 1000, «mode», 06754, «capabilities», 0x0, «selabel», «u:object_r:system_file:s0»);
set_metadata_recursive(«/system/xbin», «uid», 0, «gid», 2000, «dmode», 0755, «fmode», 0755, «capabilities», «0x0», «selabel», «u:object_r:system_file:s0»);
• команды для Nexus’ов
block_image_update(«/dev/block/platform/msm_sdcc.1/by-name/system», package_extract_file(«system.transfer.list»), «system.new.dat», «system.patch.dat»);
Синтаксис: block_image_update(«Путь к блоку раздела», package_extract_file(«список информации для патча (?) «), «образ», «патч образа»);
я так понимаю, что так прошивается сильно сжатая прошивка (образ системы).
Еще ifelse
Пример: ifelse(is_mounted(«/system»), unmount(«/system»)); — если раздел сустем смонтирован дается команда на его размонтирование, если размонтиовать то нечего не происходит.
• Информация по атрибутам set_metadata и подобным командам на Android 4.4+
Android update-script (Пост blackeangel #50803606)
Описание откуда берутся «u:object_r:uncrypt_exec:s0» и подобные атрибуты. . .
• Пример скрипта который может удалять\перемещать\бекапить файлы и вести лог действий
Android Script Creator (Пост Octanium #51085030)
• Временный Busybox
Используется при отсутствии busybox, либо чтоб не привязываться к его расположению в системе.