Язык сценариев для CWM,TWRP..

Phoenix

Разработчик
Сообщения
2,122
Реакции
1,640

Синтаксис​

  • Синтаксические ошибки приведут к неработоспособности этого скрипта (установщик просто пропустит его). В сравнении, если у Aroma Installer есть синтаксическая ошибка, телефон загрузится прямо мимо установщика в Android, как если бы это не произошло, но ОЧЕНЬ быстро покажет ошибку.
  • Файл скрипта должен использовать символы новой строки UNIX в качестве конечных символов строк.
  • Пробелы (пробел, табуляция, LF 0x0a, но не CR 0x0d) могут использоваться свободно. ЗА ИСКЛЮЧЕНИЕМ последней строки, которая не может быть пустой!
  • Комментарии начинаются с символа #.
  • Все команды завершаются точкой с запятой. Клаузы (в ifelse) могут содержать любое количество команд, каждая из которых завершается точкой с запятой.
  • Строки обычно заключаются в двойные кавычки.
  • Понимаются символы \n, \t, ", и \. Также понимаются шестнадцатеричные экранированные последовательности вроде \x4a.
  • Числа на самом деле просто строки и обычно не заключаются в кавычки.
  • Логические значения: “t” для true (истина) или “” для false (ложь).
  • Операторы сравнения: == (строки равны), != (строки не равны).
  • Логические операторы: || (логическое ИЛИ), && (логическое И), ! (логическое НЕ).
  • Оператор конкатенации: +. (Осторожно: 2+2==22).
  • Условные ключевые слова if, then, else и endif работают ожидаемым образом, если они не заключены в кавычки. Вместо них можно использовать макрос ifelse.

Функции​

Дисковые операции​

  • format(fs_type, partition_type, device, fs_size, mountpoint): Обычно используется “0” для fs_size (вся раздел).
  • mount(fs_type, partition_type, device, mountpoint): Монтирование раздела.
  • unmount(mountpoint): Отмонтирование раздела.
  • is_mounted(mountpoint): Проверка, примонтирован ли раздел.
  • wipe_cache(): Очистка кэша.

Операции с изображениями​

  • write_raw_image(filename, device)
  • write_firmware_image

Операции с файлами​

  • package_extract_file(source, destination): Возвращает “t” в случае успеха и “” в случае неудачи (например, если файл отсутствует в архиве).
  • package_extract_dir(source, destination): Распаковывает директорию.
  • delete(file): Удаляет файл.
  • delete_recursive(directory): Полностью удаляет директорию.
  • symlink(target, link0, …): Создает любое количество символических ссылок на цель.
  • set_perm(user, group, mode, file): Выполняет chown и chmod для файла.
  • set_perm_recursive(user, group, directory-mode, files-mode, directory): Выполняет chown и chmod для самой директории и всех её содержимого.
  • getprop(key): Возвращает строковое значение связанного ключа из системных свойств.
  • file_getprop(file, key): Возвращает строковое значение связанного ключа из конкретного файла.
  • sha1_check(file): Возвращает хэш SHA1 файла.
  • sha1_check(file, sha1_hex, [sha1_hex2, …]): Возвращает хэш, который соответствует указанному или “” (если ни один не совпадает).

Операции по исправлению​

  • apply_patch(srcfile, tgtfile, tgtsha1, tgtsize, sha1_1, patch_1, ...)
  • apply_patch_check(file, [sha1_1, ...])
  • apply_patch_space(bytes)
  • run_program(program, arg0, ...) - возвращает код завершения программы

Контроль​

  • assert(condition0, ...) – отмена вывод сообщения при любом ложном условии.
  • abort(message)
  • ifelse(condition, trueclause, falseclause) – conditional, falseclause is optional

Predicates​

  • is_substring(substring, string): Проверяет, содержит ли строка string подстроку substring.
  • less_than_int(x, y): Проверяет, является ли x меньше y, рассматривая их как целые числа.
  • greater_than_int(x, y): Проверяет, является ли x больше y, рассматривая их как целые числа.

Отзывы пользователей​

  • show_progress(fraction, seconds): Продвигает индикатор выполнения на долю в течение указанного количества секунд.
  • set_progress(fraction): Продвигает индикатор выполнения на указанную долю.
  • ui_print(message0, …): Выводит любое количество строк.
  • sleep(seconds): Приостанавливает выполнение на указанное количество секунд.

Немного теории о том, как происходит установка Zip-архива из Recovery.​


Recovery извлекает из архива с обновлением файл META-INF/com/google/android/update-binary в /tmp, делает ему chmod 777 и запускает передавая три параметра:
1. API level. Это число от 1 до 3.
2. Дескриптор Pipe для обратной связи с Recovery.
3. Полное имя Zip-обновления.

Для облегчения создания пакетов для установки можно использовать замечательное приложение ZIPME
Утилита для создания архивов для прошивки через рекавери
ZIPme 1.0 для Android
Это приложение автоматически создаёт пакет выбранных файлов, папок и данных с установкой нужных прав.

ui_print("текст выводимого сообщения");

show_progress(1.000000, 0); # параметры прогресс бара
ui_print("Mounting filesystems...");
run_program("/sbin/busybox", "mount", "/system"); # запуск программы монтирования через busybox
set_progress(0.100000);

ui_print("Extracting files...");
package_extract_dir("system", "/system"); # извлечение/копирование
set_progress(0.300000);

ui_print("Setting permissions...");
set_progress(0.400000); # установка положения прогресс бара
set_progress(0.500000);
set_perm(0, 0, 0644, "/system/etc/hosts"); # установка прав на файл
set_progress(0.700000);

# Unmounting filesystems...
run_program("/sbin/busybox", "umount", "/system"); # запуск программы отмонтирования через busybox
set_progress(0.900000);
set_progress(1.000000);
# тут можно комментировать
Screenshot_2016-12-07-09-06-56.png Screenshot_2016-12-07-09-07-05.png Screenshot_2016-12-07-09-07-19.png

Android update-script - 4PDA
Следует так же отметить, что бинарный файл может работать либо с определённым типом рекавери, либо быть универсальным.
Для поддержки SELinux используется синтаксис TWRP set_metadata, а не set_perm (для установки прав), соответственно бинарник для CWM его не распознает.
PHP:
set_metadata_recursive("/system", "uid", 0, "gid", 0, "dmode", 0755, "fmode", 0644, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
set_metadata_recursive("/system/bin", "uid", 0, "gid", 2000, "dmode", 0755, "fmode", 0755, "capabilities", 0x0, "selabel", "u:object_r:system_file:s0");
В качестве бинарника может быть шелл скрипт, а udater-script используется как dummy file
PHP:
# this is a dummy file, the magic is in update-binary, which is a shell script
 
Последнее редактирование модератором:
Назад
Сверху Снизу