Создание патча update.zip для прошивки через рекавери



Реп: (275)
 
FAQ по созданию патча update.zip для прошивки через рекавери

Редактирование Updater-script. Информация, решения, команды, подпись патчей.
Инструкция по установке системных и пользовательских приложений с помощью recovery
Редактирование установленной прошивки и удаление системных приложений

(ключевые слова)


При возникновении ошибки максимально точно её сформулируйте (и обязательно выложите лог) и под спойлер прикрепите код скрипта.
Но предварительно попробуйте сами с ней разобраться, выполнив предложенные действия описанные под спойлером "Ошибки"


Напоминаю, тут не стол заказов. Автору в qms НЕ писать. Посты с просьбой собрать zip для "хххх" Recovery оффтоп

Все заявки на создание/редактирование update.zip оставляйте в теме Стол заказов на создание и редактирование патча update.zip для прошивки через рекавери


Сообщения, не относящиеся к теме обсуждения (оффтоп), удаляются без предупреждения


Возможности
  • Добавление нескольких пользовательских/системных приложений "за один клик" (одним патчем).
  • Добавление/удаление системных приложений без root прав и вспомогательных программ.
  • Изменение прошивки (замена файлов, украшательства и т.д.).
  • Обновление программы или прошивки.
  • Переразметка памяти (обсуждения в другой теме)
  • Получение root прав SuperUser, SuperSU, Magisk


Инструменты и файлы
Инструменты
  1. Установленный на телефоне кастомный рекавери (CWM/TWRP)
  2. NotePad++ (редактор с сохранением Unix формата)
  3. Zip_signer (подписчик архивов)
  4. Архиватор ZIP
  5. Файл-заготовка sample.zip (либо update-binary для ручной сборки)
    Прикрепленный файлZip_signer.rar ( 13.28 КБ )
    Прикрепленный файлsample-patch.rar ( 4.77 МБ )
    Прикрепленный файлupdate-binary.rar ( 113.25 КБ )
  6. Дополнительные версии бинарника. Прикрепленный файлbinary_all.rar ( 649.36 КБ )
  7. Бинарники (архив/исходники)
    Бинарники (исходники)
    Исходники бинарника, основная ссылка:
    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, в самом низу)

    © Octanium

  8. Подписчик для Linux: Прикрепленный файлsignapk.zip ( 9.24 КБ )
    + Android update-script (Пост Няшная #63580419)
Внимание! Патчи создаются только для мод.рекавери и результативно работают только в них. В стоковых рекавери (на аппаратах "из коробки") патчи не работают.

Программы | Скрипты для создания update.zip
Создание
Для того, чтобы установить новые системные приложения apk в Ваш аппарат, необходимо выполнить три шага:
  1. Собрать свой update.zip (из заготовки sample.zip)
  2. Подписать update.zip утилитой Zip_signer(Не обязательно!)
  3. Закинуть на флэшку и установить в аппарат через ClockWorkMod Recovery
Эти шаги являются универсальными, т.е. подойдут для выполнения других подобных операций.

ШАГ №1
Собрать новый update.zip, используя "болванку" sample.zip
Порядок использования sample.zip:
  1. Разархивировать архив sample.zip
  2. Удалить файлы подписи META-INF/CERT.RSA, CERT.SF, MANIFEST.MF (т.к. 2м шагом мы их будем создавать для своей сборки)
  3. Поместить в папку /data/app свое пользовательское приложение (xxxxx.apk)
  4. При необходимости отредактировать файл updater-script (подробнее позже)
  5. Заархивировать всё (META-INF и data) ZIP'ом без сжатия
ШАГ №2
Подписать update.zip с помощью утилиты Zip_signer
Порядок использования утилиты Zip_signer:
  1. Переименовать Ваш отредактированный (т.е. уже с приложением внутри) sample.zip в update.zip
  2. Поместить его в папку с программой Zip_signer
  3. Запустить файл zip_signer.bat
  4. Дождаться, пока процесс будет завершен
  5. В папке появится файл update-finished.zip - это и есть подписанный файл
  6. Переименовать update-finished.zip по своему усмотрению (согласно логике патча)
ШАГ №3
Установка нового приложения
  1. Перекинуть (переименованный) update-finished.zip на флэшку и установить его в аппарат через TWRP или CWM (install zip from sdcard -> chooze zip from internal sdcard -> Yes, install sample.zip)
  2. Перезагрузить аппарат
Создание в Linux
Действия те же самые как описано выше, за исключением подписи.
Подпись ZIP-архива:
  • Скачиваем signapk.zip и разархивируем в папку <папка-signapk>
  • Назначаем права для всего содержимого - "rwxrwxrwx" (chmod -R 777 ~/<папка-signapk>)
  • Выполняем программу подписи (signapk <имя архива с расширением>)



Маленький мануальчик по созданию апдейт скрипта на основе system.img и boot.img

Внимание! Патчи создаются только для мод.рекавери и результативно работают только в них. В стоковых рекавери (на аппаратах "из коробки") патчи не работают.

Структура патча | Редактирование update-script
Структура
Корень патча:
  • папка 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.

Код:
ui_print("=== Patching new application ===");

- Выводит на экран надпись и пустую строку.
run_program("/sbin/busybox", "mount", "/data");
- (Монтирует data) открывает доступ для работы с системным разделом.
package_extract_dir("data", "/data");
- Копирует содержимое папки data в соответствующую папку на устройстве.
set_perm_recursive(1000, 1000, 0771, 0644, "/data/app");
- Устанавливает владельца, группу и разрешения для содержимого папки на устройстве (инфо по коду ниже)
run_program("/sbin/busybox", "umount", "/data");
- Размонтирование data.
ui_print("=== Complete ===");
- Выводит сообщение о завершении процесса.

  • busybox - приложение для выполнения командной строки, устанавливается с кастомным рекавери, находится в ramdisk/sbin. в кастомных прошивках зачастую добавляют его в system/xbin


Возможные исправления для своих целей
  1. Изменение прав
    set_perm_recursive(1000, 1000, 0771, 0644, "/data/app/");

    можно заменить на:
    set_perm(1000, 1000, 0644, "/data/app/mypiano.apk");
    - В данном случае права изменятся только лишь для добавленного приложения
  2. Добавление системного приложения
    а. Корневая папка data меняется на system
    б. В коде updater-script тоже самое
    в. Права назначаются через set_perm только для добавляемого приложения, для системных код 0675 (инфо по кодам ниже)
  3. Удаление приложения/файла
    В код добавляется строка подобного вида:
    delete("/system/app/OldApk.apk");

    При условии что busybox находится в другом месте, возможная замена
    run_program("/sbin/busybox", "mount", "/data");
    - на -
    run_program("/system/xbin/busybox", "mount", "/data");

    либо
    mount("ext4", "EMMC", "/dev/block/mmcblk0p5", "/data");
    - При этом уточнить расположение блока нужного Вам раздела

Правилами хорошего тона в написании любого кода является использование TAB'ов (отступов в начале строки).
Пример-пояснение
Сначала это вырабатывается как привычка, а в дальнейшем при просмотре сложного кода - очень облегчает "чтение" кода, поиск необходимой информации, наглядность разделов/этапов кода.
В примере простенький скрипт, в котором основные рабочие функции выделены отступом. Т.е. все остальные попросту для красоты и удобства (их можно даже удалить).
Также возможно использование двойных и тройных TAB'ов, наглядный пример - написание кода сайтов html.
show_progress(1.000000, 2);
ui_print(" ");
ui_print("========================================");
ui_print("---------- Silent AUDIO Patch ----------");
ui_print("========================================");
ui_print("> Mounting system...");
run_program("/sbin/busybox", "mount", "/system");
ui_print("> Copying files...");
package_extract_dir("system", "/system");
ui_print("> Fixing permissions...");
set_perm_recursive(0, 0, 0755, 0644, "/system/media/");
ui_print("> Unmounting system...");
run_program("/sbin/busybox", "umount", "/system");
ui_print("------- Changing AUDIO Complete --------");
ui_print(" ");


Описание команд updater-script | Примеры использования команд
Команды
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 секунд, после чего код скрипта выполняется дальше.

wipe data-Подробнее

Несколько полезных команд для проверки версии Android перед установкой обновления
Информацию по запуску shell-скриптов с помощью updater-script + ещё вариант
Команды android 4.4+
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
Используется при отсутствии busybox, либо чтоб не привязываться к его расположению в системе.

package_extract_file("busybox", "/tmp/busybox");
set_perm(0, 0, 0777, "/tmp/busybox");
run_program("/tmp/busybox", "mount", "/data");
...
run_program("/tmp/busybox", "unmount", "/data");
©

Команды перезагрузки
перезагрузка
Код "перезагрузки" и "перезагрузки в рекавери" соответственно:

run_program("/sbin/reboot");

run_program("/sbin/reboot", "recovery");

Команда для новых версий андроид так же обязательно читаем Этот пост.

run_program
run_program
Установка BusyBox ©
Файл busybox кладем в /system/xbin
В скрипте updater-script:
set_perm_recursive(0, 2000, 0755, 0755, "/system/xbin");
set_perm(0, 1000, 0755, "/system/xbin/busybox");
run_program("/system/xbin/busybox", "--install", "-s", "/system/xbin");

------------------------------------------------------------

...

show_progress / set_progress
set_progress

Пример №1 - Android Script Creator (Пост Octanium #44840383)

------------------------------------------------------------

Пример №2

Когда скрипт выполняется очень быстро (1-4 секунд) я использовал следующий код:
show_progress(1.000000, 3);
Т.е. за 3 секунды прогресс бар доходит до 100% (постепенно).
Число "3" выбрано как [время установки скрипта]+1 сек, чтоб прогресс бар при установке гарантированно двигался и не успел дойти до 100% раньше, чем скрипт установится.

------------------------------------------------------------

...

sleep
sleep

Пример №1 - Android Script Creator (Пост Octanium #44840383)

------------------------------------------------------------

...

package_extract_dir
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
Синтаксис: 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
Синтаксис: format("MTD", "<root>");
Форматирует раздел <root>
Пример: format("MTD", "system"); Полностью отформатирует /system . Примечание: форматирование удаляет данные необратимо.

delete
delete
Синтаксис: delete("<file1>"[, "file2", ..."fileN"]);
Удаляет файл(ы)
Пример: delete("/system/app/Calculator.apk"); Удалит Calculator.apk из папки system/app

delete_recursive
delete_recursive
Синтаксис: delete_recursive("<dir1>"[, "dir2", ..."dirN"]);
Рекурсивно удаляет папку(и) со всем содержимым
Пример: delete_recursive("/data/dalvik-cache"); Удалит папку /data/dalvik-cache со всем содержимым.

set_perm
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
Синтаксис: 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.


symlink
symlink
Синтаксис: symlink("<link-target>", "<link-path1"[, "<link-path2>", "<link-path3>"]);
Создает символическую ссылку (как ‘ln-s’). <link-path> пишется в формате root:path, а <link-target> в формате целевой файловой системы (и может быть относительным)
Пример: symlink("/data/app_s", "/system/app") Создаст символическую ссылку на папку /data/app_s для папки /system/app


mount
mount
Синтаксис: mount("<kind>", "<what>", "<path>");
Монтирует <what> в путь <path>. <what> должно быть название раздела, если <kind> это "MTD", или блок памяти если <kind> это "vfat"
Пример: mount("MTD", "userdata", "/data");
Пример монтирования на андроид 9-10

unmount
unmount
Синтаксис: unmount("<path>");
Отключает <path>.
Пример: unmount("/data");

ui_print
ui_print
Синтаксис: ui_print("<message>");
Выводит на экран сообщение <message>
Пример: ui_print("Formatting SYSTEM...");


Ошибки
Возможные ошибки и их решение

Если Вам знакомо что такое Recovery, CWM,TWRP, знаете что такое кастомные прошивки и с чем их едят, то наверняка вы сталкивались с тем что прошивка или обновление не устанавливается выводя при этом ошибку "Status #".

  • Signature verification failed. Installation aborted - Патчи создаются только для мод.рекавери и результативно работают только в них. В стоковых рекавери (на аппаратах "из коробки") патчи НЕ работают. Следует заменить стоковое рекавери на CWM или TWRP.
  • Status 0 - данный код ошибки возник из за того, что файл updater-script или update-binary отсутствуют в прошивке или обновлении
  • Status 255 - данный код ошибки возник из за того, что файл update-binary не подходит
    В обоих случаях лечится одинаково, нужно взять update-binary из любой прошивки для вашего девайса
  • Status 1 - данный код ошибки возник из за того, что заданы неправильные пути монтирования разделов
  • Status 3 - Эта ошибка проявляется при попытке распаковать из архива файлы с не-ASCII именами Подробнее
  • Status 4 - данный код ошибки возник из за того, что архив прошивка либо архив-обновление рассчитаны на более раннюю версию СWM (там использовался updater-script без бинарника update-binary).
  • Status 6 - а) Обозначает что updater-scpript создан не в Unix формате, поэтому при установке Android не распознает что там написано и выдает ошибку Status 6. Для того чтобы это исправить советую скачать и установить NotePad ++ и поменять формат;
      б) Синтаксическая ошибка (пропущен какой-либо символ, например ";", пропущена буква в команде)
  • Status 7 - а) Прошивка не подходит для Вашего девайса и в updater-script прописано другое название модели. Открыть updater-script и удалить строки содержавшие название чужой модели и переподписать прошивку.
      б) Через рекавери сначала смонтировать систему (mounts & storage - mount /system), затем ставить патч
      в) Решение проблемы с ошибкой STATUS 7: Sony Ericsson XPERIA neo - CyanogenMod 7 - FreeXperia PROJECT (OS 2.3) (Пост #11599821)
  • line *** col **: syntax error - Синтаксическая ошибка в строке кода №*** и символе №** (ищите где пропустили или поставили лишний символ, обычно это запятые и кавычки)
  • Symlink: some symlinks failed - Недостаточно места в системном разделе. Патч устанавливает файлы не в тот раздел/блок.
  • No space left on device - Недостаточно места в системном разделе. Патч устанавливает файлы не в тот раздел/блок.
  • format() expects 4 args got 5 либо format() expects 5 args got 4 - [функция format() ожидала Х аргумента, но получила Y] - в содержинии формата убираем либо добавляем название раздела, к примеру ("ext4", "EMMC", "/dev/block/mmcblk0p6", "0", "/system") . "аргумент" - те данные, которые написаны внутри скобок через запятую.
  • Ошибку не выдает, патч в мод.рекавери срабатывает, но нужное приложение не добавляется - см. раздел шапки РЕДАКТИРОВАНИЕ UPDATER-SCRIPT -> п.4, либо вручную монтировать необходимый раздел.
  • Please upgrade to latest binary либо ..... binary - Файл update-binary не подходит, нужно взять update-binary из любой прошивки для вашего девайса.
  • Не работает подписчик Zip_signer - проверьте java на компьютере, обновите либо установите заново.
    "java" не является внутренней или внешней командой, исполняемой программой или пакетным файлом. - ошибка в Zip_signer - установите Java, Android update-script (Пост Vulcanus #54856173)

ps: Если в ходе ваших экспериментов часто появляются ошибки - попробуйте первым делом создать самый простой патч (взяв за основу sample.zip), а затем уже переходить на более сложные.
Это делается в первую очередь для того чтоб избежать механических ошибок в процессе создания патча, а также проверить совместимость с update-binary, совместимость с мод.рекавери и соответствие подписи.

Информация | Сопуствующие темы | Источники | Предложения
Инфо и материалы


Разное
Источники и благодарности
Предложения
Если Вы заметили ошибки в описании или есть материалы для дополнения статьи - просьба сообщить в теме, либо через QMS.

Также очень хотелось бы дополнить эту инструкцию другими примерами и возможностями патчей. В частности, наглядные примеры выполнения команд **_progress и symlink.
Постараюсь это сделать по мере создания патчей. А если стоящие материалы есть у Вас - тоже выкладывайте )

Кроме патча sample.zip хотелось бы добавить еще ряд других "стандартных" патчей
По вопросам наполнения и актуализации шапки темы, Вам всегда готов помочь Куратор Trykath

Сообщение отредактировал ~ Diamond ~ - 08.03.23, 11:33
Причина редактирования: Качественный бинарный файл для прошивки



Реп: (4408)
Здесь будем делиться информацией по Android update-script

В связи с неуклонным переходом на Edify update scripting решил осветить эту тему здесь
Сам скрипт находится update.zip/META-INF/com/google/android/updater-script
Для работы скрипта необходим файл update.zip/META-INF/com/google/android/update-binary
Прикрепленный файлupdate_binary.rar ( 149.61 КБ )

Edify update scripting
show_progress(0.100000, 0);
ui_print("Mounting SYSTEM...");
mount("MTD", "system", "/system");
show_progress(0.100000, 0);
ui_print("Extracting files...");
package_extract_dir("system", "/system");
show_progress(0.400000, 0);
ui_print("Setting permissions...");
set_perm(0, 0, 0644, "/system/framework/framework-res.apk");
show_progress(0.200000, 0);
ui_print("Unmounting SYSTEM...");
unmount("/system");
show_progress(0.100000, 0);

Описание команд
  • 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 . Примечание: форматирование удаляет данные необратимо.

  • 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("/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...");


Инфо была взята отсюда, отсюда и отсюда
Наиболее полное описание команд с примерами здесь (EN)

################################################################################

Amend update-script - это список команд для системы RECOVERY, выполняемых при обновлении из файла формата update.zip
Скрипт находится в папке update.zip\META-INF\com\google\android и имеет следующий вид:
Amend update-script
show_progress 0.1 0

copy_dir PACKAGE:system SYSTEM:

show_progress 0.1 10

Описание команд взято отсюда
Описание команд
  • copy_dir
    Синтаксис: copy_dir <src-dir> <dst-dir> [<timestamp>]
    Копирует содержимое <src-dir> в <dst-dir>. Файлы в <dst-dir> имеющиеся в <src-dir> перезаписываются.
    Пример: copy_dir PACKAGE:system SYSTEM: Скопирует файлы из папки update.zip/system в /system

  • format
    Синтаксис: format <root>
    Форматирует раздел (см. приложение)
    Пример: format SYSTEM: Полностью отформатирует /system . Примечание: форматирование удаляет данные необратимо.

  • delete
    Синтаксис: delete <file1> [... <fileN>]
    Удаляет файл(ы)
    Пример: delete SYSTEM:app/Calculator.apk Удалит Calculator.apk из папки system/app.

  • delete_recursive
    Синтаксис: delete_recursive <file-or-dir1> [... <file-or-dirN>]
    Рекурсивно удаляет файлы и папки со всем содержимым
    Пример: delete_recursive DATA:dalvik-cache Удалит папку /data/dalvik-cache со всем содержимым

  • run_program
    Синтаксис: run_program <program-file> [<args> ...]
    Запускает программу(скрипт).
    Пример: run_program PACKAGE:install_busybox.sh Запустит скрипт update.zip/install_busybox.sh .

  • set_perm
    Синтаксис: set_perm <uid> <gid> <mode> <path> [... <pathN>]
    Устанавливает владельца, группу и разрешения для файла или папки, как ‘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> секунд (или быстрее, если фактическая скорость выполнения может быть определена).
    Пример: show_progress 0.1 0

  • symlink
    Синтаксис: symlink <link-target> <link-path>
    Создает символическую ссылку (как ‘ln-s’). <link-path> пишется в формате root:path, а <link-target> в формате целевой файловой системы (и может быть относительным)
    Пример: symlink /data/app_s SYSTEM:app Создаст символическую ссылку на папку /data/app_s для папки /system/app

Приложение: Определения разделов
ROOT: (Linux block device) /mountpoint/ fs size Description.
-----------------------------------------------------------------------------------------------------------------------
BOOT: (/dev/mtdblock[?]) / (RAM) Raw Kernel - ramdisk and boot config.
DATA: (/dev/mtdblock5) /data/ yaffs2 91904kb User, system config, app config, and apps (without a2sd)
CACHE: (/dev/mtdblock4) /cache/ yaffs2 30720kb OTA cache, Recovery/update config and temp
MISC: (/dev/mtdblock[?]) N/A Raw - -
PACKAGE: (Relative to package file) N/A - - Pseudo-filesystem for update package.
RECOVERY: (/dev/mtdblock[?]) / (RAM) Raw [?]kb The recovery and update environment's kernel and ramdisk. Similar to BOOT:.
SDCARD: (/dev/mmcblk0(p1)) /sdcard/ fat32 32MB-32GB The microSD card. Update zip is usually here.
SYSTEM: (/dev/mtdblock3) /system/ yaffs2 92160kb The OS partition, static and read-only.
TMP: - /tmp/ - - in RAM Standard Linux temporary directory. Cleared on poweroff/reboot.

*Насчет show_progress, не уверен что правильно понял и описал. Буду рад если кто растолкует.


Ну и пожалуй небольшая фишка
Фишка
Всем наверное встречалась ошибка
E:Failure at line 1:
copy_dir PACKAGE:system SYSTEM:
Sync data...
.Installation failed

если посмотреть sdcard/recovery.log можно увидеть следующее:
Finding update package...
I:Update location: SDCARD:update.zip
Opening update package...
I:Update file path: /sdcard/update.zip
Verifying update package...
I:Verified META-INF/CERT.RSA
I:Verified META-INF/MANIFEST.MF
I:Verified META-INF/com/google/android/update-script
I:Verified system/app/Launcher.apk
Installing update...
I:Parsed META-INF/com/google/android/update-script
calling command copy_dir
Copying files...
minzip: Can't create target file "/system/app/Launcher.apk": Read-only file system
W:Command copy_dir: couldn't extract "PACKAGE:system" to "SYSTEM:"
E:Failure at line 1:
copy_dir PACKAGE:system SYSTEM:
Sync data...
.Installation failed

то есть system смонтировано в режиме только чтение
Если выполнить Fix packages permissions system будет в режиме чтения-записи и обновление успешно применится
Теперь я в каждый zip для recovery кладу файл mnt.sh, такого содержания:
#!/sbin/sh

mount -o remount,rw /system;
mount -rw data;

exit 0;

а update-script выглядит так:
run_program PACKAGE:mnt.sh
copy_dir PACKAGE:system SYSTEM:



Сообщение отредактировал sk0t - 29.11.11, 17:03



Реп: (32)
http://forum.xda-developers.com/showthread.php?t=641223
http://www.londatiga.net/it/how-to-create-...te-zip-package/
вот пара ссылочек,по ним помойму все самое нужное можно узнать



Реп: (111)
Вот интересная информация как можно полностью перепрошиться через recovery (даже бутлоадер) посредством redbend_ua



Реп: (584)
Чем отличается update-script от updater-script ?



Реп: (0)
da_jok3r @ 06.03.2011, 18:51 *
Чем отличается update-script от updater-script ?

посматри внимательно содержимое скрипта и поймешь что скрипт сделан по новой технологии и в основном (как я понял) служит для прошивок (хотя может быть и пойдет для программ)
читал на одном сайте что некоторые телефоны видят только этот вид скрипта
я не помню название данного скрипта так-что извени лучше обратиться к автору темы он должен знать



Реп: (4408)
Nesud´ba @ 21.07.2011, 13:44 *
И еще, очень нужно, как с помощью скрипта скопировать раздел /system на флешку???
Что-то типа этого:
updater-script
show_progress(0.100000, 0);
package_extract_file("copy.sh", "/tmp/copy.sh");
show_progress(0.200000, 0);
set_perm(0, 0, 0777, "/tmp/copy.sh");
show_progress(0.200000, 0);
run_program("/tmp/copy.sh");
show_progress(0.400000, 0);
show_progress(0.100000, 0);

copy.sh
#!/sbin/sh

mount -w system
cp -r /system /sdcard/old_sys

Напомню, что перевод строки в обоих файлах должен быть LF(UNIX)
и в конце каждого пустая строка



Реп: (0)
Модификация софта и украшательства для Samsung Galaxy S (Пост #5537891)

а вот и ответ :)



Реп: (174)
Niter43 @ 31.08.2011, 15:21 *
И как это исправить? Читал что надо использовать notepad++ - я его и так изначально использовал.

notepad++ -> Меню -> Кодировки -> Кодировать в UTF-8
После этого пишем скрипт. :)



Реп: (174)
Loginov916,
Вот меняю разрешение экрана
cat /system/build.prop | sed -e "s/ro.sf.lcd_density=.*./ro.sf.lcd_density=$DPI/" > /system/build.prop1
rm /system/build.prop
mv /system/build.prop1 /system/build.prop


Из update-script через run_program вызываю скрипт на изменения build.prop вот так:
package_extract_file("setdpi.sh", "/tmp/setdpi.sh");
set_perm(0, 0, 0755, "/tmp/setdpi.sh");
run_program("/tmp/setdpi.sh", "220");



Реп: (1854)
Апдейт для бекапа проши под Один.

Иногда бывает так, что появляется новая проша, а скачать её негде. Тоесть человек в сервисе или магазине получил прошу, которой нигде нет. По закону подлости эти люди с новой прошей в телефонах толком не разбираются, а прошу новую хотят все. Её очень просто забекапить под Один ( ну или кто чем шьётся). Для этого:
updater-script
package_extract_file("copy.sh", "/tmp/copy.sh");
set_perm(0, 0, 0777, "/tmp/copy.sh");
run_program("/tmp/copy.sh"); (бинарник должен поддерживать команду рун програм)
delete("/tmp/copy.sh");(не уверен в необходимости этой команды темп на то и темп)

copy.sh
#! /sbin/sh

#если в проше sbin нерабочий, то делаем из-под #! /system/bin/sh или #! /system/xbin/sh в зависимости где находится файл SH. И в данных случаях ОБЯЗАТЕЛЬНО нужно в основном скрипте до рун програм смонтировать систем.
Для справки команды монтирования на мой девайс:
mount("ext4", "EMMC", "/dev/block/stl12", "/system");
mount("rfs", "EMMC", "/dev/block/stl12", "/system");

mount("ext4", "EMMC", "/dev/block/stl13", "/data");
mount("rfs", "EMMC", "/dev/block/stl13", "/data");

mount("ext4", "EMMC", "/dev/block/stl14", "/cache");
mount("rfs", "EMMC", "/dev/block/stl14", "/cache");

mount("ext4", "EMMC", "/dev/block/mmcblk0p2", "/sd-ext");
mount("vfat", "EMMC", "/dev/block/mmcblk0p1", "/sdcard");
бинарник должен поддерживать команду маунт (есть такие что не поддерживают)
###################################################

mkdir /sdcard/Backup
dd if=/dev/block/stl12 of=/sdcard/Backup/system.rfs
dd if=/dev/block/bml8 of=/sdcard/Backup/boot.img
dd if=/dev/block/bml9 of=/sdcard/Backup/recovery.img
dd if=/dev/block/bml4 of=/sdcard/Backup/amss
#(Вот здесь Вы должны точно знать какой блок у вас за что отвечает и вписать свои, Тоесть нужно выяснить блоки для своего девайса (рамдиск можно поюзать))
cd /sdcard/Backup
busybox tar cf PDA.tar boot.img recovery.img system.rfs
md5sum -t PDA.tar >>PDA.tar
mv PDA.tar PDA.tar.md5
cd /sdcard/Backup
busybox tar cf Modem.tar amss
md5sum -t Modem.tar >>Modem.tar
mv Modem.tar Modem.tar.md5

После подобной сборки Онин ругнётся пару раз но прошьёт. Подобный апдейт должен быть в каждой шапке оф прош.
Прикрепленный файлtarmd5.zip ( 99.46 КБ )


Сообщение отредактировал finist1 - 06.10.11, 05:16



Реп: (1854)
Хочу поделиться своей наработкой.
На моём девайсе помимо двух официальных Рековери есть штуки три CWM. Какието из них содержат командную строку в /sbin какието нет. Встал вопрос о том чтоб апдейты, содержащие дополнительные скрипты, были универсальными. Чтоб для запуска апдейта человеку не приходилось сначала рековери переставлять.
Выход из положения оказался такой:
updater-script
package_extract_dir("tmp", "/tmp");
set_perm_recursive(0, 0, 2000, 4777, "/tmp");

В темп вставляем бузибокс и командную строку!!!
run_program("/tmp/busybox", "/tmp/sh", "/tmp/ваш скрипт.sh");

delete("/tmp/ваш скрипт.sh", "/tmp/busybox", "/tmp/sh");

ваш скрипт.sh
#!/tmp/busybox sh

И все дела ;)

Это актуально при отсутствии командной строки в рекавери (#!/sbin/sh) или невозможности обратиться к командной строке в систем (#!/system/bin/sh) - форматирование-конвертирование и пр.

Сообщение отредактировал finist1 - 18.11.11, 16:14



Реп: (510)
Хотел немного дополнить: для Edify скрипта еще есть команда assert, не нашел ее упоминаний в этой теме. Наткнулся случайно, выглядит так (в данном случае тестит свойства, которые определяют телефон как HTC Desire HD, соответственно, существует еще и команда getprop):

assert(getprop("ro.product.device") == "ace" || getprop("ro.build.product") == "ace" || getprop("ro.product.board") == "ace");

ну или так для одного свойства:
assert(getprop("ro.product.device") == "ace");

Но вообще насколько я помню из программирования, assert - тестовая команда, которая продолжает выполнение дальше, если указанное в ней условие проходит, и валит все, если нет (в данном случае на другом телефоне этот код при применении патча повалится с ошибкой, к сожалению, не помню с какой конкретно, и кстати имеющей мало отношения к "тест не прошел").

Да, эта команда есть уже в полном описании команд... Соответственно, если сообщение ненужное, модератор/куратор удалит, сам не уверен.

Сообщение отредактировал gwindlord - 26.12.11, 19:31



Реп: (483)
aksidan @ 18.03.2012, 21:07 *
Вопрос: можно ли так делать через рекавери от официальной прошивки, если да, то что я сделал неправильно?
Если такой вопрос поднимался, пожалуйста не ругайте, подскажите где посмотреть?

Попробуй подписать этим наборчиком
Прикрепленный файлUpdate_Zip_Packager.zip ( 541.93 КБ )

На моем планшете помогло. И кстати, скрипт скорее всего придется переписать на Edify



Реп: (6)
aksidan @ 23.03.2012, 11:55 *
Но все таки, для Amend скрипта нужен update-binary или нет?

Для Amend - нет, для Edify - да



Реп: (12)
Прикрепленный файлWork.zip ( 2.13 МБ )
Eсли кому-то нужно, прикрепляю несколько update.zip
В папке UpdateZipCreate утилиты для упаковки и подписывания update.zip
Все проверены и 100% работают на заводском рекавери 3е
Прошивка заводская.

Тел Билайн E300 (Huawei U8500)
Прошивка U8500 V100R001C278B712

Всем удачи.



Реп: (483)
GooD_DeviL @ 09.05.2012, 13:27 *
Так как никто не ответил насчет подписки спрошу так... Можно ли подписать update.zip, чтобы он встал через стоковое recovery 4.0.3? Если да, то чем?

Я подписывал этим для китайского планшета и он его сожрал. Другими подписывателями тоже ругалось



Реп: (5)
faplug,
А что в нем куда запихивать? :blush:
Не поделишься чем еще пытался подписать? Просто пробовал тут чем то с этой ветки, у меня начиналось обновление, доходило до 1/3 и дохлый робот :wacko:



Реп: (483)
GooD_DeviL @ 09.05.2012, 22:52 *
faplug,
А что в нем куда запихивать?
Не поделишься чем еще пытался подписать? Просто пробовал тут чем то с этой ветки, у меня начиналось обновление, доходило до 1/3 и дохлый робот

В папку placehere положить готовую прошивку, запустить script.bat? отказаться от предложения и выбрать п.2. все остальное приводило к ошибке проверки подписи - verification failed



Реп: (5)
faplug,
А можешь попробовать подписать архив который я выше выкладывал? Если не трудно...



Реп: (483)
GooD_DeviL @ 10.05.2012, 13:50 *
А можешь попробовать подписать архив который я выше выкладывал? Если не трудно...

только вечером, прикреплю к этому посту

Прикрепленный файлupdate.zip ( 1.43 МБ )


А вообще смущает скрипт. И кстати ошибся насчет инструкции - в папку placehere надо распаковать прошивку :blush:

Сообщение отредактировал faplug - 10.05.12, 23:21

Куратор: Trykath

Полная версия   Текстовая версия

Помощь   Правила

Сейчас: 17.04.24, 20:25