Онлайн-обновление плагина¶
Черновик (2026-10-29). Как плагин обновляет сам себя через
check_update: манифест,update_info, когда идёт проверка, диалог,confirm_update, установка и что сохраняется. Три слоя источников, и их нельзя смешивать:
- SDK (
doc) — что обещает документация, без привязки к прошивке;- код APK DMC
260724_0207_r24(code, классandroid-atv; листингиlibduneshell.soиlibduneutil.soAPK). Для tv188b листингов по этой теме нет, поэтому код APK на tv188b не переносится;- наблюдения на одном устройстве tv188b с прошивкой
261021_0117_r25(device, тестовый плагинtest_plugin7,schema2, пакетtgz).Каждое фактическое предложение ссылается на claim id.
Коротко: вопрос → ответ¶
| Вопрос | Ответ | Где |
|---|---|---|
| Когда оболочка проверяет обновление? | SDK: при запуске любой точки входа (SDK)1; r25, device: и при запуске точки входа по IP Control (plugin_launcher) (устройство r25)2 |
§2 |
| Как часто? | r25, device: не раньше времени проверки + next_check_update_timeout из update_info, а не + check_update/timeout манифеста (устройство r25)3 |
§2.1 |
| Что видит пользователь? | r25, device: диалог «Обновление приложения», «Обновить» (в фокусе) / «Напомнить позже» (устройство r25)4 |
§3 |
| Можно ли обновлять без вопроса? | r25, device: при dont_ask_confirmations=yes у установленной версии диалога нет (устройство r25)5 |
§3 |
| Какие события получит плагин? | r25, device: confirm_update → going_to_update (старая версия) → update (новая); install не вызывается (устройство r25)6 |
§4 |
Сохранятся ли cookies и data_dir_path? |
r25, device: да (устройство r25)7 |
§5 |
1. Манифест и update_info¶
1.1. Блок check_update¶
SDK: в манифесте задаются version_index (растёт с каждой версией), version (подпись для UI) и check_update с
полями schema, url, timeout, required, auto (SDK)8. timeout — минимальный интервал между
проверками в секундах, 0 — проверять при каждом запуске (SDK)9. auto включает фоновую автопроверку
(по умолчанию выключена) (SDK)10. Схема 1 устарела, нужна schema = 2 (SDK)11.
Код APK r24:
check_update/schemaпо умолчанию 0, больше 3 — проверка отключена;check_update/timeoutпо умолчанию 86400 с, отрицательный заменяется на 86400 (код r24)12.check_update/urlчитается только дляschema1 и 2; безurlпроверка отключается (код r24)13.- При ошибке проверки и
required=yes(кромеschema3) запуск плагина запрещается (код r24)14. SDK: приcritical = yes,timeout = 0иrequired = yesстарую версию не дадут запустить, если на сервере есть обновление (SDK)15.
1.2. update_info.xml (schema 2)¶
SDK: корень <dune_plugin_update_info> с schema=2, name и элементами plugin_version_descriptor (version_index,
version, beta, critical, url, md5, size, caption) (SDK)16. Пакет — .tar.gz с тем же
содержимым, что установочный zip; md5 — сумма .tar.gz, size — место после установки (SDK)17.
Код APK r24 добавляет то, чего в SDK нет:
redirectв корне: без атрибутаifберётся сразу, сif— если условие истинно; на 5-м переходе — «too many redirects» и отказ (код r24)18.- В дескрипторе —
require(пары «единица версии → шаблон») иrequired_firmware_features; дескриптор подходит, только если все условия выполнены; из подходящих берётся наибольшийversion_index(код r24)19. next_check_update_timeout— дочерний элемент корня (schema2) или ключupdate.txt(schema1) (код r24)20. Что он делает — §2.1.
На r25 (device) лог автопроверки печатает итог по плагину schema 2: «N candidates», «N matches (0 newer)»,
«have_better_version = no» (устройство r25)21.
1.3. update.txt (schema 1)¶
Код APK r24 читает ключи next_check_update_timeout, version_index, last_critical_version_index, version,
download_url (только http/https), space_needed (> 0) и все confirm_dialog_line*
(код r24)22. Обновление доступно, только если version_index больше
установленного; критическое — если установленный version_index меньше last_critical_version_index
(код r24)23. На r25 (device) плагины с URL update.txt
(Screenshoter, widget_ext) проверяются как [schema1] (устройство r25)24.
Синтаксис update.txt в коде APK r24 — формат properties: его разбирает properties_build_from_buffer из
libduneutil.so (код r24)25. Правила разбора:
- строки разделены
'\n', последняя строка без'\n'тоже читается; строка проходитstr_seg_stripи пропускается, если пуста или начинается с#(код r24)25; - первый
=в строке отделяет ключ от значения, обе части проходятstr_seg_strip; строка без=и строка с пустым ключом пропускаются, пустое значение допустимо (код r24)25; str_seg_stripсрезает с краёв сегмента байты, для которых импортированныйisspaceвозвращает ненулевое значение; байты внутри сегмента не трогает (код r24)26.
Числовые ключи читает properties_get_int: найденную строку она передаёт прямо в импортированный atoi и возвращает
его результат, без своей проверки формата или ошибки преобразования
(код r24)27. Значение по умолчанию (третий аргумент) возвращается,
только если ключа нет или объекта properties нет (код r24)28; для
last_critical_version_index оно равно −1 (код r24)29. Какое число
atoi даст для значений вроде «1.0.0» или пустой строки и какие байты считает пробельными isspace, — см. «Не
проверено».
2. Когда идёт проверка¶
2.1. При запуске точки входа¶
- r25,
device: запуск точки входа черезlaunch_media_url plugin_launcher://{name=…}{ep_media_url=…}вызывает проверку;update_infoгрузится с тайм-аутом 1 («loading update info with timeout 1»), фоновая автопроверка — с тайм-аутом 5 (устройство r25)2. - r25,
device: запрос — GET с адреса 127.0.0.1, к URL дописано?dune_auth=…, заголовкиUser-Agent: DuneHD/1.0 (product_id: tv188b; firmware_version: 261021_0117_r25),X-Dune-Interface-Language,X-Dune-Serial-Number(устройство r25)30. - Срок следующей проверки хранится в
/tmp/plugin_updater_<name>.txt(unix-время) (устройство r25)31. Код APK r24: покаtime()меньше этого числа иcheck_update/timeout> 0, удалённая проверка пропускается («remote check skipped by timeout»); приtimeout≤ 0 она идёт каждый раз (код r24)32. После проверки в файл пишетсяtime() next_check_update_timeout, если тот ≥ 0, иначе +check_update/timeout(код r24)20.- r25,
device: сnext_check_update_timeout= 20 иcheck_update/timeout= 3600 в файл записано время проверки + 20 (устройство r25)3; до срока — «remote check skipped by timeout» и без запроса (устройство r25)33. - r25,
device: после установки обновления файл удаляется (устройство r25)34.
2.2. Фоновая автопроверка¶
Код APK r24:
- Берёт плагины со
schema1 или 2, у которыхcheck_update/auto = yesили имя есть в/config/auto_updating_plugins.txt(иначе/firmware/config/auto_updating_plugins.txt); перед каждой попыткой удаляет/tmp/plugin_updater_<name>.txt(код r24)35. - Стартует не чаще раза в 86400 с по монотонным часам; время прошлого старта — в
/tmp/plugin_online_upgrade_last_autocheck_time(код r24)36. - Не запускается при
/firmware/config/skip_plugin_auto_update.flagили/config/skip_plugin_auto_update.flag(код r24)37. - В диалог «Plugins Auto Update» попадают только плагины с
dont_ask_confirmations = no; если таких нет, обновление идёт без диалога; при отмене диалога обновляются только плагины сdont_ask_confirmations = yes(код r24)38.
r25, device: автопроверка идёт в отдельном процессе с логом /tmp/run/plugin_online_upgrade.log, по плагину —
«iteration 1/5», тайм-аут загрузки 5 (устройство r25)39; перед загрузкой
update_info каждого плагина она удаляет его /tmp/plugin_updater_<name>.txt
(устройство r25)40. На tv188b r24 (device) в /tmp лежали
plugin_online_upgrade_last_autocheck_time и plugin_updater_<name>.txt девяти плагинов
(устройство r24)41.
3. Диалог при запуске¶
- r25,
device: при новой некритической версии — «Обновление приложения», текст «Приложение:. Текущая версия: . Новая версия: . Обновить приложение?», кнопки «Обновить» (в фокусе) и «Напомнить позже» (устройство r25)4. - r25,
device: после «Напомнить позже» запускается исходная точка входа старой версии, а срок следующей проверки не сдвигается: через 38 с приnext_check_update_timeout= 20 диалог показан снова (устройство r25)42. - r25,
device:dont_ask_confirmations=yesу установленной версии убирает диалог — установка идёт сразу, на экране ничего (устройство r25)5. - Код APK r24: отказ от критического обновления или сбой его установки запрещают запуск; отказ от некритического ничего не удаляет, запуск продолжается (код r24)43.
4. События плагина¶
4.1. confirm_update¶
- Код APK r24: если версия новее и у плагина есть глобальное действие с кодом
0x59, оно вызывается со свойствамиcheck_update_plugin_name,check_update_url,check_update_version,check_update_prev_version,check_update_version_index,check_update_prev_version_index; результат 0 — обычное обновление, 1 — пропустить, 2 — «обновлено действием» (код r24)44. Код0x59—confirm_update(код r24)45. - r25,
device:confirm_updateустановленной версии вызывается до диалога с теми же шестью полями вuser_input(check_update_url— URL пакета); ответnull— «enabled by custom action» и обычное обновление (устройство r25)46. Приdont_ask_confirmations=yesоно тоже вызывается (устройство r25)5.
4.2. going_to_update, update, install¶
SDK перечисляет системные события global actions boot, install, update, uninstall (SDK)47.
- Код APK r24: перед заменой каталога старой версии шлётся
0x4d(going_to_update), по окончании установки —0x4b(update) при обновлении, иначе0x4a(install) (код r24)48.updateвызывается на объекте заново найденного плагина, то есть новой версии (код r24)49. - r25,
device:going_to_updateидёт вphp_serverстарой версии, затем этотphp_serverостанавливается (устройство r25)50; новая версия получаетupdateв новомphp_server, после чего запускается исходная точка входа;installпри обновлении не вызывается (устройство r25)51.
5. Установка и что сохраняется¶
r25, device, после «Обновить»: пакет tgz по url из update_info → tar -x -z -C /tmp/plugin_tmp → going_to_update
→ остановка php_server старой версии → удаление /flashdata/plugins/<name> и /tmp/plugins/<name> → копирование в
/flashdata/plugins/<name> → «reloading plugin» (устройство r25)50.
- Сообщений о ходе установки на экране нет, хотя в логе есть «push progress.plugin_installer» (устройство r25)52.
- Файлы из
tgz— владелецsystem,-rw-r--r--, как в архиве (устройство r25)53. - Cookies плагина и файлы в
data_dir_pathпережили два обновления (устройство r25)7.
Код APK r24 объясняет это так: при замене пакета удаляются только каталоги установки
(код r24)54, а plugins_data/<name> и
/config/<name>_plugin_cookies.properties удаляются лишь в другой ветке (флаг 0)
(код r24)55. Пакет скачивается как «%s-archive» (tgz или zip),
md5 сверяется (код r24)56.
5.1. Установка по ссылке plugin_installer://¶
- Код APK r24:
plugin_installer://<name>:::schema=updateтребует установленный плагин, удаляет его/tmp/plugin_updater_<name>.txtи запускает проверку при запуске без шага подтверждения (код r24)57. Встроенные PHP-плагины пользуются этим для уже установленных плагинов (код r24)58. - Код APK r24:
schema=tgz/zip— прямой пакет;schema2 разбираетupdate_info.xmlбез сверки имени сnameиз URL (код r24)59.
6. Отладка¶
Отладочный флаг /config/hd_debug/PLUGIN_UPDATE.txt упомянут в логе автопроверки r25
(устройство r25)60; файл $FS_PREFIX/config/hd_debug/PLUGIN_UPDATE.txt = 1
строки «using PLUGIN_UPDATE» при старте оболочки не дал
(устройство r25)61.
7. Расхождения¶
- Срок следующей проверки. В раннем логе r25 сроки части плагинов совпали с «время проверки +
check_update/timeout» (вывод, см. «Не проверено»), а при проверке на устройстве срок задалnext_check_update_timeout(устройство r25)3. Противоречия нет: по коду APK манифестныйtimeoutберётся, только еслиnext_check_update_timeoutвupdate_infoнет или он отрицателен (код r24)20; был ли он вupdate_infoтех плагинов, не установлено. Стороны связаныrelated. - SDK и
next_check_update_timeout. SDK описываетcheck_update/timeoutкак минимальный интервал между проверками (SDK)9, аnext_check_update_timeoutсреди полейupdate_infoне называет (SDK)16. На r25 интервал задал именноnext_check_update_timeoutизupdate_info(устройство r25)3. Связиconflicts_withнет.
8. Не проверено¶
| Утверждение | Статус | Claim |
|---|---|---|
В логе r25 от 2026-10-23 сроки Screenshoter и widget_ext = проверка + check_update/timeout (+20 и +0 с), у dune-hd.tv — + сутки; задавал ли их next_check_update_timeout, не установлено |
inference | (вывод r25)62 |
tv188b r24: ключи update.txt (schema 1) — version_index (сравнивается с установленным), version, download_url, space_needed, last_critical_version_index, next_check_update_timeout, confirm_dialog_line*; последние два в 41 известном образце не встречаются, то есть необязательны (для APK r24 ключи — код, §1.3) |
inference | (вывод r24)63 |
APK r24, при обычной семантике atoi: properties_get_int вернёт 1 для «1.0.0», 0 — для пустой строки и «abc» (не значение по умолчанию) |
inference | (код r24)64 |
APK r24, при обычной классификации isspace: str_seg_strip срезает пробел, TAB, LF, VT, FF и CR, поэтому update.txt с CRLF разбирается так же, как с LF |
inference | (код r24)65 |
require / required_firmware_features отсеивают дескрипторы по прошивке |
inference | (вывод r24)66 |
schema 3 служит плагинам-расширениям прошивки (firmware_ext) |
inference | (вывод r24)67 |
/tmp/plugin_online_upgrade_status.txt — список найденных обновлений, строка на плагин |
inference | (вывод r24)68 |
Код APK r24 из §1–§5 на tv188b не проверен: листингов .so tv188b по этой теме нет.
-
doc-sdk-plugins.c106 · doc · any-documented; прошивка — · Проверка обновления выполняется при запуске любой точки входа плагина; найденное обновление предлагается пользователю, после установки запускается исходная точка входа ↩
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c078 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 запуск точки входа плагина по IP Control (launch_media_url plugin_launcher://{name=…}{ep_media_url=…}) вызывает проверку обновления check_update schema 2: оболочка грузит update info из check_update/url с тайм-аутом 1 («loading update info with timeout 1»), тогда как фоновая автопроверка — с тайм-аутом 5. ↩↩
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c080 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после удалённой проверки обновления на запуске (schema 2) /tmp/plugin_updater_
.txt содержит время проверки + next_check_update_timeout из update_info.xml (20), а не + check_update/timeout манифеста (3600): проверка в 1793207761 записала 1793207781, проверка в 1793207784 — 1793207804. ↩↩↩↩ -
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c084 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при новой некритической версии проверка на запуске показывает диалог «Обновление приложения» с текстом «Приложение:
. Текущая версия: . Новая версия: . Обновить приложение?» и кнопками «Обновить» (в фокусе по умолчанию) и «Напомнить позже». ↩↩ -
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c091 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25, если у установленной версии в check_update задано dont_ask_confirmations=yes, проверка на запуске всё равно вызывает confirm_update, но диалог обновления не показывается: «installing application» идёт сразу за «enabled by custom action», на экране ни диалога, ни сообщений. ↩↩↩
-
- fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c086 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 перед диалогом обновления оболочка вызывает глобальное действие confirm_update установленной версии плагина и передаёт в user_input поля check_update_plugin_name, check_update_url (URL пакета), check_update_version, check_update_prev_version, check_update_version_index и check_update_prev_version_index; при ответе null — «confirm_update action finished with status 0» и «plugin_updater I: enabled by custom action», обновление идёт обычным путём.
- fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c087 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 установка обновления после «Обновить» идёт так: «loading tgz-archive» (пакет по url из update info), распаковка «tar -x -z -C /tmp/plugin_tmp», глобальное действие going_to_update у установленной старой версии (в её php_server), остановка этого php_server, удаление /flashdata/plugins/
и /tmp/plugins/ , копирование /tmp/plugin_tmp в /flashdata/plugins/ (cp_r) и перерегистрация плагина («reloading plugin»). - fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c088 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после установки обновления новая версия плагина получает глобальное действие update (в новом php_server), затем запускается исходная точка входа, с которой началась проверка; глобальное действие install при обновлении не вызывается.
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c090 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 онлайн-обновление сохраняет cookies плагина и его data_dir_path: v2 и v3 получили в plugin_cookies значение kbp7u_mark, записанное v1, файл kbp7u_mark.txt v1 в flashdata/plugins_data/
остался с прежним mtime. ↩↩ -
doc-sdk-plugins.c105 · doc · any-documented; прошивка — · Онлайн-обновление: в манифесте задаются version_index (число, растёт с каждой версией, в UI не показывается), version (подпись для UI) и check_update (schema, url, timeout, required, auto) ↩
-
doc-sdk-plugins.c108 · doc · any-documented; прошивка — · check_update/timeout — минимальный интервал (с) между проверками; 0 — проверять при каждом запуске точки входа ↩↩
-
doc-sdk-plugins.c109 · doc · any-documented; прошивка — · check_update/auto включает фоновую автопроверку обновлений (по умолчанию выключена), доступно с прошивки 150430_r10 ↩
-
doc-sdk-plugins.c107 · doc · any-documented; прошивка — · Схема обновления 1 устарела и не должна использоваться; нужно использовать schema = 2 ↩
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c044 · code · tv188b, android-atv; прошивка 260724_0207_r24 · В APK r24 разбор манифеста читает check_update/schema (по умолчанию 0); schema больше 3 отключает проверку обновлений; check_update/timeout по умолчанию 0x15180 = 86400 с, отрицательный заменяется на 86400 ↩
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c045 · code · tv188b, android-atv; прошивка 260724_0207_r24 · В APK r24 check_update/url читается только для schema 1 и 2 (при schema 0 и 3 — нет); для schema 1–2 без url или с пустым url проверка отключается сообщением «invalid or missing 'check_update/check_update_url'» ↩
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c014 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 при ошибке проверки обновления в fcn.002635b0, если check_update/schema отличается от 3 и check_update/required=yes, выставляется выходной флаг запрета запуска (6-й аргумент = 1); при required=no эта ветка запрета пропускается. ↩
-
doc-sdk-plugins.c113 · doc · any-documented; прошивка — · При critical = yes, timeout = 0 и required = yes система не даёт запустить старую версию плагина, если на сервере есть обновление ↩
-
doc-sdk-plugins.c110 · doc · any-documented; прошивка — · Документ update_info (
) содержит schema=2, name и plugin_version_descriptor с version_index, version, beta, critical, url, md5, size, caption ↩↩ -
doc-sdk-plugins.c111 · doc · any-documented; прошивка — · Пакет обновления — .tar.gz с тем же содержимым, что у установочного dune_plugin*.zip; md5 — сумма .tar.gz; size — место после установки (du -sk × 1024) ↩
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c063 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 разбор schema 2 (fcn.002c5ef4) перебирает элементы redirect в корне dune_plugin_update_info: redirect без атрибута if берётся сразу, с атрибутом — если условие истинно (вычисляет fcn.00147320, та же функция, что для атрибута if у check_update в манифесте), иначе «NO MATCH» и следующий; непустой текст выбранного redirect — новый URL, update info загружается заново; на 5-м переходе — «too many redirects» и отказ ↩
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c064 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 у plugin_version_descriptor (fcn.002c5ef4) дочерние элементы require — пары «имя единицы версии → шаблон» (текст обязателен: «require '%s': text content is expected»), required_firmware_features — список, разбитый str_next_token; дескриптор проходит, только если каждая единица найдена (иначе «required version unit '%s' not found»), её шаблон совпал (fcn.0017228c, «match<%s> … => YES/NO») и каждая функция есть (has_firmware_feature); из прошедших берётся наибольший version_index, «newer» — больше установленного ↩
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c062 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 после удалённой проверки без принуждения диспетчер (fcn.002c757c) пишет в /tmp/plugin_updater_
.txt time() + next_check_update_timeout из update info, если тот ≥ 0, иначе + check_update/timeout манифеста; next_check_update_timeout берётся из ключа update.txt (schema 1) или из дочернего элемента корня dune_plugin_update_info (schema 2); если разбор вернул 0 (ошибка в update info) или schema не поддержана — пишется просто time() ↩↩↩ -
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c027 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В логе r25 итог schema 2 по плагину — «N candidates», «N matches (0 newer)», «have_better_version = no»: у dune-hd.tv 16 кандидатов, у widget 2, у melange и play_in_apps по 1 ↩
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c058 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 разбор update info schema 1 (fcn.002c5968) загружает файл в properties (properties_build_from_buffer) и читает ключи: next_check_update_timeout (по умолчанию −1), version_index (меньше 1 или нет — «invalid available version_index»), last_critical_version_index, version (необязателен), download_url (нужен http или https, иначе «invalid or missing download url»), space_needed (нужно больше 0, иначе «invalid or missing 'space_needed'») и все ключи, имена которых начинаются с confirm_dialog_line (strncmp на 0x13 = 19 символов), — они собираются в список строк ↩
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c059 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 разбор schema 1 (fcn.002c5968) считает обновление доступным, только если version_index из update.txt больше установленного (иначе результат «нет обновления», download_url и space_needed не проверяются); обновление критическое, если last_critical_version_index ≥ 1 и установленный version_index меньше него ↩
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c026 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В том же логе r25 плагины с URL update.txt (Screenshoter, widget_ext) проверяются как [schema1]: лог показывает current и available version_index/version и «last_critical_version_index = 1, critical = no»; плагины с update_info.xml — как [schema2] ↩
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c060 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 update info schema 1 (update.txt, c058) разбирается как properties функцией properties_build_from_buffer (libduneutil.so): строки разделены '\n', последняя без '\n' берётся по strlen; каждая строка проходит str_seg_strip и пропускается, если пуста или начинается с '#'; в остальных первый '=' (str_seg_get_first_char) отделяет ключ от значения, обе части проходят str_seg_strip, пустой ключ не записывается, строка без '=' пропускается; остальное пишется properties_set_seg(ключ, значение), значение может быть пустым ↩↩↩
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c096 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 str_seg_strip из libduneutil.so пропускает с начала и с конца сегмента байты, для которых импортированный isspace возвращает ненулевое значение, и возвращает указатель и длину оставшегося сегмента; внутренние байты между его краями не удаляются. ↩
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c094 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 properties_get_int из libduneutil.so передаёт ненулевой указатель, возвращённый properties_get, непосредственно в импортированный atoi и возвращает его результат; отдельной проверки пустой строки, полного числового формата или ошибки преобразования в этой функции нет. ↩
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c095 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 properties_get_int из libduneutil.so возвращает третий аргумент как значение по умолчанию, если объект properties равен NULL или ключ не найден (properties_find возвращает −1, а properties_get — NULL). ↩
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c099 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 разбор update.txt schema 1 в fcn.002c5968 задаёт для last_critical_version_index значение по умолчанию −1 третьим аргументом properties_get_int. ↩
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c079 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 оболочка при проверке обновления на запуске запрашивает update_info.xml GET-запросом с адреса 127.0.0.1, дописав к URL «?dune_auth=…», с заголовками User-Agent «DuneHD/1.0 (product_id: tv188b; firmware_version: 261021_0117_r25)», X-Dune-Interface-Language (russian) и X-Dune-Serial-Number. ↩
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c028 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 каждый /tmp/plugin_updater_
.txt содержит одно 10-значное число (unix-время), у 9 файлов значения 1792536168…1792622569 ↩ -
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c061 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 диспетчер проверки обновлений (fcn.002c757c) пропускает удалённую проверку («remote check skipped by timeout»), если проверка не принудительная (второй аргумент 0), check_update/timeout манифеста больше 0 и текущее time() меньше числа из /tmp/plugin_updater_
.txt (нет файла — 0); при timeout ≤ 0 проверка идёт каждый раз ↩ -
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c081 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 повторный запуск точки входа до срока из /tmp/plugin_updater_
.txt не обращается к источнику обновления: в shell.log «[plugin_updater] remote check skipped by timeout», GET update_info.xml нет. ↩ -
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c082 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после установки обновления оболочка удаляет /tmp/plugin_updater_
.txt: «[plugin_updater] removing /tmp/plugin_updater_ .txt» идёт сразу после копирования нового каталога плагина, и после установки файла нет. ↩ -
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c065 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 фоновая автопроверка (fcn.00299d58) берёт плагины со schema 1 или 2 (0 и 3 пропускаются), у которых check_update/auto = yes или имя есть в списке; список читается один раз за процесс: /config/auto_updating_plugins.txt, а если его нет — /firmware/config/auto_updating_plugins.txt, по имени на строку (str_strip, is_valid_plugin_name_seg); перед каждой попыткой /tmp/plugin_updater_
.txt удаляется; итераций 5, при принудительной проверке (аргумент 1) — 3 ↩ -
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c068 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 фоновая автопроверка (fcn.0029a474) стартует, только если с прошлого старта прошло больше 86400 с по CLOCK_MONOTONIC (clock_gettime(1)); время прошлого старта хранится в /tmp/plugin_online_upgrade_last_autocheck_time («%ld», секунды монотонных часов) и при старте перезаписывается; затем «start async check» и двойной fork ↩
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c067 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 фоновая автопроверка (fcn.0029a474) не запускается вовсе, если есть /firmware/config/skip_plugin_auto_update.flag или /config/skip_plugin_auto_update.flag; наличие файлов проверяется один раз за процесс (результат кэшируется) ↩
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c066 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 в диалог «Plugins Auto Update» (fcn.0029a474) попадают только плагины с dont_ask_confirmations = no (не больше трёх строк, дальше — «plugin_online_upgrade_more_plugins__1»); если таких нет — «confirm skipped for all %d plugins» и обновление идёт без диалога; при отмене диалога («upgrade canceled (main dialog)») в списке остаются только плагины с dont_ask_confirmations = yes («continue with %d plugins»), а если их нет — ничего не обновляется ↩
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c025 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 лог /tmp/run/plugin_online_upgrade.log: grand-child процесс по очереди проверяет 9 плагинов — «Checking updates for plugin X», «autocheck of X: iteration 1/5, attempt 1/5», загрузка update info «with timeout 5», итог «plugin X is up-to-date» ↩
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c083 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 фоновая автопроверка обновлений перед загрузкой update info каждого плагина удаляет его /tmp/plugin_updater_
.txt («[plugin_updater] removing /tmp/plugin_updater_ .txt»). ↩ -
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c024 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 (сбор 2026-10-12) в /tmp лежат plugin_online_upgrade_last_autocheck_time (5 байт), пустой plugin_online_upgrade_status.txt и plugin_updater_
.txt по 10 байт для 9 плагинов: Screenshoter, dune-hd.tv, dunemdb_supplier_generic, dunemdb_supplier_online_movies, melange, play_in_apps, smotreshka.tv, widget, widget_ext ↩ -
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c085 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после «Напомнить позже» оболочка запускает исходную точку входа установленной старой версии, а срок следующей проверки остаётся прежним — время проверки + next_check_update_timeout (20 с): запуск через 38 с снова загрузил update info и снова показал диалог обновления. ↩
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c077 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 при проверке обновления при запуске (fcn.002635b0) отказ от критического обновления на шаге подтверждения («critical update cancelled, access denied») и неудачная установка критического («critical update failed, access denied») удаляют /tmp/plugin_updater_
.txt и запрещают запуск (флаг access denied); отказ от некритического ничего не удаляет и запуск продолжается ↩ -
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c069 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 проверка обновления при запуске плагина (fcn.002635b0), если версия новее и у плагина есть глобальное действие с кодом 0x59, вызывает его (fcn.002624d0) со свойствами check_update_plugin_name, check_update_url, check_update_version, check_update_prev_version, check_update_version_index и check_update_prev_version_index; результат 0 — «enabled by custom action» и обычное обновление, 1 — «skipped by custom action» (без обновления), 2 — «updated by custom action» (считается обновлённым), иное — «custom action returned %d» и обычное обновление ↩
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c070 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 функция fcn.001473cc возвращает имена глобальных действий по кодам: 0x4a — install, 0x4b — update, 0x4d — going_to_update, 0x59 — confirm_update. ↩
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c086 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 перед диалогом обновления оболочка вызывает глобальное действие confirm_update установленной версии плагина и передаёт в user_input поля check_update_plugin_name, check_update_url (URL пакета), check_update_version, check_update_prev_version, check_update_version_index и check_update_prev_version_index; при ответе null — «confirm_update action finished with status 0» и «plugin_updater I: enabled by custom action», обновление идёт обычным путём. ↩
-
doc-sdk-plugins.c143 · doc · any-documented; прошивка — · Global plugin actions поддерживают системные события boot, install, update и uninstall ↩
-
- fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c070 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 функция fcn.001473cc возвращает имена глобальных действий по кодам: 0x4a — install, 0x4b — update, 0x4d — going_to_update, 0x59 — confirm_update.
- fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c071 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 установщик (fcn.00291f10) по окончании шлёт плагину глобальное действие 0x4b, если его 11-й аргумент ненулевой, иначе 0x4a; обновление при запуске плагина и фоновое обновление вызывают его с этим аргументом = 1; перед заменой каталога (fcn.00291428) установленному старому плагину шлётся 0x4d
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c072 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 при замене пакета плагина fcn.00291428 вызывает going_to_update на объекте установленной старой версии перед nav_plugin_delete_plugin_data(…, 1); после успешной установки fcn.00291f10 заново находит плагин по имени установленного пакета и вызывает на найденном объекте update, если 11-й аргумент установщика ненулевой (так вызывают обновления при запуске и фоновые). ↩
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c087 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 установка обновления после «Обновить» идёт так: «loading tgz-archive» (пакет по url из update info), распаковка «tar -x -z -C /tmp/plugin_tmp», глобальное действие going_to_update у установленной старой версии (в её php_server), остановка этого php_server, удаление /flashdata/plugins/
и /tmp/plugins/ , копирование /tmp/plugin_tmp в /flashdata/plugins/ (cp_r) и перерегистрация плагина («reloading plugin»). ↩↩ -
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c088 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после установки обновления новая версия плагина получает глобальное действие update (в новом php_server), затем запускается исходная точка входа, с которой началась проверка; глобальное действие install при обновлении не вызывается. ↩
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c092 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 установка обновления после «Обновить» не показывает на экране сообщений о ходе и завершении: через ~2 и ~5 с после нажатия — сетка «Приложения» без окон, хотя в логе есть «dialog D: push progress.plugin_installer». ↩
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c089 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 файлы плагина, установленные онлайн-обновлением из tgz, — владелец system, -rw-r--r--, метка u:object_r:system_app_data_file:s0; в архиве у них тоже -rw-r--r--, а файлы v1, положенные adb push, были -rw-rw-rw-. ↩
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c073 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 при замене установленного плагина (fcn.00291428) старому вызывается nav_plugin_delete_plugin_data (fcn.00261034) с флагом 1: удаляются только каталоги установки (список fcn.0021bab0 и plugin->path) и ещё одно поле плагина (+0x14); /tmp/plugin_updater_
.txt, поля +0x10, +0x18…+0x24, /tmp/www/plugins/ , /tmp/www/cgi-bin/plugins/ и файл, путь которого строит fcn.0027ee94, удаляются только при флаге 0; затем новый каталог копируется (из /tmp/) или переименовывается в <хранилище>/plugins/ , снимается флаг скрытия, удаляется /tmp/plugin_updater_ .txt и плагин перезагружается ↩ -
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c074 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 при замене пакета вызов nav_plugin_delete_plugin_data(…, 1) не удаляет каталоги данных /config/plugins_data/
и <хранилище>/plugins_data/ , а также /config/ _plugin_cookies.properties: удаление соответствующих полей +0x10 и +0x18 и вызов fcn.0027ee94 с FS_unlink находятся только в ветке флага 0. ↩ -
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c034 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Пакет обновления скачивается установщиком как «%s-archive» (tgz или zip), md5 сверяется («md5 does not match», expected/actual); zip распаковывается командой unzip plugin.zip во временном каталоге ↩
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c076 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 plugin_installer://
:::schema=update (fcn.0057096c) требует установленный плагин (иначе status error_bad_plugin_name), удаляет /tmp/plugin_updater_ .txt и запускает проверку обновления при запуске (fcn.002635b0) с 4-м аргументом 1, при котором шаг fcn.0025ae4c (подтверждение) пропускается; status — ok или error_access_denied ↩ -
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c037 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Для уже установленного плагина встроенные PHP-плагины запускают plugin_installer://<имя плагина>:::schema=update (dunestore, shell_ext — при обновлении сервисного плагина и при force_check_update TV-приложения) ↩
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c075 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 URL установщика plugin_installer://…:::schema=… разбирается так (fcn.0057096c): schema = update — обновление установленного плагина (c076), tgz и zip — прямой пакет, иначе atoi; в fcn.002c7a40 schema < 1 — «schema should be > 0», 1 — нужен name (по нему берётся установленный version_index или −1, update.txt разбирается fcn.002c5968), 2 — update_info.xml разбирается fcn.002c5ef4 без сверки имени с name из URL, а ignore_existing ≠ 0 отключает сравнение с установленной версией; прочие — «schema %d is not supported» ↩
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c031 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В логе автопроверки r25 есть «hd_debug D using PLUGIN_UPDATE = 0» — отладочный параметр /config/hd_debug/PLUGIN_UPDATE.txt читается в процессе проверки, значение по умолчанию 0 ↩
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c093 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при старте оболочки с $FS_PREFIX/config/hd_debug/PLUGIN_UPDATE.txt = 1 строка «hd_debug D: using PLUGIN_UPDATE = …» в shell.log не выводится, тогда как созданный рядом PLUGIN_OPEXEC.txt = 1 даёт «hd_debug D: using PLUGIN_OPEXEC = 1». ↩
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c029 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В логе oth-dev-tv188b-r25-20261023 сроки в /tmp/plugin_updater_
.txt у Screenshoter и widget_ext совпали с «время проверки + check_update/timeout» из манифестов plg-dc (+20 с и +0 с), а у dune-hd.tv — с временем проверки + сутки; задавал ли их update_info next_check_update_timeout, не установлено. ↩ -
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c004 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Имена version_index, version, next_check_update_timeout, last_critical_version_index, download_url, space_needed и ключей с префиксом confirm_dialog_line — ключи файла update info schema 1 (update.txt): version_index — номер версии пакета (оболочка сравнивает доступный version_index с текущим), version — строка версии, download_url — адрес пакета, space_needed — нужное место, last_critical_version_index — последний критический version_index; next_check_update_timeout и confirm_dialog_line в 41 известном образце не встречаются, то есть необязательны ↩
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c097 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 properties_get_int при libc bionic android12-release (atoi вызывает strtol с основанием 10) возвращает 1 для найденного значения «1.0.0», а для существующей пустой строки и строки «abc» — 0; это не возврат переданного значения по умолчанию. ↩
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c098 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 при libc bionic android12-release str_seg_strip обрезает по краям сегмента пробел (0x20), TAB (0x09), LF (0x0a), VT (0x0b), FF (0x0c) и CR (0x0d), поэтому замена окончаний LF на CRLF в update.txt не меняет разобранные ключи и значения. ↩
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c008 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Вероятно, require / required_firmware_features в plugin_version_descriptor задают условия на прошивку: дескриптор, не прошедший условия, отсеивается, и из кандидатов остаются «matches»; redirect, вероятно, отсылает к другому update info при совпадении условия ↩
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c011 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Schema 3, вероятно, служит для плагинов-расширений прошивки (fw extension, каталог firmware_ext): их версия сверяется с сервером Dune HD по version_id и номеру патча при старте; для сторонних плагинов она не предназначена ↩
-
fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c018 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Вероятно, /tmp/plugin_online_upgrade_status.txt — список найденных обновлений, по строке на плагин «
»; пустой файл — обновлений нет ↩