Update binary чем открыть
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" исходники бинарника
- Собрать свой 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 и разархивируем в папку
- Назначаем права для всего содержимого - "rwxrwxrwx" (chmod -R 777 ~/)
- Выполняем программу подписи (signapk )
Внимание! Патчи создаются только для мод.рекавери и результативно работают только в них. В стоковых рекавери (на аппаратах "из коробки") патчи не работают.
- папка 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.
- Устанавливает владельца, группу и разрешения для содержимого папки на устройстве (инфо по коду ниже)
Сначала это вырабатывается как привычка, а в дальнейшем при просмотре сложного кода - очень облегчает "чтение" кода, поиск необходимой информации, наглядность разделов/этапов кода.
В примере простенький скрипт, в котором основные рабочие функции выделены отступом. Т.е. все остальные попросту для красоты и удобства (их можно даже удалить).
Также возможно использование двойных и тройных TAB'ов, наглядный пример - написание кода сайтов html.
show_progress(1.000000, 2);
ui_print(" ");
ui_print("======================================= ---------- Silent AUDIO Patch ----------");
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(" ");
• package_extract_dir
Синтаксис: package_extract_dir("", "");
Копирует содержимое в . Файлы в имеющиеся в перезаписываются.
Пример: package_extract_dir("system", "/system"); Скопирует файлы из папки update.zip/system в /system
• package_extract_file
Синтаксис: package_extract_file("", "");
Копирует файл в . Если файл существует, то он перезаписывается.
Пример: package_extract_file("test.sh", "/tmp/test.sh"); Скопирует файл test.sh из update.zip в /tmp/test.sh
• format
Синтаксис: format("MTD", "");
Форматирует раздел (см. приложение).
Пример: format("MTD", "system"); Полностью отформатирует /system . Примечание: форматирование удаляет данные необратимо.
Пример 2: format("ext4", "EMMC", "/dev/block/mtdblock5", "0", "/system");
Определение номера блока под спойлером "инфо и материалы".
• delete
Синтаксис: delete(""[, "file2", . "fileN"]);
Удаляет файл(ы)
Пример: delete("/system/app/Calculator.apk"); Удалит Calculator.apk из папки system/app.
• delete_recursive
Синтаксис: delete_recursive(""[, "dir2", . "dirN"]);
Рекурсивно удаляет папку(и) со всем содержимым
Пример: delete_recursive("/data/dalvik-cache"); Удалит папку /data/dalvik-cache со всем содержимым.
• run_program
Синтаксис: run_program(""[, "", "", ""]);
Запускает программу(скрипт) .
Пример: run_program("/tmp/install_busybox.sh"); Запустит скрипт /tmp/install_busybox.sh.
• set_perm
Синтаксис: set_perm(, , , ""[, . "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(0, 0, 0755, 0644, "/system/app"); Установит права для содержимого /system/app, для папок - 0755, для файлов - 0644.
• show_progress
Синтаксис: show_progress(, );
Продвижение прогрессбара на долю за секунд. может быть нулевым для продвижения его по командe set_progress, а не по времени.
Пример: show_progress(0.100000, 1); Увеличит прогресс на 0.1 часть за 1 секунду
• set_progress
Синтаксис: set_progress();
Устанавливает положение прогрессбара на долю , для самого последнего вызова команды show_progress.
Пример: set_progress(0.500000);
• symlink
Синтаксис: symlink("", "
Создает символическую ссылку (как ‘ln-s’). пишется в формате root:path, а в формате целевой файловой системы (и может быть относительным). Википедия Symlink.
Пример: symlink("/data/app_s", "/system/app"); Создаст символическую ссылку на папку /data/app_s для папки /system/app
• mount
Синтаксис: mount("", "", "");
Монтирует в путь . должно быть название раздела, если это "MTD", или блок памяти если это "vfat"
Пример: mount("MTD", "userdata", "/data");
• unmount
Синтаксис: unmount("");
Отключает .
Пример: unmount("/data");
• sleep
Синтаксис: sleep();
Пауза процесса на секунд
Пример: sleep(5); - пауза 5 секунд, после чего код скрипта выполняется дальше.
• 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")); - если раздел сустем смонтирован дается команда на его размонтирование, если размонтиовать то нечего не происходит.
• Временный 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");
Всем привет! Для интересующихся системой Андроид решил создать эту статью. Все, кто использует ОС Андроид не только для звонков и воспроизведения медиафайлов, а те кто любит эксперементировать с другими прошивками, ставить украшательства полностью изменяющие интерфейс, различные твики по увеличению производительности и т.д.(ну, конечно-же имеет рут права), не раз сталкивались с пакетами расширением .zip для установки через CWM recovery. Какова структура этих пакетов, как они ставятся, как самому собрать такой пакет смотрим под кат.
Так как подавляющее множество новичков в этом вопросе, описываю все своими словами. Зип пакет для рекавери,- это набор файлов, скриптов, содержащих в себе синтаксис (текст) на языке edify для выполнения каких либо задач (замена любых файлов, удаление, форматирование, вставка файлов, их запуск и т.д.). Структура пакета:
Внутри пакета мы видим в первую очередь папку «META-INF» в которой лежит папка «сom», далее папка «google», потом папка «android», а уже в последней мы видим два файла: updater-script и update-binary. Такое «забавное» содержание папки META-INF одинаково для всех recovery и устройств на ОС Андроид и только его может «читать» рекавери. Updater-script,- это файл, содержащий в себе команды для рекавери поэтапно. Например открываем updater-script рут эксплорером в текстовом редакторе и видим:
mount("/system");- скрипт монтирует систему на запись
delete("/system/app/calculator.apk");- удаляет из папки system/app/ приложение калькулятор
umout("/system");- размонтирует систему.
Этот скрипт может содержать любой синтаксис для удаления, копирования, открытия и т.д., но об этом позже. Второй файл update-binary,- это набор команд на языке edify (типа шпаргалка для updater-script). Рут эксплорером не открывается из-за большого веса и как правило, скачивается уже готовый. Пример для чего он нужен. Ставите архив, рекавери «смотрит» в updater-script первую команду, например, mount("/system); дальше эта команда проверяется в update-binary, а там написано, что эта команда монтирует на запись систему, и система это выполняет. Еще при распаковке в папке META-INF вы можете увидеть файлы MANIFEST.MF, CERT.RSA и CERT.SF. Это подпись архива, и нужна она только для заводского рекавери. Так же возле «главной» папки META-INF, может быть любая папка либо файл. Например пакет для замены ядра системы: видим в нем папку META-INF со всем в себе содержащим, что я писал выше (META-INF/com/google/android/updater-script и update-binary) и образ ядра boot.img. Либо пакет для удаления и замены, например, стандартного музыкального плеера: META-INF и папка system, а в ней папка app в которую мы ложем напр. playerpro.apk. C этим вроде разобрались, переходим к созданию пакета:
Для того чтобы собрать пакет, изменить или перепаковать прямо на смартфоне, нам потребуется в первую очередь рут права, файл update-binary и три программы: рут эксплорер, zarchiver, и программа для подписи архивов zip signer. Поехали! На примере мы будем удалять стоковый плеер, и на его место ставим PlayerPro.
1. Открываем root explorer и создаем путь из папок META-INF/com/google/android/.
2. В папку android распаковываем и кладем update-binary.
3. Так же в папке android жмем (в приложении Рут эксплорер) дополнительное меню и тапаем на «создать файл». Имя файла прописываем updater-script.
4. Открываем updater-script в текстовом редакторе того-же рут эксплорера и прописываем команды:
5. Выходим и сохраняем.
6. Шагаем к папке META-INF, и возле нее создаем папку system, а в ней папку app, куда кладем уже установленный апк файл нашего плеера (взять его можно по пути data/app).
7. Заходим в прогу Zarchiver/настройки/уровень сжатия zip и выбираем «нормальный». Потом выходим из настроек и жмем мультивыделение. Выбираем две наши папки META-INF и system, пакуем их в зип архив.
8. Открываем програму Zip signer, находим наш архив, называем его как хотим (только без русских символов и пробелов, напр. Playerpro-system-by-me), внизу жмем signed test key.
9. Находим подписанный архив, который готов для установки через CWM или любое другое кастомное recovery.
Небольшой пример команд для updater-script:
Копирует содержимое в . Файлы в имеющиеся в перезаписываются.
Пример: copy_dir PACKAGE:system SYSTEM: Скопирует файлы из папки update.zip/system в /system
Форматирует раздел (см. приложение)
Пример: format SYSTEM: Полностью отформатирует /system. Примечание: форматирование удаляет данные необратимо.
Пример: delete SYSTEM:app/Calculator.apk Удалит Calculator.apk из папки system/app.
Рекурсивно удаляет файлы и папки со всем содержимым
Пример: delete_recursive DATA:dalvik-cache Удалит папку /data/dalvik-cache со всем содержимым
Пример: run_program PACKAGE:install_busybox.sh Запустит скрипт update.zip/install_busybox.sh .
Устанавливает владельца, группу и разрешения для файла или папки, как ‘chmod’, ‘chown’, и ‘chgrp’ всё в одном
Пример: set_perm 0 2000 0550 SYSTEM:etc/init.goldfish.sh Установит владельца, группу и разрешения для файла /system/etc/init.goldfish.sh
Рекурсивно устанавливает владельца, группу и разрешения для содержимого папки. — для папок, — для файлов.
Пример: set_perm_recursive 0 0 0755 0644 SYSTEM:app Установит права для содержимого /system/app, для папок — 0755, для файлов — 0644.
Показывает прогрессбар в положении секунд (или быстрее, если фактическая скорость выполнения может быть определена).
Пример: show_progress 0.1 0
Создает символическую ссылку (как ‘ln-s’). пишется в формате root:path, а в формате целевой файловой системы (и может быть относительным)
Пример: symlink /data/app_s SYSTEM:app Создаст символическую ссылку на папку /data/app_s для папки /system/app
UPD: если вы собрали пакет, и прошили через рекавери, то варианта два- либо при его установке рекавери напишет ошибку и ничего не произойдет, не удалится. не заменится (такое происходит при неправельной структуре пакета, каких-либо ошибках в названиях файлов/папок, неправельных (не правельный порядок либо ошибки) команд в updater-script или неподходящем update-binary. Как правило рекавери пишет код ошибки от 1 до 9. Либо все станет как вы прописали. То есть, половину команд из updater-scrip не может быть выполнена- или все, или ничего и ошибка.
Надеюсь, кому-то данная статья пригодилась. Естественно, это не значит что вы сразу броситесь, и правильно создатите рабочий пакет, но это очень поможет вам в ваших начинаниях.
ПЕРЕД УСТАНОВКОЙ ЛЮБОГО ПАКЕТА НЕ ЗАБЫВАЕМ ДЕЛАТЬ БЭКАП СИСТЕМЫ. ЗА ВСЕ ДЕЙСТВИЯ ПО УДАЛЕНИЮ И ИЗМЕНЕНИЮ СИСТЕМНЫХ ФАЙЛОВ НИ Я, НИ АДМИНИСТРАЦИЯ САЙТА ОТВЕТСТВЕННОСТИ НЕ НЕСЕТ.
Необходимо создать updater-script для вашей кастомной прошивки или мода? Не знаете какие команды писать и что они означают? На все эти ответы можно узнать из данной статьи.
Пример updater-script
(данный пример update-script для модели i9100 прошивка CyanogenMod 10.2)
для каких моделей:
[spoiler title=’assert’ style=’default’ collapse_link=’true’]
assert(getprop(«ro.product.device») == «galaxys2» || getprop(«ro.build.product») == «galaxys2» ||
getprop(«ro.product.device») == «i9100» || getprop(«ro.build.product») == «i9100» ||
getprop(«ro.product.device») == «GT-I9100» || getprop(«ro.build.product») == «GT-I9100» ||
getprop(«ro.product.device») == «GT-I9100M» || getprop(«ro.build.product») == «GT-I9100M» ||
getprop(«ro.product.device») == «GT-I9100P» || getprop(«ro.build.product») == «GT-I9100P» ||
getprop(«ro.product.device») == «GT-I9100T» || getprop(«ro.build.product») == «GT-I9100T»);
монтирование раздела
[spoiler title=’mount’ style=’default’ collapse_link=’true’]
mount(«ext4», «EMMC», «/dev/block/mmcblk0p9», «/system»);
копирование файла
[spoiler title=’package_extract_file’ style=’default’ collapse_link=’true’]
package_extract_file(«system/bin/backuptool.sh», «/tmp/backuptool.sh»);
package_extract_file(«system/bin/backuptool.functions», «/tmp/backuptool.functions»);
задание прав для файла
[spoiler title=’set_perm’ style=’default’ collapse_link=’true’]
set_perm(0, 0, 0777, «/tmp/backuptool.sh»);
set_perm(0, 0, 0644, «/tmp/backuptool.functions»);
запуск программы
[spoiler title=’run_program’ style=’default’ collapse_link=’true’]
run_program(«/tmp/backuptool.sh», «backup»);
отсоединить раздел
[spoiler title=’unmount’ collapse_link=’true’]
unmount(«/system»);
прогрессбар
[spoiler title=’show_progress’ collapse_link=’true’]
show_progress(0.500000, 0);
форматирование заданного раздела
[spoiler title=’format’ collapse_link=’true’]
format(«ext4», «EMMC», «/dev/block/mmcblk0p9», «0», «/system»);
подсоединение раздела
[spoiler title=’mount’ collapse_link=’true’]
mount(«ext4», «EMMC», «/dev/block/mmcblk0p9», «/system»);
копирование папки в выбранный раздел
[spoiler title=package_extract_dir’ collapse_link=’true’]
package_extract_dir(«recovery», «/system»);
package_extract_dir(«system», «/system»);
создание симилнка
[spoiler title=’symlink’ collapse_link=’true’]
symlink(«/system/xbin/su», «/system/bin/su»);
symlink(«Roboto-Bold.ttf», «/system/fonts/DroidSans-Bold.ttf»);
symlink(«Roboto-Regular.ttf», «/system/fonts/DroidSans.ttf»);
symlink(«busybox», «/system/xbin/[«, «/system/xbin/[[«,
«/system/xbin/adjtimex», «/system/xbin/arp», «/system/xbin/ash»,
«/system/xbin/awk», «/system/xbin/base64», «/system/xbin/basename»,
«/system/xbin/bbconfig», «/system/xbin/blkid», «/system/xbin/blockdev»,
«/system/xbin/brctl», «/system/xbin/bunzip2», «/system/xbin/bzcat»,
«/system/xbin/bzip2», «/system/xbin/cal», «/system/xbin/cat»,
«/system/xbin/catv», «/system/xbin/chattr», «/system/xbin/chgrp»,
«/system/xbin/chmod», «/system/xbin/chown», «/system/xbin/chroot»,
«/system/xbin/clear», «/system/xbin/cmp», «/system/xbin/comm»,
«/system/xbin/cp», «/system/xbin/cpio», «/system/xbin/crond»,
«/system/xbin/crontab», «/system/xbin/cut», «/system/xbin/date»,
«/system/xbin/dc», «/system/xbin/dd», «/system/xbin/depmod»,
«/system/xbin/devmem», «/system/xbin/df», «/system/xbin/diff»,
«/system/xbin/dirname», «/system/xbin/dmesg», «/system/xbin/dnsd»,
«/system/xbin/dos2unix», «/system/xbin/du», «/system/xbin/echo»,
«/system/xbin/ed», «/system/xbin/egrep», «/system/xbin/env»,
«/system/xbin/expand», «/system/xbin/expr», «/system/xbin/false»,
«/system/xbin/fbsplash», «/system/xbin/fdisk», «/system/xbin/fgrep»,
«/system/xbin/find», «/system/xbin/flash_lock»,
«/system/xbin/flash_unlock», «/system/xbin/flashcp»,
«/system/xbin/flock», «/system/xbin/fold», «/system/xbin/free»,
«/system/xbin/freeramdisk», «/system/xbin/fstrim», «/system/xbin/fsync»,
«/system/xbin/ftpget», «/system/xbin/ftpput», «/system/xbin/fuser»,
«/system/xbin/getopt», «/system/xbin/grep», «/system/xbin/groups»,
«/system/xbin/gunzip», «/system/xbin/gzip», «/system/xbin/halt»,
«/system/xbin/head», «/system/xbin/hexdump», «/system/xbin/id»,
«/system/xbin/ifconfig», «/system/xbin/inetd», «/system/xbin/insmod»,
«/system/xbin/install», «/system/xbin/ionice», «/system/xbin/iostat»,
«/system/xbin/ip», «/system/xbin/kill», «/system/xbin/killall»,
«/system/xbin/killall5», «/system/xbin/less», «/system/xbin/ln»,
«/system/xbin/losetup», «/system/xbin/ls», «/system/xbin/lsattr»,
«/system/xbin/lsmod», «/system/xbin/lsusb», «/system/xbin/lzcat»,
«/system/xbin/lzma», «/system/xbin/lzop», «/system/xbin/lzopcat»,
«/system/xbin/man», «/system/xbin/md5sum», «/system/xbin/mesg»,
«/system/xbin/mkdir», «/system/xbin/mke2fs», «/system/xbin/mkfifo»,
«/system/xbin/mkfs.ext2», «/system/xbin/mkfs.vfat»,
«/system/xbin/mknod», «/system/xbin/mkswap», «/system/xbin/mktemp»,
«/system/xbin/modinfo», «/system/xbin/modprobe», «/system/xbin/more»,
«/system/xbin/mount», «/system/xbin/mountpoint», «/system/xbin/mpstat»,
«/system/xbin/mv», «/system/xbin/nanddump», «/system/xbin/nandwrite»,
«/system/xbin/nbd-client», «/system/xbin/netstat», «/system/xbin/nice»,
«/system/xbin/nohup», «/system/xbin/nslookup», «/system/xbin/ntpd»,
«/system/xbin/od», «/system/xbin/patch», «/system/xbin/pgrep»,
«/system/xbin/pidof», «/system/xbin/ping», «/system/xbin/pipe_progress»,
«/system/xbin/pkill», «/system/xbin/pmap», «/system/xbin/poweroff»,
«/system/xbin/printenv», «/system/xbin/printf», «/system/xbin/ps»,
«/system/xbin/pstree», «/system/xbin/pwd», «/system/xbin/pwdx»,
«/system/xbin/rdev», «/system/xbin/readlink», «/system/xbin/realpath»,
«/system/xbin/renice», «/system/xbin/reset», «/system/xbin/resize»,
«/system/xbin/rev», «/system/xbin/rm», «/system/xbin/rmdir»,
«/system/xbin/rmmod», «/system/xbin/route», «/system/xbin/run-parts»,
«/system/xbin/rx», «/system/xbin/sed», «/system/xbin/seq»,
«/system/xbin/setconsole», «/system/xbin/setserial»,
«/system/xbin/setsid», «/system/xbin/sh», «/system/xbin/sha1sum»,
«/system/xbin/sha256sum», «/system/xbin/sha3sum»,
«/system/xbin/sha512sum», «/system/xbin/sleep», «/system/xbin/sort»,
«/system/xbin/split», «/system/xbin/stat», «/system/xbin/strings»,
«/system/xbin/stty», «/system/xbin/sum», «/system/xbin/swapoff»,
«/system/xbin/swapon», «/system/xbin/sync», «/system/xbin/sysctl»,
«/system/xbin/tac», «/system/xbin/tail», «/system/xbin/tar»,
«/system/xbin/taskset», «/system/xbin/tee», «/system/xbin/telnet»,
«/system/xbin/telnetd», «/system/xbin/test», «/system/xbin/tftp»,
«/system/xbin/tftpd», «/system/xbin/time», «/system/xbin/timeout»,
«/system/xbin/top», «/system/xbin/touch», «/system/xbin/tr»,
«/system/xbin/traceroute», «/system/xbin/true», «/system/xbin/ttysize»,
«/system/xbin/tune2fs», «/system/xbin/umount», «/system/xbin/uname»,
«/system/xbin/uncompress», «/system/xbin/unexpand», «/system/xbin/uniq»,
«/system/xbin/unix2dos», «/system/xbin/unlzma», «/system/xbin/unlzop»,
«/system/xbin/unxz», «/system/xbin/unzip», «/system/xbin/uptime»,
«/system/xbin/usleep», «/system/xbin/uudecode», «/system/xbin/uuencode»,
«/system/xbin/vi», «/system/xbin/watch», «/system/xbin/wc»,
«/system/xbin/wget», «/system/xbin/which», «/system/xbin/whoami»,
«/system/xbin/xargs», «/system/xbin/xz», «/system/xbin/xzcat»,
«/system/xbin/yes»,
«/system/xbin/zcat»);
symlink(«libGLESv2.so», «/system/lib/libGLESv3.so»);
symlink(«logcat», «/system/bin/lolcat»);
symlink(«mksh», «/system/bin/sh»);
symlink(«mount.exfat», «/system/bin/fsck.exfat»,
«/system/bin/mkfs.exfat»);
symlink(«pigz», «/system/xbin/unpigz»);
symlink(«toolbox», «/system/bin/cat», «/system/bin/chcon»,
«/system/bin/chmod», «/system/bin/chown», «/system/bin/clear»,
«/system/bin/cmp», «/system/bin/cp», «/system/bin/date»,
«/system/bin/dd», «/system/bin/df», «/system/bin/dmesg»,
«/system/bin/du», «/system/bin/getenforce», «/system/bin/getevent»,
«/system/bin/getprop», «/system/bin/getsebool», «/system/bin/grep»,
«/system/bin/hd», «/system/bin/id», «/system/bin/ifconfig»,
«/system/bin/iftop», «/system/bin/insmod», «/system/bin/ioctl»,
«/system/bin/ionice», «/system/bin/kill», «/system/bin/ln»,
«/system/bin/load_policy», «/system/bin/log», «/system/bin/ls»,
«/system/bin/lsmod», «/system/bin/lsof», «/system/bin/md5»,
«/system/bin/mkdir», «/system/bin/mount», «/system/bin/mv»,
«/system/bin/nandread», «/system/bin/netstat»,
«/system/bin/newfs_msdos», «/system/bin/notify», «/system/bin/printenv»,
«/system/bin/ps», «/system/bin/r», «/system/bin/reboot»,
«/system/bin/renice», «/system/bin/restart», «/system/bin/restorecon»,
«/system/bin/rm», «/system/bin/rmdir», «/system/bin/rmmod»,
«/system/bin/route», «/system/bin/runcon», «/system/bin/schedtop»,
«/system/bin/sendevent», «/system/bin/setconsole»,
«/system/bin/setenforce», «/system/bin/setprop»,
«/system/bin/setsebool», «/system/bin/sleep», «/system/bin/smd»,
«/system/bin/start», «/system/bin/stop», «/system/bin/sync»,
«/system/bin/top», «/system/bin/touch», «/system/bin/umount»,
«/system/bin/uptime», «/system/bin/vmstat», «/system/bin/watchprops»,
«/system/bin/wipe»);
рекурсивное выставление прав папкам
[spoiler title=’set_perm_recursive’ collapse_link=’true’]
set_perm_recursive(0, 0, 0755, 0644, «/system»);
set_perm_recursive(0, 0, 0755, 0755, «/system/addon.d»);
set_perm_recursive(0, 2000, 0755, 0755, «/system/bin»);
рекурсивное выставление прав файлам
[spoiler title=’set_perm’ collapse_link=’true’]
set_perm(0, 3003, 02750, «/system/bin/netcfg»);
set_perm(0, 0, 0755, «/system/bin/ping»);
set_perm(0, 2000, 0750, «/system/bin/run-as»);
set_perm(1014, 2000, 0550, «/system/etc/dhcpcd/dhcpcd-run-hooks»);
set_perm_recursive(0, 2000, 0755, 0755, «/system/etc/init.d»);
set_perm(0, 0, 0755, «/system/etc/init.d»);
set_perm(0, 2000, 0550, «/system/etc/init.goldfish.sh»);
set_perm_recursive(0, 0, 0755, 0555, «/system/etc/ppp»);
set_perm(0, 2000, 0755, «/system/vendor»);
set_perm_recursive(0, 2000, 0755, 0644, «/system/vendor/etc»);
set_perm(0, 0, 0644, «/system/vendor/etc/audio_effects.conf»);
set_perm(0, 2000, 0755, «/system/vendor/firmware»);
set_perm(0, 2000, 0755, «/system/vendor/lib»);
set_perm_recursive(0, 2000, 0755, 0644, «/system/vendor/lib/drm»);
set_perm(0, 0, 0644, «/system/vendor/lib/drm/libdrmwvmplugin.so»);
set_perm_recursive(0, 2000, 0755, 0755, «/system/xbin»);
set_perm(0, 0, 06755, «/system/xbin/librank»);
set_perm(0, 0, 06755, «/system/xbin/procmem»);
set_perm(0, 0, 06755, «/system/xbin/procrank»);
set_perm(0, 0, 06755, «/system/xbin/su»);
прогреccбар
[spoiler title=’show_progress’ collapse_link=’true’]
show_progress(0.200000, 0);
show_progress(0.200000, 10);
копирование файла
[spoiler title=’package_extract_file’ collapse_link=’true’]
package_extract_file(«system/bin/backuptool.sh», «/tmp/backuptool.sh»);
package_extract_file(«system/bin/backuptool.functions», «/tmp/backuptool.functions»);
задание прав для файла
[spoiler title=’set_perm’ collapse_link=’true’]
set_perm(0, 0, 0777, «/tmp/backuptool.sh»);
set_perm(0, 0, 0644, «/tmp/backuptool.functions»);
запуск программы
[spoiler title=’run_program’ collapse_link=’true’]
run_program(«/tmp/backuptool.sh», «restore»);
удаление файла
[spoiler title=’delete’ collapse_link=’true’]
delete(«/system/bin/backuptool.sh»);
delete(«/system/bin/backuptool.functions»);
прогрессбар
[spoiler title=’show_progress’ collapse_link=’true’]
show_progress(0.200000, 10);
установка ядра
[spoiler title=’write_raw_image’ collapse_link=’true’]
assert(package_extract_file(«boot.img», «/tmp/boot.img»),
write_raw_image(«/tmp/boot.img», «/dev/block/mmcblk0p5»),
delete(«/tmp/boot.img»));
прогрессбар
[spoiler title=’show_progress’ collapse_link=’true’]
show_progress(0.100000, 0);
отсоединение раздела
[spoiler title=’unmount’ collapse_link=’true’]
unmount(«/system»);
Как должен выглядеть ZIP -обновление (структура)
В корне архива-обновления «должны» находится такие файлы и папки:
1. Папка META-INF — обязательно
2. system или data или cache или другие, в зависимости от того для чего готовилось обновление (не обязательно, так как возможно прошиваете модем или ядро)
3. boot.img или recovery.img или zImage (не обязательно, так как возможно обновляете файл в system или data)
Режим сжатия архива должен быть «нормальный» или «обычный» более сильное сжатие Android не поддерживает
Папка META-INF состоит
2. Файлы подписи обновления
Папка com должна содержать в себе такие файлы и папки
1. Папку android
2. Google
Папка google должна содержать папку android в которой должны быть файлы
1. updater-script — текстовый файл с набором инструкций для обновления
2. update-binary — бинарный файл, необходимый для установки обновления
Внимание! Программа Updater Script
Вашему вниманию предлагается проект - Updater Script который позволит правильно и очень быстро составить правильный скрипт, даже для пользователей с маленьким опытом!
Как узнать как задать правильные symlink в updater-script
Довольно популярный вопрос о том как узнать какие необходимо создать symlink в updater-script? Все очень просто для этого вам нужно либо компьютер с ADB или установленный терминал на Android. Перейдите в папки:
В каждой из этих папок наберите команду ls -l и вы получите список файлов и symlink.
Команды updater-script
Инструменты редактирования update-script
Для редактирования updater-script вам понадобится программа NotePad ++
важное условие при работе это кодировка, она должна быть UNIX
Узнать список всех папок в System
Для того того чтобы узнать все папки которые есть в разделе /system , понадобиться набрать команду
su
du -a system
После чего вам выдаст весь список папок в разделе.
Узнать все права, uid, gid и список файлов и папок
Для того чтобы узнать все права, uid, gid и список файлов и папок нужно задать следующую команду
ls -alnR /system
Теперь перейдем как это выглядит в живую на примере…
Как должен выглядеть ZIP -обновление (структура)
В корне архива-обновления «должны» находится такие файлы и папки:
- Папка META-INF — обязательно;
- system или data или cache или другие, в зависимости от того, для чего готовилось обновление (не обязательно, так как возможно прошиваете модем или ядро);
- boot.img или recovery.img или zImage (не обязательно, так как возможно обновляете файл в system или data).
Режим сжатия архива должен быть «нормальный» или «обычный» более сильное сжатие Android не поддерживает.
Папка META-INF состоит:
Папка com должна содержать в себе такие файлы и папки:
Папка google должна содержать папку android в которой должны быть файлы
1. updater-script — текстовый файл с набором инструкций для обновления;
2. update-binary — бинарный файл, необходимый для установки обновления.
Пример updater-script
(данный пример update-script для модели i9100 прошивка CyanogenMod 10.2)
для каких моделей
assert(getprop(«ro.product.device») == «galaxys2? || getprop(«ro.build.product») == «galaxys2? ||
getprop(«ro.product.device») == «i9100? || getprop(«ro.build.product») == «i9100? ||
getprop(«ro.product.device») == «GT-I9100? || getprop(«ro.build.product») == «GT-I9100? ||
getprop(«ro.product.device») == «GT-I9100M» || getprop(«ro.build.product») == «GT-I9100M» ||
getprop(«ro.product.device») == «GT-I9100P» || getprop(«ro.build.product») == «GT-I9100P» ||
getprop(«ro.product.device») == «GT-I9100T» || getprop(«ro.build.product») == «GT-I9100T»);
монтирование раздела
mount(«ext4?, «EMMC», «/dev/block/mmcblk0p9?, «/system»);
копирование файла
package_extract_file(«system/bin/backuptool.sh», «/tmp/backuptool.sh»);
package_extract_file(«system/bin/backuptool.functions», «/tmp/backuptool.functions»);
задание прав для файла
set_perm(0, 0, 0777, «/tmp/backuptool.sh»);
set_perm(0, 0, 0644, «/tmp/backuptool.functions»);
запуск программы
run_program(«/tmp/backuptool.sh», «backup»);
отсоединить раздел
unmount(«/system»);
прогрессбар
show_progress(0.500000, 0);
форматирование заданного раздела
format(«ext4?, «EMMC», «/dev/block/mmcblk0p9?, «0», «/system»);
подсоединение раздела
mount(«ext4?, «EMMC», «/dev/block/mmcblk0p9?, «/system»);
копирование папки в выбранный раздел
package_extract_dir(«recovery», «/system»);
package_extract_dir(«system», «/system»);
создание симилнка
symlink(«/system/xbin/su», «/system/bin/su»);
symlink(«Roboto-Bold.ttf», «/system/fonts/DroidSans-Bold.ttf»);
symlink(«Roboto-Regular.ttf», «/system/fonts/DroidSans.ttf»);
symlink(«busybox», «/system/xbin/[«, «/system/xbin/[[«,
«/system/xbin/adjtimex», «/system/xbin/arp», «/system/xbin/ash»,
«/system/xbin/awk», «/system/xbin/base64?, «/system/xbin/basename»,
«/system/xbin/bbconfig», «/system/xbin/blkid», «/system/xbin/blockdev»,
«/system/xbin/brctl», «/system/xbin/bunzip2?, «/system/xbin/bzcat»,
«/system/xbin/bzip2?, «/system/xbin/cal», «/system/xbin/cat»,
«/system/xbin/catv», «/system/xbin/chattr», «/system/xbin/chgrp»,
«/system/xbin/chmod», «/system/xbin/chown», «/system/xbin/chroot»,
«/system/xbin/clear», «/system/xbin/cmp», «/system/xbin/comm»,
«/system/xbin/cp», «/system/xbin/cpio», «/system/xbin/crond»,
«/system/xbin/crontab», «/system/xbin/cut», «/system/xbin/date»,
«/system/xbin/dc», «/system/xbin/dd», «/system/xbin/depmod»,
«/system/xbin/devmem», «/system/xbin/df», «/system/xbin/diff»,
«/system/xbin/dirname», «/system/xbin/dmesg», «/system/xbin/dnsd»,
«/system/xbin/dos2unix», «/system/xbin/du», «/system/xbin/echo»,
«/system/xbin/ed», «/system/xbin/egrep», «/system/xbin/env»,
«/system/xbin/expand», «/system/xbin/expr», «/system/xbin/false»,
«/system/xbin/fbsplash», «/system/xbin/fdisk», «/system/xbin/fgrep»,
«/system/xbin/find», «/system/xbin/flash_lock»,
«/system/xbin/flash_unlock», «/system/xbin/flashcp»,
«/system/xbin/flock», «/system/xbin/fold», «/system/xbin/free»,
«/system/xbin/freeramdisk», «/system/xbin/fstrim», «/system/xbin/fsync»,
«/system/xbin/ftpget», «/system/xbin/ftpput», «/system/xbin/fuser»,
«/system/xbin/getopt», «/system/xbin/grep», «/system/xbin/groups»,
«/system/xbin/gunzip», «/system/xbin/gzip», «/system/xbin/halt»,
«/system/xbin/head», «/system/xbin/hexdump», «/system/xbin/id»,
«/system/xbin/ifconfig», «/system/xbin/inetd», «/system/xbin/insmod»,
«/system/xbin/install», «/system/xbin/ionice», «/system/xbin/iostat»,
«/system/xbin/ip», «/system/xbin/kill», «/system/xbin/killall»,
«/system/xbin/killall5?, «/system/xbin/less», «/system/xbin/ln»,
«/system/xbin/losetup», «/system/xbin/ls», «/system/xbin/lsattr»,
«/system/xbin/lsmod», «/system/xbin/lsusb», «/system/xbin/lzcat»,
«/system/xbin/lzma», «/system/xbin/lzop», «/system/xbin/lzopcat»,
«/system/xbin/man», «/system/xbin/md5sum», «/system/xbin/mesg»,
«/system/xbin/mkdir», «/system/xbin/mke2fs», «/system/xbin/mkfifo»,
«/system/xbin/mkfs.ext2?, «/system/xbin/mkfs.vfat»,
«/system/xbin/mknod», «/system/xbin/mkswap», «/system/xbin/mktemp»,
«/system/xbin/modinfo», «/system/xbin/modprobe», «/system/xbin/more»,
«/system/xbin/mount», «/system/xbin/mountpoint», «/system/xbin/mpstat»,
«/system/xbin/mv», «/system/xbin/nanddump», «/system/xbin/nandwrite»,
«/system/xbin/nbd-client», «/system/xbin/netstat», «/system/xbin/nice»,
«/system/xbin/nohup», «/system/xbin/nslookup», «/system/xbin/ntpd»,
«/system/xbin/od», «/system/xbin/patch», «/system/xbin/pgrep»,
«/system/xbin/pidof», «/system/xbin/ping», «/system/xbin/pipe_progress»,
«/system/xbin/pkill», «/system/xbin/pmap», «/system/xbin/poweroff»,
«/system/xbin/printenv», «/system/xbin/printf», «/system/xbin/ps»,
«/system/xbin/pstree», «/system/xbin/pwd», «/system/xbin/pwdx»,
«/system/xbin/rdev», «/system/xbin/readlink», «/system/xbin/realpath»,
«/system/xbin/renice», «/system/xbin/reset», «/system/xbin/resize»,
«/system/xbin/rev», «/system/xbin/rm», «/system/xbin/rmdir»,
«/system/xbin/rmmod», «/system/xbin/route», «/system/xbin/run-parts»,
«/system/xbin/rx», «/system/xbin/sed», «/system/xbin/seq»,
«/system/xbin/setconsole», «/system/xbin/setserial»,
«/system/xbin/setsid», «/system/xbin/sh», «/system/xbin/sha1sum»,
«/system/xbin/sha256sum», «/system/xbin/sha3sum»,
«/system/xbin/sha512sum», «/system/xbin/sleep», «/system/xbin/sort»,
«/system/xbin/split», «/system/xbin/stat», «/system/xbin/strings»,
«/system/xbin/stty», «/system/xbin/sum», «/system/xbin/swapoff»,
«/system/xbin/swapon», «/system/xbin/sync», «/system/xbin/sysctl»,
«/system/xbin/tac», «/system/xbin/tail», «/system/xbin/tar»,
«/system/xbin/taskset», «/system/xbin/tee», «/system/xbin/telnet»,
«/system/xbin/telnetd», «/system/xbin/test», «/system/xbin/tftp»,
«/system/xbin/tftpd», «/system/xbin/time», «/system/xbin/timeout»,
«/system/xbin/top», «/system/xbin/touch», «/system/xbin/tr»,
«/system/xbin/traceroute», «/system/xbin/true», «/system/xbin/ttysize»,
«/system/xbin/tune2fs», «/system/xbin/umount», «/system/xbin/uname»,
«/system/xbin/uncompress», «/system/xbin/unexpand», «/system/xbin/uniq»,
«/system/xbin/unix2dos», «/system/xbin/unlzma», «/system/xbin/unlzop»,
«/system/xbin/unxz», «/system/xbin/unzip», «/system/xbin/uptime»,
«/system/xbin/usleep», «/system/xbin/uudecode», «/system/xbin/uuencode»,
«/system/xbin/vi», «/system/xbin/watch», «/system/xbin/wc»,
«/system/xbin/wget», «/system/xbin/which», «/system/xbin/whoami»,
«/system/xbin/xargs», «/system/xbin/xz», «/system/xbin/xzcat»,
«/system/xbin/yes»,
«/system/xbin/zcat»);
symlink(«libGLESv2.so», «/system/lib/libGLESv3.so»);
symlink(«logcat», «/system/bin/lolcat»);
symlink(«mksh», «/system/bin/sh»);
symlink(«mount.exfat», «/system/bin/fsck.exfat»,
«/system/bin/mkfs.exfat»);
symlink(«pigz», «/system/xbin/unpigz»);
symlink(«toolbox», «/system/bin/cat», «/system/bin/chcon»,
«/system/bin/chmod», «/system/bin/chown», «/system/bin/clear»,
«/system/bin/cmp», «/system/bin/cp», «/system/bin/date»,
«/system/bin/dd», «/system/bin/df», «/system/bin/dmesg»,
«/system/bin/du», «/system/bin/getenforce», «/system/bin/getevent»,
«/system/bin/getprop», «/system/bin/getsebool», «/system/bin/grep»,
«/system/bin/hd», «/system/bin/id», «/system/bin/ifconfig»,
«/system/bin/iftop», «/system/bin/insmod», «/system/bin/ioctl»,
«/system/bin/ionice», «/system/bin/kill», «/system/bin/ln»,
«/system/bin/load_policy», «/system/bin/log», «/system/bin/ls»,
«/system/bin/lsmod», «/system/bin/lsof», «/system/bin/md5?,
«/system/bin/mkdir», «/system/bin/mount», «/system/bin/mv»,
«/system/bin/nandread», «/system/bin/netstat»,
«/system/bin/newfs_msdos», «/system/bin/notify», «/system/bin/printenv»,
«/system/bin/ps», «/system/bin/r», «/system/bin/reboot»,
«/system/bin/renice», «/system/bin/restart», «/system/bin/restorecon»,
«/system/bin/rm», «/system/bin/rmdir», «/system/bin/rmmod»,
«/system/bin/route», «/system/bin/runcon», «/system/bin/schedtop»,
«/system/bin/sendevent», «/system/bin/setconsole»,
«/system/bin/setenforce», «/system/bin/setprop»,
«/system/bin/setsebool», «/system/bin/sleep», «/system/bin/smd»,
«/system/bin/start», «/system/bin/stop», «/system/bin/sync»,
«/system/bin/top», «/system/bin/touch», «/system/bin/umount»,
«/system/bin/uptime», «/system/bin/vmstat», «/system/bin/watchprops»,
«/system/bin/wipe»);
рекурсивное выставление прав папкам
set_perm_recursive(0, 0, 0755, 0644, «/system»);
set_perm_recursive(0, 0, 0755, 0755, «/system/addon.d»);
set_perm_recursive(0, 2000, 0755, 0755, «/system/bin»);
рекурсивное выставление прав файлам
set_perm(0, 3003, 02750, «/system/bin/netcfg»);
set_perm(0, 0, 0755, «/system/bin/ping»);
set_perm(0, 2000, 0750, «/system/bin/run-as»);
set_perm(1014, 2000, 0550, «/system/etc/dhcpcd/dhcpcd-run-hooks»);
set_perm_recursive(0, 2000, 0755, 0755, «/system/etc/init.d»);
set_perm(0, 0, 0755, «/system/etc/init.d»);
set_perm(0, 2000, 0550, «/system/etc/init.goldfish.sh»);
set_perm_recursive(0, 0, 0755, 0555, «/system/etc/ppp»);
set_perm(0, 2000, 0755, «/system/vendor»);
set_perm_recursive(0, 2000, 0755, 0644, «/system/vendor/etc»);
set_perm(0, 0, 0644, «/system/vendor/etc/audio_effects.conf»);
set_perm(0, 2000, 0755, «/system/vendor/firmware»);
set_perm(0, 2000, 0755, «/system/vendor/lib»);
set_perm_recursive(0, 2000, 0755, 0644, «/system/vendor/lib/drm»);
set_perm(0, 0, 0644, «/system/vendor/lib/drm/libdrmwvmplugin.so»);
set_perm_recursive(0, 2000, 0755, 0755, «/system/xbin»);
set_perm(0, 0, 06755, «/system/xbin/librank»);
set_perm(0, 0, 06755, «/system/xbin/procmem»);
set_perm(0, 0, 06755, «/system/xbin/procrank»);
set_perm(0, 0, 06755, «/system/xbin/su»);
прогреccбар
show_progress(0.200000, 0);
show_progress(0.200000, 10);
копирование файла
package_extract_file(«system/bin/backuptool.sh», «/tmp/backuptool.sh»);
package_extract_file(«system/bin/backuptool.functions», «/tmp/backuptool.functions»);
задание прав для файла
set_perm(0, 0, 0777, «/tmp/backuptool.sh»);
set_perm(0, 0, 0644, «/tmp/backuptool.functions»);
запуск программы
run_program(«/tmp/backuptool.sh», «restore»);
удаление файла
delete(«/system/bin/backuptool.sh»);
delete(«/system/bin/backuptool.functions»);
прогрессбар
show_progress(0.200000, 10);
установка ядра
assert(package_extract_file(«boot.img», «/tmp/boot.img»),
write_raw_image(«/tmp/boot.img», «/dev/block/mmcblk0p5?),
delete(«/tmp/boot.img»));
прогрессбар
show_progress(0.100000, 0);
отсоединение раздела
unmount(«/system»);
Внимание! Программа Android +1 Updater Script
Вашему внимание проект сайта Android +1 — Android +1 Updater Script позволит правильно и очень быстро составить правильный скрипт, даже для пользователей с маленьким опытом!
Бонус: Полезные команды в конце скрипта
Выполнить wipe Dalvik cache, для во избежания сбоев в системе (ставить до umount в конце):
delete_recursive(«/data/dalvik-cache»)
автоматическая перезагрузка (ставить после umount в конце)
run_program(«/sbin/reboot»);
Updater-script как правильно составить. Необходимо создать updater-script для вашей кастомной прошивки или мода? Не знаете какие команды писать и что они означают? На все эти ответы можно узнать из данной статьи.
Бонус
Также полезная команды после
Выполнить wipe Dalvik cache, для во избежания сбоев в системе (ставить до umount в конце)
delete_recursive(«/data/dalvik-cache»)
автоматическая перезагрузка (ставить после umount в конце)
run_program(«/sbin/reboot»);
09:36 10-09-2012 Arago
Новый способ создания update.zip для Android.
Когда я попробовал себя в написании хоть сколько нибудь сложного мода для Android - пришлось вплотную (а вернее с размаху носом) столкнуться с языком edify - на нём пишется updater-script в Android flashable пакетах. И столкновение это не прошло незамеченным для моей психики, вызвав ощущение собственной неполноценности, связанный с этим butthurt и лютобешеную ненависть к этому языку.
Соответственно я начал искать иные пути, чтобы использовать милый сердцу за свою мощь, красоту и простоту язык Unix Shell скриптов. И теперь хочу поделиться с Вами опытом.
Целью моих изысканий было найти возможность отображения состояния хода установки обновления на экране телефона, ведь без этого можно было и так использовать скрипт Shell, вызыывая его из edify скрипта. Собственно это и было успешно достигнуто.
Плюс несколько уменьшен размер Zip-обновления, оно занимает 91кБ, против 231 кБ у edify-версии.
Немного теории о том, как происходит установка Zip-архива из Recovery.
Recovery извлекает из архива с обновлением файл META-INF/com/google/android/update-binary в /tmp, делает ему chmod 777 и запускает передавая три параметра:
1. API level. Это число от 1 до 3 (в моём случае это было 2). Для нас полностью бесполезен.
2. Дескриптор Pipe для обратной связи с Recovery. С ним подробнее разберёмся позднее.
3. Полное имя Zip-обновления. Тут я полагаю всё ясно.
Немного поковырявшись в исходниках update-binary от edify и изучив состояние системы при установке и происходящие в ней процессы, был рождён следующий код
Узнать все права, uid, gid и список файлов и папок
Для того чтобы узнать все права, uid, gid и список файлов и папок нужно задать следующую команду linux:
ls -alnR /system
Теперь перейдем как это выглядит в живую на примере…
Команды updater-script
assert -задается для каких моделей создано обновление
mount — монтирование (присоединение) разделов
umount — отсоединить раздел
package_extract_dir — копирует выбраню папку и заменяет собой аналогичную вместе с файлами
package_extract_file — копирует выбранный файл и заменяет собой аналогичный
format — форматирует прописанный раздел
delete — удаляет файл
delete_recursive - рекурсивное удаление, необходимо для удаления папок и их содержимого
run_program — запускает программу
set_perm — задает права для файла
set_perm_recursive — задает права для папки
symlink — создает жесткую ссылку — «симлинк» (ярлык для запуска)
Инструменты редактирования update-script
Для редактирования updater-script вам понадобится программа NotePad ++
важное условие при работе это кодировка, она должна быть UNIX
Как узнать как задать правильные symlink в updater-script
Довольно популярный вопрос о том как узнать какие необходимо создать symlink в updater-script? Все очень просто для этого вам нужно либо компьютер с ADB или установленный терминал на Android. Перейдите в папки:
В каждой из этих папок наберите команду ls -l и вы получите список файлов и symlink.
Узнать список всех папок в System
Для того того чтобы узнать все папки которые есть в разделе /system , понадобиться набрать linux команду:
su
du -a system
После чего вам выдаст весь список папок в разделе.
Читайте также: