Перейти к содержанию

Миграция плагина на r25: что проверить и поменять, диагностика «перестало работать»

Редакция 2026-11-02. Что проверить и поменять, чтобы PHP-плагин Dune HD, написанный под r22 или r24, работал на r25, и как разобрать симптом «на r24 работало, на r25 нет». Источники: код tv188b 261021_0117_r25 и 260827_0003_r24 (code), наблюдения на tv188b r25 и снимки tv188b r24 (device), список изменений прошивок (doc), страница SDK dune_devel_info (doc, только как «что просит SDK»: §4.6), код плагинов ProIPTV, GlobalTV 260130_1351, Dune BackUp (code). Каждое фактическое предложение ссылается на claim id. Наблюдений и кода по другим устройствам и сборкам r25 в базе нет: §1.

Рядом: сводка r24 → r25 и r22 → r24 — «Различия по версиям и платформам»; матрица возможностей по прошивкам — «Матрица совместимости возможностей плагина»; реестр ошибок прошивки — «Реестр ошибок прошивки и SDK»; грабли — «Грабли»; приёмы совместимости в плагинах — «Приёмы разработки плагинов Dune HD».

Коротко: вопрос → ответ

Вопрос Ответ Где
Нужно ли пересобирать плагин под r25? php_server r25 сам подгружает bootstrap.php, dune_api.php, dune_plugin.php, dune_plugin_fw.php и dune_config.php прошивки перед программой плагина (устройство r25)1; проверять надо вызовы убранного и изменённого §1, §2.4
Что в API r25 убрано? HD::make_json_rpc_request (код r25)2, его прямой вызов на tv188b r25 в запросе 11 — E_ERROR (устройство r25)3, и ключ mcf_id у SyncMyCollectionActionData (код r25)4 §2.4
Сменилась ли версия PHP? нет: PHP/5.3.6 во всех пяти разобранных сборках (код r22, r24, r25)5 §3
Сменился ли CA-бандл? нет: SHA-256 один во всех пяти сборках (код r22, r24, r25)6 §3
Что нового в сетевом стеке PHP? подмена хоста lcreg, которой нет в r24 (код)7 §2.5
Как отличить r25 в коде? firmware_version в /tmp/run/versions.txt (устройство r25)8 либо проверка нужной константы (код)9 §2.3
Какого ключа нет в versions.txt r25? android_platform (устройство r25)8 §2.1, строка 9
Проверяет ли HD::http_get_document r25 сертификат TLS? по умолчанию нет: CURLOPT_SSL_VERIFYPEER=false (код r25)10; включённая проверка идёт по бандлу прошивки (код r25)11 §2.9
Что SDK просит от плагинов на Android 11+ AOSP и ATV? FS_PREFIX к путям (SDK)12, запуск скриптов через sh или bash (SDK)13, никаких бинарных исполняемых файлов в пакете (SDK)14; это текст SDK, а не факт r25 §4.6

1. Что меняется при переходе на r25: три слоя под плагином

Объект: PHP-плагин на tv188b 260827_0003_r24 → 261021_0117_r25.

Перенос на r25 — это не сборка плагина под новую версию, а смена того, что лежит под плагином. Таких слоёв три, и от слоя зависит, где искать причину.

Первый слой — PHP-фреймворк прошивки. На r25 php_server при старте загружает bootstrap.php, dune_api.php, dune_plugin.php, dune_plugin_fw.php, затем dune_config.php и только потом программу плагина (устройство r25)1. Системные файлы при этом берутся из /system/dunehd/firmware_ext/php/ (устройство r25)15. Файлы dune_api.php и dune_plugin_fw.php в r25 уже не те, что в r24 (код r24, r25)16. Поэтому классы и константы, которые видит плагин, меняются вместе с прошивкой, а расхождения этого слоя собраны в §2.4 и §4.1. В include_path на r25 каталог плагина стоит раньше firmware_ext/php/include (устройство r25)17; шаблон .:%s:%s с двумя каталогами есть и в строках php_server разобранной прошивки r24 (код r24)18.

Второй слой — нативный код. libphp5.so r25 — другой файл, чем в r24 (код r22, r24, r25)19, libduneshell.so тоже (код r24, r25)20, libvlc.so и libxxx_dune_mediainfo.so тоже (код r24, r25)21. Изменения этого слоя видны как поведение: §2.5, §2.6 и строки таблицы §2.1.

Третий слой — чужие внутренние библиотеки, которые плагин мог скопировать к себе: shell_ext/lib прошивки и её копии в плагинах. Например, в копиях lib GlobalTV 260130_1351 и shell_ext/lib tv188b r24 побайтно совпадают интерфейсы экранов (код r24)22. Сигнатуры в r25 разошлись с такими копиями (код r24, r25)23; они перечислены в §2.4.

Чем подтверждено и чем нет. Наблюдения device по r25 в этой главе сделаны на tv188b с прошивкой 261021_0117_r25, модель «Pro 8K Plus» (устройство r25)24. Список изменений называет эту сборку alpha-версией r25 (SDK r25)25, Android 11 в ней тот же, что в r24 (код r25)26. В разделе r25 страницы alpha перечислены восемь 8K-моделей (SDK r25)27, а у tv989a свои версии r25 (SDK r25)28. Снимки device с r24, на которые опирается глава, — это процессы, окружение, файлы и cmd=status (устройство r24)29.

Поэтому в главе различаются четыре метки столбца «r24 → r25»:

Метка Что значит
изменилось есть claims обеих версий и они различаются
новое в r25 claim r25 прямо говорит, что в r24 этого нет
r24: не проверено факт есть только для r25; на r24 могло быть так же
SDK ≠ r25 сторона сравнения — текст SDK; со старой прошивкой это не сравнение

2. Задачи

2.1. Почему на r25 не работает: симптом → причина → что поменять

Объект: плагин на tv188b 261021_0117_r25; строка показывает, изменилось ли это относительно r24.

Порядок — от того, что касается любого плагина, к тому, что касается только части плагинов: установка, PHP, сеть, IP Control, VOD, поставщик. Частоту самих сбоев claims не измеряют. Строки 31 и 32 (PHP и команды оболочки) дописаны в конец, чтобы не сдвигать номера, на которые ссылается §2.2. Первым делом смотрите лог плагина: на r25 он лежит в /data/data/com.dunehd.app/tmp/run/<плагин>.log (устройство r25)30.

# Симптом на r25 Причина Что поменять r24 → r25 Claim
1 Плагин, положенный adb push, не появился перечитывание по IP Control его не подхватило, регистрация прошла после am force-stop com.dunehd.app; каталога /flashdata в корне ФС нет, файлы лежат в /data/data/com.dunehd.app/flashdata/plugins класть туда и перезапускать приложение; подробно — «Пакет плагина» SDK ≠ r25 (устройство r25, SDK)31
2 Не выполняются install и update после adb push при таком развёртывании они не вызываются, а boot, boot_end, gui_start вызываются update проверять онлайн-обновлением: там новая версия его получает r24: не проверено (устройство r25)32
3 Плагин не зарегистрирован ни под каким именем name в dune_plugin.xml не равен имени каталога; у установщика r24 есть сверка имени с сообщением «declared plugin name is» привести имена к одному r24: сверка в коде; поведение не проверено (устройство r25, код r24)33
4 Точки входа нет в «Приложениях» у точки входа нет icon_url задать icon_url r24: не проверено (устройство r25)34
5 После установки не те файлы и бинарники применяются .platform.android, затем поверх .platform.android-arm-api19; .platform.87xx и прочие удаляются класть Android-вариант в .platform.android; см. BUG-008 SDK ≠ r25 (устройство r25, SDK)35
6 Правка PHP не подхватывается php_server перезапускается при изменении main.php, правка подключаемого файла его не перезапускает после правки делать touch main.php r24: блок строк тот же, поведение не проверено (устройство r25, код r25)36
7 «Ошибка приложения» при действии в плагине Fatal error или exit(0) в handle_user_input: оболочка останавливает php_server, следующий вызов идёт в новом процессе; при null из call_plugin — та же остановка и «Ошибка приложения» смотреть лог плагина; проверить вызовы из §2.4 r24: не проверено (устройство r25)37
8 «Превышено время операции» по тайм-ауту оболочка останавливает php_server, без operation_timeout у handle_user_input 60 с задать operation_timeout, разбить долгую работу; §2.6 r24: код другой, поведение не проверено; §6 (устройство r25, код r24)38
9 Пустое значение типа Android-платформы в /tmp/run/versions.txt r25 нет android_platform; ConfigUtils::load_product_and_fw() r24 и r25 читает ключ оттуда, но при fw_apk берёт значение из fw_apk_platform.txt, так что пусто будет у своего разбора файла; ProIPTV разбирает его только вне APK, а при is_apk() и пустом static-кэше ставит type = fw_apk или apk без чтения versions.txt (§5) брать из $FS_PREFIX/firmware/config/fw_apk_platform.txt, там s928x_android11; §2.3 r24: файл tv188b не проверен; метод читает ключ и в r24, и в r25, fw_apk_platform.txt тот же, у tv175u r24 ключ пишет init (устройство r25, код)39
10 shell_exec работает не с тем файлом $FS_PREFIX добавляется к /tmp/…, /firmware/…, /config/…, /flashdata/… и к пути в одинарных кавычках, но не к пути в двойных писать путь в одинарных кавычках или с явным $FS_PREFIX; см. BUG-012 r24: не проверено; SDK пишет иначе: §6 (устройство r25)40
11 date() в CGI пишет PHP Warning в php-cgi с php.ini без date.timezone значение пусто, в php_server задано задать date.timezone в php.ini CGI r24: не проверено (устройство r25)41
12 HTTPS падает с errno 60 у сайта в бандле нет корня цепочки, как у www.ssl.com; бандл не менялся с r22 см. BUG-001; как проверяет HD::http_get_document — §2.9 не изменилось (устройство r25, код r22, r24, r25)42
13 Сбой на curl_multi: код 139 или PHP_CALL_FAILED падение после curl_multi_info_read на 4 хендлах к httpd самого плеера; с 4 хендлами к компьютеру (запрос 12, один прогон) — отчёт обрывается на метке перед curl_multi_getcontent h0, EOF и PHP_CALL_FAILED; обхода в claims нет, см. BUG-002 и «HTTP из PHP плагина на r24 и r25» не держать такой вызов в основном пути; внешние хосты не проверялись r24: имена функций те же, поведение не проверено (устройство r25, код r22, r24, r25)43
14 Запрос ушёл на другой хост lcreg заменил хост при заданном lcreg.txt §2.5 новое в r25 (код)7
15 Свой разбор логов перестал находить строки сменился формат сообщений HD::http_get_document и исполнителя операций поправить шаблоны по §4.5 изменилось (код r25)44
16 /cgi-bin/do?cmd=…&plugin=<p> даёт unknown_command запрос не дошёл до www/cgi-bin/run.php плагина вызывать CGI по /cgi-bin/plugins/<p>/<файл> r24: не проверено; §7 (устройство r25)45
17 404 на URL плагина «/» в конце: каталог плагина со «/» — 404, без «/» — 302; «/» после имени файла — 404 убрать «/» r24: не проверено (устройство r25)46
18 cmd=open_path отвечает ok, но плагин не запускается точку входа запускает launch_media_url с plugin_launcher://, а не open_path root://applications/…; см. «IP Control (/cgi-bin/do) для разработчика плагина» перейти на plugin_launcher://{name=…}{ep_media_url=…} SDK ≠ r25 (устройство r25, SDK)47
19 Команды IP Control зависают ждут конца handle_user_input, даже адресованные другому плагину; см. «IP Control (/cgi-bin/do) для разработчика плагина» не держать долгую работу в handle_user_input r24: не проверено (устройство r25)48
20 Не вызывается get_vod_stream_info без feature vod_get_stream_info ленивая серия получает только get_vod_stream_url; с ней метод вызван объявить <features><feature>vod_get_stream_info</feature></features>, как ktv_start r24: манифест ktv_start тот же, поведение не проверено (устройство r25, код r24)49
21 Серверу не приходят заголовки потока HTTP MP4 без engine играет VLC, и http_headers на нём не уходят; с engine:1 заголовок дошёл у серии с playback_url_is_stream_url=true, а в запросе 11 — и из ответа get_vod_stream_url для kbplazy://0 без суффикса; см. «Воспроизведение из плагина» добавить engine:1 в dune_params r24: не проверено, libvlc.so другой (устройство r25)50
22 Логика переключения серий срабатывает в конце последней серии playback_going_to_switch приходит и тогда, когда перехода нет не считать событие признаком следующей серии; см. BUG-007 SDK ≠ r25 (устройство r25, SDK)51
23 Изменилась длительность буфера VOD PluginVodInfo::buffering_ms применяется, хотя SDK называет поле нереализованным проверить значение, которое отдаёт плагин SDK ≠ r25 (устройство r25, SDK)52
24 Прямой вызов /firmware/scripts/ffmpeg.sh падает на устройстве такого пути нет: No such file or directory, хотя в образах r24 и r25 скрипт лежит в system/system/dunehd/firmware/scripts/ брать $FS_PREFIX/firmware/bin/ffmpeg (на r25 в запросе 11 из adb shell с LD_LIBRARY_PATH (§6) он вывел ffmpeg version 7.1.3), а без него — свою сборку, как ProIPTV (SDK бинарные исполняемые файлы в плагине запрещает: §6); см. BUG-016 r24: вызов в коде и скрипт те же, поведение не проверено (устройство r25, код, SDK)53
25 Поставщик rutube стал другим r24 подменял expr на country(ru) без rutube_integration; r25 при этом плагине поставщика включает, а иначе решает ключ expr описателя проверять условие по описателю изменилось (код)54
26 Поставщик получил sup_info у кнопки выбора в r24 кнопки поставщиков его не получали; в r25 получает кнопка поставщика последней записи истории разбирать wh_* и в play_online; см. «Поставщик каталога «Фильмы»» изменилось (код)55
27 Новый описатель в /tmp/movie_suppliers виден без флага r24 перечитывает при флаг-файле, r25 ещё и при смене mtime каталога не рассчитывать, что без флага список не обновится изменилось (код)56
28 get_stream_url вызывается без выбора пользователя; url файла не используется у stream запросы идут сразу после do_file_search; у stream_special url из ответа не взят держать get_stream_url быстрым и реализованным; см. «Поставщик каталога «Фильмы»» r24: stream_special в коде так же; остальное не проверено (устройство r25, код r24)57
29 error_action поверх открывшегося приложения при delay < 1 ожидание фокуса сразу кончается неудачей, если оболочка ещё в фокусе ставить wait_app_start_delay > 0, см. BUG-006 r24: тот же порядок проверок в коде, поведение не проверено (устройство r25, код)58
30 am start --user … даёт статус −1 неизвестная опция отвергается: --user нет и среди строк dune.apk r24 убрать опцию; ветка /system/dunehd/dunehd_service идёт в popen, с --user она не проверена (§7); см. «Поставщик каталога «Фильмы»» не изменилось по строкам (устройство r25, код)59
31 Прямой вызов HD::make_json_rpc_request на tv188b r25 в запросе 11 кончается фатальной ошибкой, JSON-ответа нет в dunelib/utils.php r25 метода нет; в запросе 11 (один прогон) после include dunelib/utils.php класс HD есть, method_exists дал false, прямой вызов — E_ERROR Call to undefined method HD::make_json_rpc_request() держать свою функцию; §2.4 в r24 метод есть (устройство r25, код)60
32 wget по полному пути не запустился в запросе 11 из php_server в запросе 11 (один прогон) оба вызова /data/data/com.dunehd.app/bin/wget — напрямую и через sh — вернули rc=126 и cannot execute binary file; причину claim не называет звать по имени: which wget показал этот путь (ссылка на libxxx_busybox.so), а вызов wget к /ping компьютера вернул ok и rc=0 r24: не проверено (устройство r25)61

2.2. Как перенести плагин: чек-лист от широкого к узкому

Объект: пакет плагина под r22/r24, проверка на tv188b r25. Номера в скобках — строки таблицы §2.1, где описаны причина и claims.

Чек-лист идёт от того, что нужно всем, к тому, что нужно части плагинов. Пункты, которые вас не касаются, пропускайте.

Любой плагин.

  1. Поставьте плагин и проверьте регистрацию, имя каталога и icon_url; при adb push — путь и перезапуск приложения (1, 3, 4).
  2. Проверьте раскладку .platform.* (5) и вызов обработчиков install/update (2).
  3. Найдите в коде make_json_rpc_request (31: прямой вызов на tv188b r25 в запросе 11 — E_ERROR (устройство r25)3) и mcf_id (§2.4) и, если плагин несёт копию shell_ext/lib или ext_epg/lib, — сигнатуры из §2.4.
  4. Откройте лог плагина и пройдите все экраны: Fatal error даст «Ошибку приложения» (7).
  5. Проверьте код, который разбирает /tmp/run/versions.txt: ключ android_platform (9) и способ разбора ревизии (§2.3).
  6. Задайте operation_timeout с верными единицами (8, §2.6).

Плагин с командами оболочки и CGI.

  1. Проверьте кавычки вокруг путей в shell_exec (10), «/» в конце URL (17), таймзону в CGI (11), адресацию CGI (16) и вызов ffmpeg (24) и wget (32).

Плагин с сетью.

  1. Проверьте HTTPS к своим хостам с включённой проверкой TLS (12, §2.9), curl_multi (13), подмену хоста (14, §2.5).
  2. Проверьте скрипты, которые разбирают логи (15).

Плагин с внешним управлением.

  1. Замените open_path на plugin_launcher:// (18) и учтите ожидание команд IP Control (19).

Плагин с VOD.

  1. Объявите vod_get_stream_info, если метод нужен (20); проверьте заголовки потока (21), обработку playback_going_to_switch (22) и значение buffering_ms (23).
  2. Проверьте клавиши VOD и историю по «Ввод и диалоги» и «Воспроизведение из плагина».

Поставщик «Фильмов».

  1. Проверьте условие expr и обновление списка поставщиков (25, 27), разбор sup_info (26), get_stream_url (28), запуск приложения (29, 30). Различия по прошивкам сведены в «Поставщик каталога «Фильмы»».

Плагин, рассчитанный на r24 и r25 одновременно.

  1. Закройте новые вызовы API проверкой наличия (§2.3, §2.7).

Что просит SDK для Android 11+ AOSP и ATV.

  1. Пройдите требования страницы dune_devel_info: пути с FS_PREFIX, команды в shell_exec и system, имя процесса GUI, если плагин его ищет или завершает, запуск скриптов через sh или bash, бинарники в пакете. Это просьбы SDK; что из них подтверждено на r24+, а что нет, показано в §4.6.

2.3. Как определить прошивку и возможности из плагина

Объект: код плагина на tv188b r24 и r25, приёмы ProIPTV.

Плагину нужно это в двух случаях: чтобы обойти различие из §2.1 и чтобы не вызвать API, которого на этой прошивке нет. Подробный каталог приёмов — «Приёмы разработки плагинов Dune HD»; здесь только то, что важно при переходе на r25.

На r25 /tmp/run/versions.txt — шесть строк key=value: api_version=1.1.0, firmware_version=261021_0117_r25, product=tv188b, platform_kind=android, app_version, app_version_code (устройство r25)8. Версию можно взять и из /cgi-bin/do?cmd=status: там те же 16 имён параметров, что на r24, и firmware_version (устройство r24, r25)62.

Тип Android-платформы в versions.txt r25 не записан: ключа android_platform там нет (устройство r25)8. ConfigUtils::load_product_and_fw() r25 всё равно читает его оттуда, но при истинном HD::is_fw_apk() перезаписывает значение содержимым /firmware/config/fw_apk_platform.txt (код r25)63; HD_FW_APK у php_server на tv188b r25 равна 1 (устройство r25)64, а в r24 для fw_apk значение берётся из того же файла (код r24)65. Сам файл в образах r24 и r25 один и тот же и содержит s928x_android11 (код r24, r25)66, на устройстве r25 — то же (устройство r25)67. Поэтому свой разбор versions.txt на r25 этого значения не даст (§2.1, строка 9).

Ревизию разбирают числом: ProIPTV выделяет регуляркой rev_number (код)68 и считает is_r25_or_higher() как rev_number > 24 (код)69. В Expr прошивки r24 fwv_ge, fwv_gt, fwv_le, fwv_lt сравнивают через strcmp (код r24)70.

Возможность ProIPTV проверяет саму: defined('ChooseFileActionData::filter') и class_exists('PluginRowsFolderView') (код)9. Для r25 подходят те же приёмы и имена из §4.1: например, COND_ACTION_ID есть в dune_api.php r25 и нет в r24 (код r25)71.

Флаги прошивки читаются из /tmp/firmware_features.txt и /tmp/ro_features.txt (код r24)72; по версиям они сведены в §4.3. Признаки оболочки не менялись: на r24 и r25 в окружении заданы и HD_APK=1, и HD_FW_APK=1 (устройство)73.

2.4. Убранные и изменённые API r25: HD, dune_api.php, shell_ext/lib

Объект: dunelib/utils.php и dune_api.php прошивки (доступны любому плагину), shell_ext/lib и ext_epg/lib прошивки (код встроенных плагинов и их копии в сторонних).

Здесь всё, что в claims значится убранным или изменённым так, что старый вызов может сломаться. Первые две строки касаются любого плагина, потому что эти файлы подгружает сам php_server или они лежат в его include_path (устройство r25)74. Остальные касаются тех, кто скопировал код shell_ext/lib или ext_epg/lib к себе: в include_path этих каталогов нет (устройство r25)17. Для них важно, что копия и код прошивки разошлись: при обновлении копии или при переносе нового кода из r25 сверяйте сигнатуры.

Что r24 r25 Что сделать Claim
HD::make_json_rpc_request($op_name, $params) возвращает массив JSON-RPC 2.0 с растущим id метода нет; прямой вызов на tv188b r25 в запросе 11 — E_ERROR держать свою функцию (устройство r25, код)75
SyncMyCollectionActionData::mcf_id ключи mcf_id, post_action только post_action убрать ключ (код)76
ActionFactory::sync_my_collection (shell_ext/lib) mcf_id по умолчанию −1 принимает только $post_action убрать аргумент (код)77
get_timer в GCompsScreen, RowsScreen (shell_ext/lib) get_timer(MediaURL $media_url, &$plugin_cookies) get_timer($media_url); так же объявлен в RegularScreen при копировании новых экранов брать сигнатуру r25 (код)78
RowsFactory::pane (shell_ext/lib) формирует PluginRowsPane второй позиционный параметр — $row_dup_map, за ним $focus, $bg проверить позиционные вызовы (код)79
ActionFactory::edit_list_config (shell_ext/lib) после groups сразу sel_id, post_action обязательный позиционный options между groups и sel_id проверить позиционные вызовы (код)80
get_label_def в ext_epg/lib/gcomps_factory.php создаёт GCOMPONENT_LABEL метода нет, вместо него label_v2 с GCOMPONENT_TTF_LABEL заменить в своей копии при обновлении (код r24, r25)81

На r25 Fatal error в handle_user_input даёт «Ошибку приложения» (§2.1, строка 7) (устройство r25)82. Прямой вызов убранного HD::make_json_rpc_request проверен на tv188b r25 в запросе 11 (один прогон): после include файла dunelib/utils.php класс HD есть, method_exists дал false, а вызов завершился E_ERROR Call to undefined method HD::make_json_rpc_request(), а не JSON-ответом (устройство r25)3. Какое сообщение видно на экране, claims не говорят: см. §7. Для того, что в r25 только добавлено, см. §4.1.

2.5. Почему запрос ушёл не на тот адрес: URL в libphp5.so r25 и lcreg

Объект: libphp5.so tv188b r25 и r24 (code, дизассемблер), PHP-функции сети.

Встроенный PHP переписывает URL до запроса, и в r25 к прежней подстановке порта добавилась подмена хоста. Она вынесена отдельно, потому что меняет адрес запроса, а не только его путь внутри плеера.

Прежняя часть — подстановка порта. В коде r24 при заданной HD_HTTP_LOCAL_PORT URL http://127.0.0.1/cgi-bin/plugins/… и http://localhost/cgi-bin/plugins/… превращаются в http://127.0.0.1:<порт>/cgi-bin/plugins/…, и это та же CGI-подстановка, что в r25 (код r24)83. В коде r25 _php_do_add_fs_prefix_to_http при заданной HD_HTTP_LOCAL_PORT заменяет префикс http://localhost/cgi-bin/plugins/ на http://127.0.0.1:<HD_HTTP_LOCAL_PORT>/cgi-bin/plugins/ с тем же хвостом (код r25)84 и тем же кодом — префикс без порта http://127.0.0.1/cgi-bin/plugins/ (код r25)85. Без переменной, а также для http://-URL с другим хостом или путём порт не подставляется и URL уходит в _php_apply_lcreg_to_http; URL не на http:// возвращается без обработки (код r25)86. Что из этого видно на устройстве r25, — ниже, в абзаце о маршрутах; что не проверено — §7.

Новая часть — lcreg. В r24 помощник не вызывает lcreg и других функций замены хоста (код r24)87, а в r25 вызывает его при отсутствии HD_HTTP_LOCAL_PORT либо для http://-URL, не попавшего под подстановку порта (код r25)88. При заданной HD_HTTP_LOCAL_PORT URL без префикса http:// выходит до lcreg (код r25)88, а в окружении php_server плагина kb_probe8 на tv188b r25 она равна 80 (устройство r25)89. Настройки берутся из FS_PREFIX + /config/lcreg.txt и FS_PREFIX + /config/lcreg_pairs.txt (код r25)90:

  • первая строка lcreg.txt, равная 0, выбирает встроенную таблицу lcreg_ru_pairs, равная 1 — файл пар; ошибка чтения или другое значение дают lcreg_kind=-1 (код r25)91, а при −1 замена не ищется (код r25)92;
  • состояния −1, 0 и 1 не запускают повторное чтение настроек (код r25)93;
  • строка файла пар имеет вид <хост> : <замена>, принимается до 1024 пар (код r25)94;
  • имя хоста сравнивается целиком и с учётом регистра (код r25)95, схема, userinfo, порт и путь остаются исходными (код r25)96;
  • при успешной замене исходный и новый URL печатаются через printf без проверки PHP_DEBUG (код r25)97.

Маршрут зависит от функции. curl_setopt с URL-опцией проходит через помощник (код r25)98, а curl_init($url) вызывает установку URL напрямую, минуя этот путь (код r25)99. На tv188b r25 в запросе 11 (один прогон, php_server) один и тот же http://localhost/cgi-bin/plugins/kb_probe11/host.sh пришёл в CGI с HTTP_HOST=127.0.0.1 при curl_setopt(CURLOPT_URL) (устройство r25)100 и с HTTP_HOST=localhost при curl_init($url) (устройство r25)101; curl_error пуст в обоих случаях (устройство r25)102. Более ранний запрос 6 испытал только curl_init($u) (код r25)103: из php_server при HD_HTTP_LOCAL_PORT=80 (устройство r25)104 запрос к http://localhost/cgi-bin/plugins/kb_probe6/ping.sh пришёл с HTTP_HOST=localhost, а к http://127.0.0.1:80/cgi-bin/plugins/kb_probe6/ping.sh — с HTTP_HOST=127.0.0.1 (устройство r25)105. Поэтому, читая HTTP_HOST в CGI, сначала смотрите, каким вызовом задан URL. Открытие потока передаёт путь в помощник до выбора URL-обёртки (код r25)106. Кроме того, curl_exec r25 ставит обработчик _php_curl_opensocket_remote для адреса вне localhost и 127.x/::1, а также для пустого URL или URL с другой схемой (код r25)107; что он делает, в claims нет.

Диагностика: проверьте наличие и содержимое $FS_PREFIX/config/lcreg.txt и найдите в выводе пары URL из printf. Что lcreg делает с хостами Dune и включён ли он на устройствах — в §7.

2.6. Почему операция кончается «Превышено время операции»

Объект: операции PHP-плагина, код r24 и наблюдения на tv188b r25. Полная картина — «Операции плагина, тайм-ауты и php_server».

Это различие заметнее других, потому что меняет, что происходит с вашим PHP-кодом. В коде r24 отмена операции только ставит флаг в дескрипторе и ничего не передаёт php_server (код r24)108, а пришедший результат отброшенной операции не разбирается (код r24)109. На r25 по тайм-ауту оболочка останавливает php_server, и вызов прерывается (устройство r25)110. Следующий вызов идёт в новом процессе (устройство r25)111, статические переменные начинаются заново (устройство r25)112. Какой код r25 за это отвечает, claims не говорят (§6).

Значение надо задавать в правильных единицах: в манифесте operation_timeout — секунды (устройство r25)113, в данных действия plugin_handle_user_input — миллисекунды (устройство r25)114. Значение 3 в данных действия дало «timeout=0.0s» (устройство r25)114; подробно — BUG-005.

2.7. Как пользоваться новым API r25, не сломав r24

Объект: новые действия и операции dune_api.php tv188b r25, уровень code; что с наблюдениями — §7.

Идентификаторов новых действий в r24 нет (код r25)71, поэтому плагин для обеих прошивок проверяет их перед использованием (§2.3). Перечень — §4.1; здесь то, что отличает их на практике.

Ленивые ряды. Операция get_folder_rows вызывает $plugin->get_folder_rows(media_url, row_ids), а если метода нет, DunePluginFw бросает Exception «Method not found: get_folder_rows» (код r25)115. В shell_ext/lib r25 AbstractRowsScreen::get_rows по умолчанию бросает исключение (код r25)116. Структуры и RowsFactory — «Экраны и папки плагина».

Действия из манифеста и из PHP. Для cond, load_and_scale_image, apply_hash_dirties и update_special_favorite_folder в libduneshell.so r25 есть конструкторы из XML, а create_fs_ctl_action_from_xml() пишет «not implemented» (код r25)117. Встроенный downloads r25 задаёт is_shown_action точки входа как cond с is_plugin_file(dunemdb_supplier_online_movies/__v2) (код r25)118.

Загрузки. Флаг downloads появился в r25 (код r25)119, и код r25 убирает его при /tmp/flm.txt (код r25)120. Ключ описателя dl_capable работает только при этом флаге (код r25)121; подробно — «Загрузки и TorrServer для плагина».

EPG и картинки. Экран программы ext_epg r25 выводит новые относительно r24 метки kinopoisk_rating и producer (код r25)122, в базовом скине появился special_icons/kp.png (код r25)123. В libduneshell.so r25 есть декодер WebP (код r25)124.

2.8. Как перенести плагин с r22

Объект: сравнение tv188b 250815_1012_r22, tv175u 240619_0210_r22 и r24, уровень code.

Плагин под r22 проходит два шага: сначала различия r22 → r24, затем всё из этой главы. Сводка — «Различия по версиям и платформам».

  • В dune_api.php r22 нет ряда классов и констант r24: ChooseFileActionData, PluginStreamInfo, StreamMarker, GUI_EVENT_CONFIRM_UPDATE, GUI_EVENT_NETWORK_CHANGE и др. (код r22, r24)125; r22 не обрабатывает get_vod_stream_info (код r22, r24)126.
  • Файлы dunelib/config_utils, dune_languages, expr, utils в r22 отсутствуют, а bootstrap.php, dune_config.php, dune_plugin.php и dunelib/dune_countries.php с r24 одинаковы (код r22, r24)127.
  • libphp5.so r22 и r24 — разные файлы (код r22, r24, r25)19, при этом строка PHP/5.3.6 в них та же (код r22, r24, r25)5.
  • Встроенный youtube r22 регистрировался сам через bin/register_supplier.sh (код r22)128; контракт потоковых команд поставщика в r22 тот же, что в r24 (код r22)129.

Ниже r22 и Sigma — короткая справка: версии по SDK в «Различия по версиям и платформам», а ProIPTV при rev_number ≤ 21 показывает диалог err_too_old_player (код)130.

2.9. Как HD::http_get_document проверяет TLS: CURLOPT_SSL_VERIFYPEER, CURLOPT_CAINFO

Объект: HD::http_get_document на tv188b r25 и r24, HD::http_server_responding на r25, уровень code; запросы на устройстве — tv188b r25.

Раздел нужен, чтобы понять, почему плагин на хелпере прошивки может не увидеть ошибку из §2.1, строка 12, и что меняется, когда он включает проверку. В r25 HD::http_get_document() и HD::http_server_responding() по умолчанию ставят CURLOPT_SSL_VERIFYPEER=false (код r25)10; HD::http_get_document r24 делает то же (код r24)131, см. BUG-003. Разницу видно на www.ssl.com: на tv188b r25 из php_server он даёт errno 60 при включённой проверке и HTTP 200 без неё (устройство r25)132.

Включить проверку может вызывающий: при истинном CURLOPT_SSL_VERIFYPEER в $opts и URL на https:// хелпер r25 добавляет CURLOPT_CAINFO=/firmware/certs/ca-bundle.crt, а CURLOPT_CAINFO из $opts при этом перезаписывается (код r25)11. Подстановку этого файла делает и r24 (код r24)133. Через этот хелпер на r25 проверка идёт по бандлу прошивки (код r25)11: у него один SHA-256 в пяти сборках (код r22, r24, r25)6, а его сроки и отказы описаны в BUG-001.

3. Что не изменилось, хотя можно опасаться

Объект: tv188b r24 и r25, частично все пять разобранных сборок (tv188b r22, r24, r25, tv175u r24, APK r24).

Эти проверки при переходе можно не считать первоочередными: claims показывают совпадение. Совпадение файла или строк — это code, а не проверка поведения. Полная матрица — «Матрица совместимости возможностей плагина».

Чего опасаются Что показывают claims Уровень Claim
Другая версия PHP строка PHP/5.3.6 в пяти сборках, на r25 PHP_VERSION = 5.3.6 code, device (устройство r25, код r22, r24, r25)134
Пропадут расширения PHP имена JSON, cURL, mbstring, iconv, PCRE, OpenSSL, pcntl, posix, sockets, XML и классов SQLite3, ZipArchive, SoapClient есть в пяти сборках code (код r22, r24, r25)135
Другие curl и OpenSSL OpenSSL 1.0.1u в пяти сборках, libcurl/7.67.0 в tv188b r22, r24, r25 и tv175u r24; наборы curl_multi_* (12) и CURLOPT_* (111) совпадают в пяти сборках code (код r22, r24, r25)136
Обновится или сломается CA-бандл SHA-256 тот же в пяти сборках, данные Mozilla от 11 октября 2022 года; это и плюс, и проблема: см. BUG-001 code (код r22, r24, r25)137
Сменятся FS_PREFIX и признаки оболочки FS_PREFIX=/data/data/com.dunehd.app, HD_APK=1, HD_FW_APK=1, HD_HTTP_LOCAL_PORT=80 у демонов обеих версий device (устройство)138
Сменится uid php_server r24: php_server работает от пользователя system, UID пакета приложения 1000; r25: uid 1000 device (устройство)139
CGI потеряет root на r25 CGI работает под uid 0 и u:r:shell:s0; на r24 снят только httpd с теми же uid и меткой, а не сам CGI device (устройство)140
Сменится dunehd_service клиент, сервисный ELF, обёртка и .env с одним SHA-256 в r22, r24, r25 code (код r22, r24, r25)141
Сменится протокол IP Control те же 16 имён параметров cmd=status, protocol_version=6 на r24 и r25 device (устройство r24, r25)62
Сменятся старые операции плагина DunePluginFw r25 зовёт базовые get_folder_view, get_vod_info и др., если ветвь _v2 не выбрана; DunePlugin объявляет те же 11 основных операций, что реализует demo2. Это код, а не проверка демо на устройстве code (код r25)142
Не загрузится плагин на DunePluginFw зонд с наследником DunePluginFw на r25 загружается и получает операции device (устройство r25)143
Другая регистрация поставщика movie_suppliers_update.sh с парами аргументов в коде r24 и на устройстве r25 code, device (устройство r25, код r24)144
Другие ключи запуска приложений LaunchExtAppActionData с тем же набором из 8 ключей; android_apps/model.php r24 в части запуска как в r25; dune.apk tv188b r24 и r25 с sharedUserId=android.uid.system code (код)145
Другие субтитры subtitles.php r24 и r25 одного размера и SHA256 code (код r24, r25)146
Пропадут ресурсы оболочки шрифты, экранные клавиатуры и альтернативные скины совпадают; базовый скин — кроме нового kp.png code (код r25)147
Другая база Android та же база Android 11 RD2A.211001.002 code (код r25)26
Другой файл gcomp_list.php побайтно как в r24 code (код r25)148
Другой конфиг поставщиков movies/suppliers_config.php и movies/movie_services_config.php побайтно как в r24 code (код r25)149
Сетевые скрипты init_network.sh, init_torrents.sh, udhcpc_callback.sh, smb.bash побайтно те же code (код r24, r25)150
Другой файл типа платформы firmware/config/fw_apk_platform.txt с s928x_android11 и одним sha256 в образах r24 и r25 code (код r24, r25)66
Другие ffmpeg.sh и firmware/bin/ffmpeg system/system/dunehd/firmware/scripts/ffmpeg.sh (457 байт) с одним sha256 в образах r24 и r25; system/system/dunehd/firmware/bin/ffmpeg в обоих — симлинк на libxxx_ffmpeg.so. Это скрипт и ссылка, а не сам ffmpeg: §6, §7 code (код r24, r25)151
Другая проверка TLS в HD::http_get_document CURLOPT_SSL_VERIFYPEER=false по умолчанию и CURLOPT_CAINFO с бандлом прошивки при включённой проверке для https:// в r24 и r25: §2.9 code (код)152

4. Справочник

4.1. dune_api.php: что добавлено в r25

Объект: dune_api.php tv188b 261021_0117_r25 против 260827_0003_r24, уровень code. Что делают действия на устройстве, см. §7.

Имя Назначение Поля и значения Где работает Claim
COND_ACTION_ID = cond, CondActionData действие с условием pattern; смысл результата — §7 pattern, post_action tv188b r25, code; есть конструктор из XML (код r25)153
FS_CTL_ACTION_ID = fs_ctl, FsCtlActionData, FsCmdDef, FsCmdKind файловые команды cmd, output_path, post_action; FsCmdKind: resolve_url, stat, scandir, get_file tv188b r25, code; конструктор из XML «not implemented» (код r25)154
FsResolveUrlDef, FsStatDef, FsScandirDef, FsGetFileDef параметры команд fs_ctl url, try_mount_if_needed; path; path, with_stat, max_items_count; path, target_path, skip, max_size, chunk_size tv188b r25, code (код r25)155
LOAD_AND_SCALE_IMAGE_ACTION_ID, LoadAndScaleImageActionData загрузка и масштабирование картинки icon_url, local_path, scale_if_needed, icon_width, icon_height, post_action tv188b r25, code (код r25)156
UPDATE_SPECIAL_FAVORITE_FOLDER_ACTION_ID, UpdateSpecialFavoriteFolderActionData действие со спецпапкой избранного name, delete, skip_interactions, post_action tv188b r25, code (код r25)156
APPLY_HASH_DIRTIES_ACTION_ID, ApplyHashDirtiesActionData действие apply_hash_dirties; назначение — §7 post_action tv188b r25, code (код r25)156
PLUGIN_OP_GET_FOLDER_ROWS, PLUGIN_OUT_DATA_PLUGIN_FOLDER_ROWS операция ленивой подгрузки строк PluginFolderRowsInputData {media_url, row_ids}, PluginFolderRows {rows} tv188b r25, code (код r25)157
PLUGIN_ROW_TYPE_DUP, PLUGIN_ROW_OPT_LOADING, PLUGIN_ROW_OPT_OPTIMIZE_INVISIBLE, GCOMP_OPT_STUB типы и опции строк и компонентов row_dup, 0x4, 0x8, 0x400000 tv188b r25, code (код r25)158
PluginRowsPane::row_dup_map, PluginFolderView::type_mask новые поля карта строк; int tv188b r25, code (код r25)159
FileChooserUiParams::{with_network_folders, with_network_browser, new_folder_default_name} новые поля выбора файла bool, bool, строка tv188b r25, code (код r25)160
PluginSystemActionData::handle_response новое поле действия bool tv188b r25, code (код r25)161

4.2. dunelib: что добавлено и убрано в r25

Объект: firmware_ext/php/include/dunelib/ tv188b r25, уровень code.

Имя Что Claim
dunelib/installed_plugins.php, InstalledPlugins новый класс: читает /tmp/run/installed_plugins.xml, перечитывает при смене mtime; get_by_name, reload, ensure_loaded (код r25)162
HD::ensure_empty_file, HD::log_elapsed, HD::read_int, HD::read_string новые статические методы (код r25)163
dunelib/dl_state.php, DlState команды менеджеру загрузок файлами в /tmp/run/dl_input/ (код r25)164
ConfigUtils::load_firmware_features убирает downloads при /tmp/flm.txt (код r25)120
HD::http_get_document изменён формат лога: §4.5 (код r25)165
HD::make_json_rpc_request убран, прямой вызов на tv188b r25 в запросе 11 — E_ERROR: §2.4 (устройство r25, код r25)166

4.3. Флаги firmware_features по прошивкам

Объект: firmware_features.txt tv188b r22, r24, r25.

Флаг r22 → r24 r24 → r25 Claim
dunemdb_supplier_plugin_api_v7, sup_api_v8, movie_suppliers_order, lcfg_v2, light_stop добавлены в r24 на r25 (device) есть (устройство r25, код r24)167
dunemdb_supplier_plugin_api_v2…v6, tmpfs, tv_config, newgui2021, app_root_url_type, url_sdcard, apk, fw_apk, drm_apps есть в r24 на r25 (device) есть (устройство r25, код r24)168
movie_suppliers_update есть в r24 на r25 (device) есть (устройство r25, код r24)169
downloads — новый в r25; убирается при /tmp/flm.txt, файла на устройстве нет (устройство r25, код r25)170

4.4. Файлы и бинарники прошивки r25

Объект: дерево файлов tv188b r25 против r24, уровень code.

Что Изменение Claim
Встроенные плагины к 13 плагинам r24 добавлены downloads и s928x_dvfel (код r25)171
libxxx_dl_manager.so, libxxx_lcconv.so, libxxx_vsftpd.so новые исполняемые файлы (код r25)172
libphp5.so другой файл, чем в r24 (код r22, r24, r25)19
libduneshell.so другой SHA-256 (код r24, r25)20
libvlc.so, libxxx_dune_mediainfo.so другой SHA256 (код r24, r25)21
add_atv_route.sh, usbnet_nat_fast_repair.sh, usbnet_nat_full_repair.sh новые скрипты (код r25)173
Манифест bluray без global_actions, bin/start.sh и bin/stop.sh удалены (код r25)174
Экран audio в menu_config.xml нет настроек native_sample_rate, start_silence_for_audio_files, disable_usb_audio; есть кнопка button_additional_audio_settings (код r25)175
Экран ftp_server в menu_config.xml настройки ftp_server_enabled, ftp_server_anonymous_access, ftp_server_user_name, ftp_server_password (код r25)176

4.5. Сообщения журналов, сменившие формат в r25

Объект: строки libduneshell.so, php_server и dunelib/utils.php tv188b r25 против r24, уровень code. Нужно тем, кто разбирает логи скриптом.

Журнал r24 r25 Claim
HD::http_get_document «HTTP fetching», «HTTP POST fields» « http <метод>: », « http DATA: …», ошибки в нижнем регистре (код r25)165
Запрос исполнителя операций req %lld (%s->%s/%s) req %lld/%s->%s(%s.%s) (код r25)177
start, cancelling by timeout (%s) (%s.%s) (код r25)178
canceled, finished with status (%s) (%s.%s) (код r25)179
result action, result action null, result status (%s) (%s.%s) (код r25)180
plugin_opexec «still working...» «plugin_opexec D: %s: %s», плюс «plugin_opexec I: waiting for mc index validation», «plugin_opexec I: mc index now valid»; в логе r25 при PLUGIN_OPEXEC = 1 строка выглядит как «plugin_opexec D: req 93/…: still working...» (устройство r25, код r25)181
Форк автопроверки обновлений «fork(grand-child)», «grand-child process is started with pid %d» «grand-child process %d», «hd_debug: plugin online upgrade forked with the log held» (код r25)182
/tmp/run/<плагин>.pid файл есть на устройстве путь /tmp/run/%s.pid есть в строках самого php_server, в строках r24 его нет (устройство r24, код r25)183

4.6. Что SDK просит от плагинов на Android 11+ AOSP и ATV: dune_devel_info

Объект: раздел «Important notes» страницы SDK dune_devel_info (doc) и что об этом известно на tv188b r24, r25 и APK r24.

Claims этой страницы не привязаны к r24 или r25: столбец «Что просит SDK» — это просьба документа, а не факт r25. Столбец «Что на r24+» показывает подтверждения кодом и устройством. Где их нет, стоит «по SDK, на r24+ не подтверждено». Значения на tv188b названы для указанного процесса: на другой процесс они не переносятся.

Что Что просит SDK Что на r24+ Claim
Пути /config, /tmp, /flashdata, /firmware, /firmware_ext на ATV и Android 11+ AOSP добавлять префикс FS_PREFIX /data/data/com.dunehd.app; в других разделах документации он может быть опущен — тогда его добавляют сами tv188b r25, PHP: /config и /flashdata ведут в $FS_PREFIX, /firmware и /firmware_ext/php — в /system/dunehd/; в корне ФС из adb shell /firmware, /firmware_ext, /flashdata нет, а /config другой. Подробно — php-environment.md (устройство r25, SDK)184
FS_PREFIX в PHP-плагинах и CGI /data/data/com.dunehd.app на ATV и Android 11+ AOSP, на остальных не установлена tv188b r25: то же в командах из php_server и у httpd; tv188b r24: то же у dunehd_service, код init её выставляет (устройство, код r24, SDK)185
HD_APK в PHP-плагинах и CGI 1 на ATV и Android 11+ AOSP, на остальных не установлена tv188b r25: 1 у php_server; tv188b r24: 1 у dunehd_service; APK r24: runDaemonProcess задаёт 1 (устройство, код r24, SDK)186
HD_FW_APK в PHP-плагинах и CGI 1 на Android 11+ AOSP, на остальных не установлена tv188b r25: 1 у php_server; tv188b r24: 1 у dunehd_service; APK r24: среди строк runDaemonProcess её нет (устройство, код r24, SDK)187
HD_HTTP_LOCAL_PORT в PHP-плагинах и CGI 11080 на ATV; на остальных пусто (старые прошивки) или 80 (новые) tv188b r25: 80 у php_server; tv188b r24: 80 у dunehd_service; APK r24: runDaemonProcess задаёт 11080 (устройство, код r24, SDK)188
Подстановка в PHP движок сам добавляет FS_PREFIX ко всем нужным путям, кроме команд в shell_exec() и system(), поэтому старый код может работать без изменений файловые функции — первая строка таблицы; shell_exec на tv188b r25 подставляет частично: §6 и §2.1, строка 10; system() — §7. Убранное API r25 правок всё равно требует: §2.4 (устройство r25, SDK)189
/tmp на Android 11+ AOSP доступен и как $FS_PREFIX/tmp, и как /tmp tv188b r25: tmp_dir_path у пробного kb_probe5 — $FS_PREFIX/tmp/plugins/kb_probe5; при LOG_DIR=/tmp/run лог php_server идёт в $FS_PREFIX/tmp/run/; вне PHP — §7 (устройство r25, SDK)190
Имя процесса GUI на последних ATV и Android 11+ AOSP com.dunehd.app, а не com.dunehd.shell tv188b r24: процесс com.dunehd.app; tv188b r25: php_server — его дочерние процессы; другая страница SDK пишет иначе: §6 (устройство, SDK)191
Shell-скрипты плагина не запускать напрямую, вызывать через sh или bash: bash /path/to/script запрет прямого запуска: по SDK, на r24+ не подтверждено (§7). В этих местах прошивка зовёт через sh: tv188b r25 исполняет global_action plugin_system с run_string как system(sh <путь>); код r24 запускает CGI плагина как shell-скрипт; код APK r24 начинает с sh команду с путём под корнем, кроме /firmware/bin/ и /firmware_ext/php/ (устройство r25, код r24, SDK)192
Бинарники в пакете плагина плагин не может содержать бинарные исполняемые файлы; если такой файл нужен, просят Dune HD рассмотреть его включение в следующее обновление ПО по SDK, на r24+ не подтверждено (§7); практика иная: §6 (SDK)14

5. Как это делают плагины

ProIPTV. Сравнивает ревизию числом и отсекает rev_number ≤ 21 (код)193, а отдельные возможности проверяет по константам и классам (код)9. На r25 берёт системный ffmpeg при наличии, иначе свою сборку (код)194. Вне APK читает android_platform из versions.txt (код)195; признак APK у него — HD_APK (код)196, а она у php_server на tv188b r25 равна 1 (устройство r25)197, и ключа android_platform в файле r25 нет (устройство r25)8 (§2.1, строка 9). Оговорка: при истинном is_apk() и пустом static-кэше get_platform_info() идёт первой ветвью — platform='android', type = fw_apk при is_fw_apk(), иначе apk, и versions.txt эта ветвь не читает (код)198. Эталонные копии php_r22/ и php_r24/ совпадают с файлами соответствующих прошивок (код)199.

GlobalTV 260130_1351. Несёт копию lib, часть файлов которой побайтно совпадает с shell_ext/lib r24 (код r24)200. Поля stop_playback/retry_delay_ms в show_error и max_height в show_dialog он добавляет только при defined, тогда как r24 пишет их без проверки (код r24)201. Сигнатуры расходятся с r25: get_timer (код r24, r25)23. Приём и его ограничения — «Приёмы разработки плагинов Dune HD».

Dune BackUp. Блок цветных кнопок в меню добавляет только при intval(firmware_version) < 240619 и ещё двух условиях (код)202: в этой проверке нет номера ревизии rN.

Каталог приёмов совместимости — «Приёмы разработки плагинов Dune HD».

6. Расхождения

Тайм-аут операции: код r24 и r25 на устройстве. В коде r24 отмена PHP-операции только ставит флаг (код r24)108, на r25 (device) php_server останавливается (устройство r25)110. Сборки разные; на устройстве r24 это не проверялось, и какой код останавливает процесс, claims не говорят. Подробно — «Операции плагина, тайм-ауты и php_server».

Тайм-аут по умолчанию. SDK: 10 с (SDK)203; r25 (device): handle_user_input без operation_timeout — 60 с (устройство r25)204. Стороны связаны conflicts_with.

operation_timeout в данных действия. SDK: PluginHandleUserInputAction не имеет данных (SDK)205; на r25 (device) ключ operation_timeout в данных действия plugin_handle_user_input работает и перекрывает operation_timeout/default манифеста (устройство r25)114. Стороны связаны conflicts_with.

.platform.* на Android. По тексту SDK .platform.android удаляется, а .platform.87xx переносится в корень (SDK)206; установщик r25 делает наоборот (устройство r25)207. Подробно — «Пакет плагина».

open_path. Описание IP Control предлагает cmd=open_path для запуска пункта по root://… (SDK)208; на r25 точка входа так не запускается (устройство r25)209. Подробно — «IP Control (/cgi-bin/do) для разработчика плагина».

/cgi-bin/do с plugin=. На r25 (device) запрос вернул unknown_command и не запустил run.php плагина (устройство r25)210. Для r24 код предполагает запуск через run.php, но это inference/disputed (§7); стороны связаны conflicts_with.

Перечитывание плагинов по IP Control. Документ SDK предлагает перечитывать плагины без перезапуска оболочки; на r25 (device) после adb push этого не произошло (устройство r25)211. Утверждение документа — disputed, оно в §7; стороны связаны conflicts_with.

Путь adb push. SDK указывает /flashdata/plugins/ (SDK)212; на r25 такого каталога в корне ФС нет (устройство r25)213. Подробно — BUG-010.

playback_going_to_switch и buffering_ms. SDK и r25 расходятся: (SDK)214 ↔ (устройство r25, SDK)215 ↔ (устройство r25)216. Подробно — «Воспроизведение из плагина».

Клавиши в VOD. SDK: PluginVodInfo::actions поддерживает из клавиш только цветные; на r25 (device) доставляются и нецветные (устройство r25)217. Утверждение SDK — disputed, оно в §7; стороны связаны conflicts_with.

ffmpeg в r25: комментарий плагина и устройство. Комментарий в ProIPTV говорит, что r25 и новее несут свой ffmpeg 7.1 (код)194; на r25 (device) media_check вызывает /firmware/scripts/ffmpeg.sh, и файла по этому пути нет (устройство r25)218. При этом в образах r24 и r25 скрипт system/system/dunehd/firmware/scripts/ffmpeg.sh один и тот же (код r24, r25)219, а system/system/dunehd/firmware/bin/ffmpeg в обоих — симлинк на libxxx_ffmpeg.so (код r24, r25)220; в корне ФС на r25 /firmware нет (устройство r25)221. Сами эти файлы r25 от r24 не отличают. Версию показал прогон запроса 11 на tv188b r25: из adb shell прямой запуск $P/firmware/bin/ffmpeg -version с LD_LIBRARY_PATH=$P/lib:/system/dunehd/firmware/lib вывел ffmpeg version 7.1.3, и этот ffmpeg — ссылка на $P/lib/libxxx_ffmpeg.so (устройство r25)222, что сходится с комментарием ProIPTV (код)194. sh $P/firmware/scripts/ffmpeg.sh -version из adb shell в том же прогоне напечатал ffmpeg not found (устройство r25)223; переменная FS_PREFIX в этот запуск не передавалась, так что это свойство окружения adb, а не вывод об отсутствии бинарника (устройство r25)223. Связи conflicts_with нет, стороны связаны related; что осталось открытым — §7.

versions.txt. Код r24 и r25 читает android_platform (код)224, в файле r25 его нет (устройство r25)8. При fw_apk значение берётся из fw_apk_platform.txt, поэтому это не противоречие, а у tv175u r24 ключ в файл пишет init (код r24)225; связи conflicts_with нет.

Имя процесса GUI: две страницы SDK. dune_devel_info: на последних ATV и Android 11+ AOSP процесс главного GUI называется com.dunehd.app, а не com.dunehd.shell (SDK)226. Страница плагинов: перезапуск оболочки на Android — killall com.dunehd.shell (SDK)227. Стороны связаны conflicts_with. На tv188b r24 процесс называется com.dunehd.app (устройство r24)228, а com.dunehd.shell в dune.apk tv188b r24 и r25 — пакет класса активности com.dunehd.shell.MainActivity (код r24, r25)229. Сам killall на r25 не проверялся (SDK)227; плагины заново регистрирует новый процесс после am force-stop com.dunehd.app (устройство r25)230.

Подстановка FS_PREFIX в shell_exec: SDK и r25. По SDK движок добавляет префикс ко всем нужным путям, кроме команд в shell_exec() и system() (SDK)231. На tv188b r25 (device) shell_exec добавляет его к /tmp/…, /firmware/…, /config/…, /flashdata/… и к пути в одинарных кавычках, но не к пути в двойных (устройство r25)40; в коде APK r24 подстановку вызывают, в частности, php_exec и zif_shell_exec (код r24)232. Связи conflicts_with нет, стороны связаны related.

Бинарники в плагине: SDK и код. По SDK плагин не может содержать бинарные исполняемые файлы (SDK)14. На r25 и новее ProIPTV берёт системный $FS_PREFIX/firmware/bin/ffmpeg при наличии, иначе — свою сборку bin/ffmpeg-7.1.3 (код)194, а встроенный shell_ext r24 несёт собственные ELF curl и php-cgi (код r24)233. Запускается ли такой файл у стороннего плагина на r24+, — §7. Связи conflicts_with нет.

curl к localhost: код r25 и устройство. В запросе 11 на tv188b r25 (один прогон, php_server) один и тот же http://localhost/cgi-bin/plugins/kb_probe11/host.sh пришёл в CGI с HTTP_HOST=127.0.0.1 при curl_setopt(CURLOPT_URL) (устройство r25)100 и с HTTP_HOST=localhost при curl_init($url) (устройство r25)101; по коду r25 у этих двух точек входа разный маршрут URL (код r25)99. Наблюдение запроса 6 с HTTP_HOST=localhost сделано тоже через curl_init($u) (устройство r25, код r25)234. file_get_contents из php_server к такому URL пришёл с HTTP_HOST=127.0.0.1, и тот же claim заключает, что в curl замены нет; curl в этом зонде — curl_init($u) (устройство r25)235, тогда как curl_setopt в запросе 11 дал 127.0.0.1 (устройство r25)100. Стороны связаны related (разный способ задать URL), conflicts_with нет: вывод «не в curl» верен только для curl_init(url). Согласуется ли это наблюдение с кодовой подстановкой порта по §2.5 (устройство r25, код r25)236, — вопрос §7.

7. Не проверено

Выводы inference и утверждения со статусом disputed: гипотезы, а не поведение. В тексте выше на них нет опоры.

Что Статус Claim Как проверить
lcreg подменяет хосты Dune HD их парой r2.<хост>; перечень пар есть в строках libxxx_movie_indexer.so (код r25)237 inference (вывод r25)238 прочитать lcreg.txt на устройстве и лог с lcreg_kind
Действие fs_ctl нельзя задать в XML, только в JSON-ответе PHP-плагина inference (вывод r25)239 объявить fs_ctl в манифесте и посмотреть лог оболочки
PluginSystemActionData::handle_response=yes проверяет restart_needed_flag и перезапускает GUI inference (вывод r25)240 плагин с handle_response yes, создающий этот флаг
smart_dirty=yes переводит обновление EPF плагина на флаги inference (вывод r25)241 лог оболочки при разных масках и сторонний EPF-плагин
cond вычисляет булев pattern как условие видимости точки входа inference (вывод r25)242 по нативному коду: is_plugin_file, результат cond, ошибки pattern
PLUGIN_ROW_OPT_LOADING помечает строку для подгрузки через get_folder_rows inference (вывод r25)243 листинги rows_loader: выбор строк, батчи, повторы
Копии php_r22/, php_r24/ ProIPTV — эталоны для отладки, на устройстве плагин работает с фреймворком прошивки inference (вывод)244 сверить содержимое пакета плагина
Прошивка r24 трактует false из confirm_update как отказ от обновления inference (вывод)245 зонд на r24
apply_hash_dirties заставляет оболочку обработать записи HashDirties inference (вывод r25)246 нативный обработчик: результат, ошибки post_action
Заголовки потока задаются и из ответа get_vod_stream_url с суффиксом \|\|\|dune_params\|\|\|engine:1,http_headers:…. Верификатор подтвердил вывод; наблюдение на tv188b r25 (запрос 11, один прогон): ответ с engine:1,http_headers:X-KB477%3A%20one для kbplazy://0 без суффикса дал запрос ExoPlayer с заголовком X-KB477: one (устройство r25)247 inference, verified; наблюдение — device (устройство r25, вывод r25)248 повтор с другими сериями и playback_url_is_stream_url=false; r24
cmd «/system/dunehd/dunehd_service do am start …» уходит в системный am от root, где есть --user inference, disputed (вывод r24, r25)249 запустить такую cmd через launch_ext_app, смотреть activity и «run command» в логе
Команду /cgi-bin/do, адресованную плагину, r24 исполняет через run.php inference, disputed (вывод r24)250 зонд на r24 по образцу r25 (устройство r25)210
По SDK PluginVodInfo::actions в VOD поддерживает из клавиш только цветные; на r25 доходят и другие (устройство r25)217 disputed (SDK)251 см. «Ввод и диалоги»
Плагины перечитываются без перезапуска оболочки по IP Control; на r25 после adb push этого не произошло (устройство r25)211 disputed (SDK)252 см. «Пакет плагина»
Окружение php_server на tv188b r24 отдельно не снято: наличие у него FS_PREFIX, HD_APK, HD_FW_APK не установлено inference (вывод r24)253 прочитать /proc/<pid>/environ процессов php_server на r24
В APK r24 подстановке FS_PREFIX в командах подвержены exec, system и passthru (через php_exec), shell_exec, popen и proc_open inference (вывод r24)254 putenv("PHP_DEBUG=1"), вызвать exec, system, popen; в stdout php_server искать «-C-> EEE repl command»
Наблюдение запроса 11 (curl_setopt(CURLOPT_URL) с http://localhost/cgi-bin/plugins/…, HD_HTTP_LOCAL_PORT=80 → HTTP_HOST=127.0.0.1, REQUEST_URI сохранён) согласуется с заменой префикса localhost по коду r25 (§2.5); порт в ответе CGI не виден (SERVER_PORT пуст), поэтому подстановку именно порта оно не подтверждает inference (вывод r25)255 putenv("PHP_DEBUG=1") и печать исходного и нового URL; вход 127.0.0.1 без порта, процесс без HD_HTTP_LOCAL_PORT, порт не 80: снять порт, на который ушёл запрос

В базе нет данных о следующем, и эти места в главе не опираются ни на какие наблюдения:

  • поведение сторонних плагинов на других устройствах и других сборках r25, включая APK-оболочку r25;
  • работа нового API §4.1 из стороннего плагина на устройстве;
  • какое сообщение видно на экране при вызове убранного HD::make_json_rpc_request (§2.4);
  • что будет при прямом запуске shell-скрипта и бинарника из пакета стороннего плагина на r24+ (§4.6, §6) и как на r25 ведёт себя команда в system();
  • совпадают ли /tmp и $FS_PREFIX/tmp вне PHP на r24+ (§4.6);
  • работает ли $FS_PREFIX/firmware/scripts/ffmpeg.sh с заданным FS_PREFIX и $FS_PREFIX/firmware/bin/ffmpeg при вызове из php_server (версия 7.1.3 снята только прямым запуском из adb shell, §6); ffmpeg на r24;
  • HTTP_HOST при curl_setopt(CURLOPT_URL) и curl_init($url) из php-cgi в CGI плагина; порт, на который уходит запрос (§2.5);
  • что возвращает ConfigUtils::load_product_and_fw() на устройстве и есть ли android_platform в versions.txt tv188b r24 (§2.3);
  • что с CURLOPT_CAINFO в HD::http_server_responding и перезаписывает ли HD::http_get_document r24 переданный CURLOPT_CAINFO (§2.9);
  • наблюдения на устройстве с r22;
  • большинство сравнений device r24 ↔ r25: снимки r24 не содержат зондов плагина.

  1. fw-tv188b-261021-0117-r25.c313 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 php_server при старте пишет в /tmp/run/<плагин>.log по порядку: «[server] preparing...», «reader fd: N; writer fd: M», «resetting include path to …», загрузку bootstrap.php, dune_api.php, dune_plugin.php, dune_plugin_fw.php, «executing system properties cmd (number of properties: 7)...», загрузку dune_config.php, затем программы плагина, после чего «[server] ready.» и «[server] main loop started.»; get_included_files() из main.php даёт тот же порядок файлов. ↩↩

  2. fw-tv188b-261021-0117-r25.c022 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В dunelib/utils.php r25 нет метода HD::make_json_rpc_request: между encode_props и get_mac_addr, где он стоял в r24, его нет ↩

  3. fw-tv188b-261021-0117-r25--php-framework.c059 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 после include dunelib/utils.php зонд увидел класс HD и method_exists(HD,make_json_rpc_request)=false; прямой вызов завершился E_ERROR Call to undefined method HD::make_json_rpc_request(), а не JSON-ответом. ↩↩↩

  4. fw-tv188b-261021-0117-r25.c015 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 класс SyncMyCollectionActionData содержит только post_action: ключ mcf_id убран из dune_api.php, а ActionFactory::sync_my_collection в shell_ext/lib принимает только $post_action ↩

  5. fw-tv188b-261021-0117-r25--libphp5.c001 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствует строка PHP/5.3.6. ↩↩

  6. fw-tv188b-261021-0117-r25--libphp5.c036 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · CA-бандлы всех пяти исследованных сборок совпадают по SHA-256 722be2869ed2c2a949e5edb75b030f1e737e869ca8e8f70bc8d876dd93227ead. ↩↩

    • fw-tv188b-261021-0117-r25--libphp5--curl-http.c004 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 _php_do_add_fs_prefix_to_http вызывает lcreg при отсутствии HD_HTTP_LOCAL_PORT либо для http:// URL, не попавшего под CGI-подстановку; при заданной HD_HTTP_LOCAL_PORT URL без префикса http:// выходит до lcreg.
    • fw-tv188b-261021-0117-r25--libphp5--curl-http.c021 · code · android-dune-fw; прошивка 260827_0003_r24 · В r24 _php_add_fs_prefix_to_http не вызывает lcreg и других функций замены хоста; при отсутствии HD_HTTP_LOCAL_PORT или несовпадении префикса URL не меняется, а печать исходного и нового URL ограждена getenv("PHP_DEBUG").

    ↩↩

  7. fw-tv188b-261021-0117-r25.c122 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 /tmp/run/versions.txt (145 байт, system:system) — шесть строк key=value: api_version=1.1.0, firmware_version=261021_0117_r25, product=tv188b, platform_kind=android, app_version=1.0.1-13-261021_0117_r25, app_version_code=13; ключа android_platform нет. ↩↩↩↩↩↩

  8. plg-gh-kocourkuba-proiptv.c030 · code · unknown; прошивка — · Возможности фреймворка плагин проверяет по наличию констант и классов dune_api.php: is_choose_file_supported() — defined('ChooseFileActionData::filter'), is_rows_api_supported() — class_exists('PluginRowsFolderView'), is_delay_load_supported() — defined('PluginUpdateTvInfoActionData::channel_changes'), is_ext_epg_enabled() — defined('PluginUpdateEpgActionData::ext_epg_enabled'); is_ext_epg_supported() дополнительно требует файл $FS_PREFIX/firmware_ext/plugins/ext_epg/dune_plugin.xml. ↩↩↩

  9. fw-tv188b-261021-0117-r25.c366 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 HD::http_get_document() и HD::http_server_responding() по умолчанию ставят CURLOPT_SSL_VERIFYPEER=false. ↩↩

  10. fw-tv188b-261021-0117-r25.c367 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 HD::http_get_document() добавляет CURLOPT_CAINFO=/firmware/certs/ca-bundle.crt только если в $opts передан истинный CURLOPT_SSL_VERIFYPEER и URL начинается с https://, после чего применяет $opts к хендлу; вызывающий может включить проверку, но CAINFO принудительно становится бандлом прошивки (переданный в $opts CAINFO перезаписывается). ↩↩↩

  11. doc-sdk-dune-devel-info.c001 · doc · any-documented; прошивка — · На ATV и Android 11+ AOSP к путям /config, /tmp, /flashdata, /firmware и /firmware_ext нужно добавлять префикс FS_PREFIX /data/data/com.dunehd.app; в других разделах документации этот префикс может быть опущен, и тогда его добавляют самостоятельно. ↩

  12. doc-sdk-dune-devel-info.c009 · doc · any-documented; прошивка — · Если плагин содержит исполняемые shell-скрипты, их нельзя запускать напрямую: их нужно вызывать через sh или bash (пример «bash /path/to/script»). ↩

  13. doc-sdk-dune-devel-info.c010 · doc · any-documented; прошивка — · Плагин не может содержать бинарные исполняемые файлы; если такой файл нужен, нужно отправить в Dune HD запрос рассмотреть его включение в следующее обновление ПО. ↩↩↩

  14. fw-tv188b-261021-0117-r25.c312 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в коде main.php kb_probe5 get_included_files() показывает системные файлы как '/system/dunehd/firmware_ext/php/<файл>' (bootstrap.php … dune_config.php), а main.php — как '/data/data/com.dunehd.app/flashdata/plugins/kb_probe5/main.php'; FILE — тот же путь main.php. ↩

  15. plg-gh-kocourkuba-proiptv.c023 · code · android-dune-fw; прошивка 260827_0003_r24, 260724_0207_r24 (APK), 261021_0117_r25 · php_r24/dune_api.php, php_r24/dune_plugin_fw.php и php_r24/include/dunelib/{config_utils,utils}.php побайтно совпадают с одноимёнными файлами прошивки tv188b 260827_0003_r24 и APK 260724_0207_r24 (одинаковые sha256 в tree.tsv); с r25 (261021_0117) dune_api.php и dune_plugin_fw.php уже не совпадают. ↩

  16. fw-tv188b-261021-0117-r25.c316 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 include_path в php_server = '.:<каталог плагина>:/data/data/com.dunehd.app/firmware_ext/php/include', каталог плагина — с префиксом $FS_PREFIX: …/flashdata/plugins/kb_probe5 и …/flashdata/plugins/dune-hd.tv у плагинов из flashdata, …/firmware_ext/plugins/shell_ext и …/firmware_ext/plugins/android_apps у встроенных; php_server пишет его в лог «[server] resetting include path to '…'». ↩↩

  17. fw-tv188b-260827-0003-r24--php-framework.c306 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · php_server задаёт include_path по шаблону «ini_set('include_path', '.:%s:%s');»; рядом строка /firmware_ext/php/include ↩

  18. fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c028 · code · android-atv, android-dune-fw; прошивка 260724_0207_r24, 260827_0003_r24, 240619_0210_r22, 250815_1012_r22, 261021_0117_r25 · libphp5.so APK 260724_0207_r24 совпадает по sha256 (e28ffc74…) с libphp5.so прошивок tv175u 260724_0207_r24 и tv188b 260827_0003_r24; в tv175u 240619_0210_r22 и tv188b 250815_1012_r22 файл другой (e7d22b70…), в tv188b 261021_0117_r25 — тоже (4a31ef48…) ↩↩↩

  19. fw-tv188b-261021-0117-r25--shell-ext--epf-dirty--native.c001 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 261021_0117_r25 · libduneshell.so в tv188b r24 и r25 имеет разные SHA-256. ↩↩

  20. fw-tv188b-261021-0117-r25--media-player.c039 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 261021_0117_r25 · libxxx_dune_mediainfo.so и libvlc.so в tv188b r25 отличаются по SHA256 от одноимённых ELF r24. ↩↩

  21. plg-dc-globaltv--lib.c002 · code · android-dune-fw; прошивка 260827_0003_r24 · В копиях lib Global TV 260130_1351 и shell_ext/lib tv188b r24 побайтово тождественна группа интерфейсов экранов: controls_screen.php, gcomps_screen.php, rows_screen.php. ↩

  22. plg-dc-globaltv--lib.c069 · code · android-dune-fw; прошивка 260827_0003_r24, 261021_0117_r25 · Интерфейсы GCompsScreen/RowsScreen в плагине и r24 объявляют get_timer(MediaURL $media_url, &$plugin_cookies), а в r25 get_timer принимает только нетипизированный media_url. ↩↩

  23. fw-tv188b-261021-0117-r25.c098 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 /fconfig/mname.txt содержит «Pro 8K Plus». ↩

  24. doc-dune-fw-changelog.c012 · doc · android; прошивка 261021_0117_r25 · В alpha-версии r25 (261021_0117_r25) в EPG GUI TV-плагинов добавлены дополнительные сведения о рейтинге и продюсерах, если они доступны. ↩

  25. fw-tv188b-261021-0117-r25.c004 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Система r25 — та же база Android 11 (RD2A.211001.002), userdebug/test-keys, плата tyson; сборка от 2026-10-20 ↩↩

  26. doc-dune-fw-changelog.c003 · doc · tv188a, tv188b, tv288b, tv388a, tv689a, tv788a, tv688a, tv989a, android; прошивка 261021_0117_r25 · В разделе r25 страницы alpha перечислены восемь 8K-моделей — tv188a, tv188b, tv288b, tv388a, tv689a, tv788a, tv688a, tv989a — и раздел «Changes since r24». ↩

  27. doc-dune-fw-changelog.c004 · doc · tv989a, android; прошивка 260814_0922_r25, 260912_0002_r25 · У Ultra 8K (tv989a) две версии r25: 260814_0922_r25 — первая официальная, 260912_0002_r25 — первая доступная через онлайн-обновление и последняя стабильная. ↩

    • fw-tv188b-260827-0003-r24.c054 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 три процесса php_server (shell_ext, dune-hd.tv, android_apps) работают от пользователя system с SELinux-меткой u:r:system_app:s0; их родитель — com.dunehd.app (PPID 25631), а UID пакета приложения — 1000 (sharedUser android.uid.system/1000).
    • fw-tv188b-260827-0003-r24.c063 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в окружении dunehd_service (pid 587) есть FS_PREFIX=/data/data/com.dunehd.app, HD_APK=1, HD_FW_APK=1, HD_HTTP_LOCAL_PORT=80 и DUNEHD_SERVICE_DONT_FORK=1, а PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin.
    • fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c029 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в /tmp/run лежат .log и .pid плагинов с работающим php_server (android_apps, dune-hd.tv, shell_ext); .pid датированы 15:40, логи — 15:40–15:41
    • fw-tv188b-260827-0003-r24--http-api--ext-command-params.c061 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 cmd=status отвечает XML command_result с protocol_version=6 — на единицу больше последней версии, описанной в документе IP Control (5)

    ↩

  28. fw-tv188b-261021-0117-r25.c329 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 php_server при старте пишет «Starting logging to '/data/data/com.dunehd.app/tmp/run/<плагин>.log' (<= 3072000)»; в окружении php_server LOG_DIR=/tmp/run и LOG_MAX_FILE_SIZE=3072000. ↩

    • fw-tv188b-261021-0117-r25.c203 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 каталоги плагинов, положенные adb push в /data/data/com.dunehd.app/flashdata/plugins, не подхватились перечитыванием по IP Control (cmd=main_screen, затем cmd=ir_code&ir_code=B24DBF00; обе команды ответили command_status ok): в shell.log после них нет ни строк kb_probe5, ни «Loading plugins from», ни populate_plugins, а kb_probe5 нет в /tmp/run/installed_plugins.xml. kb_probe5 и kb_probe5_sup зарегистрировались после am force-stop com.dunehd.app.
    • fw-tv188b-261021-0117-r25.c207 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в корне ФС каталога /flashdata нет, а оболочка в shell.log называет каталог плагинов /flashdata/plugins («Loading plugins from '/flashdata/plugins'», «invalid plugin manifest from '/flashdata/plugins/kb_probe5_badname/dune_plugin.xml'», «copying recursively '/tmp/plugin_tmp' to '/flashdata/plugins/kb_probe5_plat'»); файлы этих плагинов лежат в /data/data/com.dunehd.app/flashdata/plugins.
    • doc-sdk-plugins.c140 · doc · android; прошивка — · В SDK для Android приведены команды развёртывания плагина: adb push в /flashdata/plugins/ и chmod -R +x для bin и www/cgi-bin внутри каталога плагина.

    ↩

    • fw-tv188b-261021-0117-r25.c082 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 global_action install не выполняется, если плагин положен в $FS_PREFIX/flashdata/plugins через adb push и приложение перезапущено: маркеров install от kb_probe5 и kb_probe6_sup нет, тогда как boot, boot_end и gui_start kb_probe5 выполнились.
    • fw-tv188b-261021-0117-r25.c083 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 global_action update не выполняется, если version_index в dune_plugin.xml изменён на месте (1 → 2) и приложение перезапущено через am force-stop, хотя оболочка регистрирует плагин с version_index 2 и заново запускает movie_suppliers_update.sh.
    • 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-261021-0117-r25.c210 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 плагин, у которого name в dune_plugin.xml (kb_probe5_other) не равен имени каталога (kb_probe5_badname), не регистрируется: строки «Plugin … is registered» для него нет, в /tmp/run/installed_plugins.xml и /tmp/www/plugins его нет ни под тем, ни под другим именем.
    • fw-tv188b-260827-0003-r24--plugin-loader.c041 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Установщик сверяет name в манифесте с ожидаемым: есть сообщение «declared plugin name is '%s', real is '%s'» и ключ plugin_installer_error_name_changed__1

    ↩

  29. fw-tv188b-261021-0117-r25.c213 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 точки входа плагина kb_probe5 (root://applications), заданные без icon_url, в разделе «Приложения» не появлялись. ↩

    • fw-tv188b-261021-0117-r25.c214 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 штатный установщик ZIP применил к корню плагина сначала .platform.android (скопировал only_android.txt и bin/marker.txt в корень), затем поверх — .platform.android-arm-api19 (bin/marker.txt перезаписан); в установленном плагине bin/marker.txt = «.platform.android-arm-api19» и есть only_android.txt. В shell.log — «[plugin_installer] applying /tmp/plugin_tmp/.platform.».
    • fw-tv188b-261021-0117-r25.c215 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 штатный установщик ZIP не применил .platform.87xx и .platform.foo и удалил все четыре каталога .platform.* (android-arm-api19, 87xx, android, foo: «[plugin_installer] removing /tmp/plugin_tmp/.platform.») до копирования; в установленном плагине нет ни каталогов .platform.*, ни only_87xx.txt.
    • doc-sdk-plugins.c137 · doc · android; прошивка — · Текст документа буквально говорит: при установке на Android содержимое .platform.android удаляется, а содержимое .platform.87xx переносится в корень

    ↩

    • fw-tv188b-261021-0117-r25.c304 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после touch main.php плагина kb_probe5 следующий вызов handle_user_input сначала перезапускает php_server: в shell.log того же процесса оболочки «[kb_probe5] [php] start_call(): PHP-script modification detected (1793009215). Restarting PHP-server-process...», «shutting down...», «stopped.», «server started; pid: 17676.», и вызов исполняет уже новый процесс 17676.
    • fw-tv188b-261021-0117-r25.c306 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 правка файла lib/kbp5_lib.php, подключаемого из main.php через require_once, без изменения main.php не перезапустила php_server kb_probe5: следующий вызов исполнил тот же процесс 17362 (n=5) со старой версией функции (lib=v1), в shell.log между «start» и «result action» сообщений о перезапуске нет.
    • fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c035 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 libduneshell.so содержит тот же блок строк php_driver.cpp/php_client.cpp/php_fw.cpp/php_utils.cpp, включая «start_call(): PHP-script modification detected (%ld). Restarting PHP-server-process...»

    ↩

    • fw-tv188b-261021-0117-r25.c320 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при сбое PHP-вызова (Fatal error или exit(0) в handle_user_input) оболочка пишет в shell.log «[<плагин>] [php] poll_calls() E: treating empty result as failure and stopping server», останавливает php_server («shutting down...», «stopped.»), затем «Error: operation returned PHP_CALL_FAILED.», «[handle_user_input] Failed.» и «[plugin] <плагин>: FATAL ERROR detected (msg = Ошибка приложения)».
    • fw-tv188b-261021-0117-r25.c322 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после остановки php_server из-за сбоя вызова (Fatal error, exit(0)) следующий вызов плагина запускает новый php_server: в shell.log после «start (timeout=60.0s)» идёт «[kb_probe5] [php] server started; pid: 17849.» (после Fatal error) и «… pid: 17924.» (после exit).
    • fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c039 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25, если call_plugin PHP-плагина возвращает null, php_server ничего не пишет в ответ и завершает цикл по EOF канала, а оболочка печатает «poll_calls() E: treating empty result as failure and stopping server», «Error: operation returned PHP_CALL_FAILED.», «result status failed», выполняет plugin_show_error и «FATAL ERROR detected (msg = Ошибка приложения)»; на экране — «Ошибка приложения / Произошла ошибка. Приложение будет закрыто.».

    ↩

    • fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c032 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 по тайм-ауту handle_user_input оболочка останавливает php_server плагина и тем прерывает вызов: за «cancelling by timeout (N s)» следуют «FATAL ERROR detected (msg = operation timed out)», «[php] shutting down...», через ~0,25 с «killing PHP-server process...» и «stopped.», затем «canceling req N (fast: 1)», «PHP-FW was shut down. The operation fails.», «result status canceled» и «canceled in N s»; PHP-код вызова не доработал.
    • fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c033 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после отмены handle_user_input по тайм-ауту оболочка выполняет plugin_show_error, и на экране — диалог «Превышено время операции» с кнопкой OK (перевод plugin_operation_timed_out).
    • fw-tv188b-261021-0117-r25.c309 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 операция handle_user_input PHP-плагина без operation_timeout в манифесте (kb_probe5, kb_probe6; ENTER на точке входа с plugin_handle_user_input) стартует с тайм-аутом 60 с: в shell.log «…->handle_user_input(…): start (timeout=60.0s)».
    • fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c017 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Отмена операции PHP-плагина (php_plugin.c, fcn.00272050) находит дескриптор операции по id, печатает «Cancelling... Output-data: %p.» и ставит в дескрипторе байт-флаг отмены — и больше ничего: ни php_server, ни PHP-коду отмена не передаётся.

    ↩

    • fw-tv188b-261021-0117-r25.c122 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 /tmp/run/versions.txt (145 байт, system:system) — шесть строк key=value: api_version=1.1.0, firmware_version=261021_0117_r25, product=tv188b, platform_kind=android, app_version=1.0.1-13-261021_0117_r25, app_version_code=13; ключа android_platform нет.
    • fw-tv188b-260827-0003-r24--php-framework.c041 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ConfigUtils::load_product_and_fw() читает /tmp/run/versions.txt (key=value: firmware_version, product, platform_kind, android_platform); для fw_apk android_platform берётся из /firmware/config/fw_apk_platform.txt
    • fw-tv188b-261021-0117-r25.c364 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 config_utils.php::load_product_and_fw() читает android_platform из /tmp/run/versions.txt, но при истинном HD::is_fw_apk() (getenv('HD_FW_APK'); у php_server r25 на tv188b = 1) перезаписывает его содержимым файла /firmware/config/fw_apk_platform.txt.
    • fw-tv188b-261021-0117-r25.c365 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 261021_0117_r25 · В образе r25 файл system/system/dunehd/firmware/config/fw_apk_platform.txt содержит строку s928x_android11 (16 байт), его sha256 2e3d08a86de47e91eacb08c92dd6b29df881c4f216a5aa9498a195cf26bc2e55 совпадает с r24.
    • fw-tv175u-260724-0207-r24.c022 · code · tv175u, android; прошивка 260724_0207_r24 · Скрипт /system/dunehd/init пишет /tmp/run/versions.txt: product (из product_id.txt), firmware_version, platform_kind=android и android_platform (из android_platform.txt)
    • plg-gh-kocourkuba-proiptv.c029 · code · unknown; прошивка — · Вне APK get_platform_info() читает $FS_PREFIX/tmp/run/versions.txt как ini: нет файла или platform_kind не 'android' — платформа 'unsupported'; иначе platform=platform_kind, type=android_platform.
    • plg-gh-kocourkuba-proiptv.c081 · code · unknown; прошивка — · В get_platform_info() при is_null($platform) (static-кэш пуст) и истинном is_apk() — это первая ветвь, до else if (!is_dune()) и else — platform='android'; внутри неё type='fw_apk' при истинном is_fw_apk(), иначе type='apk'; versions.txt эта ветвь не читает (parse_ini_file — в ветви else).
    • fw-tv188b-261021-0117-r25.c097 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 $FS_PREFIX/firmware/config/fw_apk_platform.txt содержит s928x_android11.

    ↩

  30. fw-tv188b-261021-0117-r25.c253 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 встроенный PHP (php_server и php-cgi CGI) в команде shell_exec добавляет $FS_PREFIX (/data/data/com.dunehd.app) к словам /tmp/…, /firmware/…, /config/…, /flashdata/… и к пути в одинарных кавычках ('/tmp/h'), но не к /etc/…, не к x/tmp/f и не к пути в двойных кавычках ("/tmp/g"). ↩↩

    • fw-tv188b-261021-0117-r25.c248 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php-cgi CGI плагина с php.ini без date.timezone ini date.timezone пуст; date_default_timezone_get() возвращает Europe/Moscow, но date() и date_default_timezone_get() пишут PHP Warning «It is not safe to rely on the system's timezone settings… We selected 'Europe/Moscow' for 'MSK/3.0/no DST' instead».
    • fw-tv188b-261021-0117-r25.c247 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php_server PHP-плагина ini date.timezone = Europe/Moscow и date_default_timezone_get() = Europe/Moscow при getenv('TZ') = false; date() даёт MSK +0300, getprop persist.sys.timezone — Europe/Moscow.

    ↩

    • fw-tv188b-261021-0117-r25--libphp5.c050 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · www.ssl.com на tv188b r25 из php_server (uid 1000) с полным бандлом, без корня Entrust и только с корнем Entrust при включённой проверке TLS даёт errno 60 «self signed certificate in certificate chain»; без проверки — HTTP 200, а цепочка заканчивается самоподписанным SSL.com TLS RSA Root CA 2022.
    • fw-tv188b-261021-0117-r25--libphp5.c036 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · CA-бандлы всех пяти исследованных сборок совпадают по SHA-256 722be2869ed2c2a949e5edb75b030f1e737e869ca8e8f70bc8d876dd93227ead.

    ↩

    • fw-tv188b-261021-0117-r25.c234 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 PHP-скрипт CGI плагина (php-cgi через CGI-обёртку), выполнивший curl_multi на 4 хендла к httpd самого плеера (http://127.0.0.1/plugins/…, http://127.0.0.1:80/cgi-bin/plugins/…, http://localhost/cgi-bin/plugins/…), доходит до curl_multi_info_read и получает все 4 сообщения с msg=1 result=0, после чего php-cgi завершается с кодом 139 и в /tmp/dune_apk_cgi_err.log появляется «Segmentation fault»; повторный запуск дал то же самое.
    • fw-tv188b-261021-0117-r25.c235 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 тот же зонд curl_multi (4 хендла к httpd плеера) в php_server PHP-плагина (операция handle_user_input) доходит до curl_multi_info_read со всеми 4 сообщениями msg=1 result=0; результата операция не возвращает: через ~0,25 с после её начала оболочка пишет в shell.log «[kb_probe6] [php] E: op 11 failed (read status: 2).», «shutting down...», «stopped.» и «Error: operation returned PHP_CALL_FAILED.».
    • fw-tv188b-261021-0117-r25--libphp5--curl-http.c028 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В multi запроса 12 curl_getinfo(h0, CURLINFO_HTTP_CODE) записал возврат 200; последняя строка отчёта — «перед curl_multi_getcontent h0», без последующей метки этого вызова.
    • fw-tv188b-261021-0117-r25--libphp5--curl-http.c029 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В multi запроса 12 оболочка получила EOF от PHP-сервера, записала PHP_CALL_FAILED и stopped; end multi за 25 с не появился, а при сборе php_server зонда уже не найден.
    • fw-tv188b-261021-0117-r25--libphp5.c028 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · Наборы имён curl_multi_* (12) и CURLOPT_* (111) в strings libphp5.so совпадают у всех пяти исследованных сборок.

    ↩

    • fw-tv188b-261021-0117-r25.c023 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · HD::http_get_document в r25 пишет в лог « http <метод>: » (метод — CURLOPT_CUSTOMREQUEST, иначе POST при CURLOPT_POSTFIELDS, иначе GET) и « http DATA: …» вместо «HTTP fetching»/«HTTP POST fields»; сообщения об ошибках — в нижнем регистре («http request failed (код)»)
    • fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c030 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 (261021_0117_r25) набор сообщений исполнителя операций тот же, добавлены «plugin_opexec I: waiting for mc index validation», «plugin_opexec I: mc index now valid» и «plugin_opexec D: %s: %s» (вместо «still working...»), а сообщения операции получили формат «%s->%s(%s.%s)».

    ↩

    • fw-tv188b-261021-0117-r25.c169 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 GET /cgi-bin/do?cmd=kb_probe5_ping&plugin=kb_probe5&kbp5=1 при загруженном плагине kb_probe5 с www/cgi-bin/run.php вернул command_status=failed, error_kind=unknown_command, error_description «command 'kb_probe5_ping' is not supported».
    • fw-tv188b-261021-0117-r25.c170 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 запрос /cgi-bin/do?cmd=kb_probe5_ping&plugin=kb_probe5 не запустил www/cgi-bin/run.php плагина: файл /tmp/kb_probe5/run_php.txt, который run.php пишет при каждом запуске, не появился, а в shell.log после запроса нет строк handle_extcmd, kb_probe5, run.php, php-cgi и «headers missing».
    • fw-tv188b-261021-0117-r25.c149 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 CGI-скрипт плагина, вызванный через http:///cgi-bin/plugins/

      /<файл>, получает PLUGIN_NAME=

      , а PLUGIN_CGI_DIR и SCRIPT_FILENAME — реальные пути $FS_PREFIX/flashdata/plugins/

      /www/cgi-bin и …/www/cgi-bin/<файл>, а не /tmp/www/plugins/

      /…

    ↩

    • fw-tv188b-261021-0117-r25.c160 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 httpd на URL каталога плагина без «/» в конце (/plugins/

      , /cgi-bin/plugins/

      ) отвечает 302 с Location на тот же путь со «/», а на URL со «/» (/plugins/

      /, /cgi-bin/plugins/

      /) — 404 Not Found.

    • fw-tv188b-261021-0117-r25.c161 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 «/» после имени файла плагина даёт 404 Not Found и для CGI (/cgi-bin/plugins/

      /ping.sh/), и для статики (/plugins/

      /index.txt/), хотя без «/» оба отвечают 200.

    ↩

    • fw-tv188b-260827-0003-r24--http-api--ext-command-params.c093 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 cmd=open_path&url=root://applications/<подпись пункта> отвечает command_status=ok, но точку входа плагина не запускает (вызовов 0 → 0), а launch_media_url с plugin_launcher://{name=<плагин>} {ep_media_url=} её запускает (0 → 1).
    • fw-tv188b-260827-0003-r24--http-api--ext-command-params.c040 · doc · any-documented; прошивка — · В описании IP Control указано, что протокол 4 добавил cmd=open_path&url=URL для открытия папки, раздела меню или запуска пункта по root://…; приведён пример root://applications/RadioTime.

    ↩

  31. fw-tv188b-260827-0003-r24--http-api--ext-command-params.c098 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 команды IP Control ждут, пока идёт handle_user_input плагина: launch_media_url, отправленный через 4 с после начала 20-секундной операции, получил ответ только после её конца — и для точки входа того же плагина, и для другого плагина. ↩

    • fw-tv188b-261021-0117-r25.c281 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 для ленивой серии VOD оболочка вызвала только get_vod_stream_url; get_vod_stream_info не вызывалась ни разу, хотя плагин-зонд реализует оба метода.
    • fw-tv188b-261021-0117-r25--media-player.c061 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 ленивая серия при feature vod_get_stream_info вызывает get_vod_stream_info с playback_url kbp8lazy://a6lazy.
    • fw-tv188b-260827-0003-r24--plugin-loader--manifest.c051 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Манифест ktv_start объявляет vod_get_stream_info; строка vod_get_stream_info есть в libduneshell.so среди строк plugin_next_url.c, а в списке операций плагина — get_vod_stream_info

    ↩

    • fw-tv188b-261021-0117-r25--java-player.c051 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 тестовый MP4 по HTTP без engine запускается через VLC с contentType=2 (HTTP_FILE).
    • fw-tv188b-261021-0117-r25--java-player.c058 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 http_headers:X-KB8-Test%3A%20one у HTTP MP4 на VLC не передаёт X-KB8-Test серверу.
    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c022 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 суффикс |||dune_params|||engine:1,http_headers:… в playback_url серии (playback_url_is_stream_url=true, get_vod_stream_url не вызывается) доходит до "[player] parsing dune params", а заданный заголовок приходит на HTTP-сервер. Значение с %2C осталось одной строкой: User-Agent стал "KB9-UA2/1.0,X-KB9-Test: one".
    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c030 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 при playback_url=kbplazy://0 без суффикса ответ get_vod_stream_url с engine:1,http_headers:X-KB477%3A%20one дал серверу запрос ExoPlayer /m/kb9-a.mp4?b=lazy без суффикса dune_params и с заголовком X-KB477: one.

    ↩

    • fw-tv188b-261021-0117-r25.c283 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 событие playback_going_to_switch приходит и в конце последней серии VOD, когда перехода на новый URL нет и плеер закрывается — после состояния stopped и непосредственно перед playback_stop с playback_end_of_stream=1.
    • doc-sdk-plugins--gui-actions.c017 · doc · any-documented; прошивка — · С прошивки 150529 событие GUI_EVENT_PLAYBACK_GOING_TO_SWITCH генерируется перед переключением на новый media URL; в отличие от GUI_EVENT_PLAYBACK_STOP, оно не генерируется при остановке и выключении

    ↩

    • fw-tv188b-261021-0117-r25.c287 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при старте VOD зонда kb_probe6 с PluginVodInfo::buffering_ms=3000 оболочка пишет в shell.log «[player] setting buffering to 3000ms» и «[player] DEBUG: using special buffering 3000ms».
    • doc-sdk-plugins--operations.c107 · doc · any-documented; прошивка — · PluginVodInfo::buffering_ms (предбуферизация в мс) не реализован

    ↩

    • fw-tv188b-261021-0117-r25.c190 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 shell_ext/bin/media_check вызывает /firmware/scripts/ffmpeg.sh, а такого файла на устройстве нет: «media_check: line 27: /firmware/scripts/ffmpeg.sh: No such file or directory», «ffmpeg finished with status 1».
    • fw-tv188b-261021-0117-r25.c368 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 261021_0117_r25 · В образах r24 и r25 есть text-файл system/system/dunehd/firmware/scripts/ffmpeg.sh размером 457 байт с sha256 b26df76585300fd394662fbd02cdb3555cb0b1fd8a9859e5a7d0e876eef867df; в обеих версиях он одинаков.
    • fw-tv188b-261021-0117-r25.c369 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 261021_0117_r25 · В образах r24 и r25 system/system/dunehd/firmware/bin/ffmpeg — симлинк на /data/data/com.dunehd.app/lib/libxxx_ffmpeg.so.
    • fw-tv188b-261021-0117-r25--builtin-plugins-misc.c048 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 прямой запуск $P/firmware/bin/ffmpeg -version с LD_LIBRARY_PATH=$P/lib:/system/dunehd/firmware/lib из adb shell вывел ffmpeg version 7.1.3; путь ffmpeg — ссылка на $P/lib/libxxx_ffmpeg.so.
    • fw-tv188b-260827-0003-r24--shell-ext.c034 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · media_check проверяет URL: ffmpeg через /firmware/scripts/ffmpeg.sh (таймаут 5 с) и скорость чтения curl (первые 1000000 байт, таймаут 5 с, connect 4 с, --cacert /firmware/certs/ca-bundle.crt); curl берётся из /firmware/bin/curl, а если его нет — из каталога скрипта
    • plg-gh-kocourkuba-proiptv.c036 · code · unknown; прошивка — · get_ffmpeg_path() при is_r25_or_higher() и наличии $FS_PREFIX/firmware/bin/ffmpeg использует его, иначе — свою сборку bin/ffmpeg-7.1.3 (для bin/media_check.sh); комментарий: «Firmware r25 and newer ships its own ffmpeg 7.1».
    • doc-sdk-dune-devel-info.c010 · doc · any-documented; прошивка — · Плагин не может содержать бинарные исполняемые файлы; если такой файл нужен, нужно отправить в Dune HD запрос рассмотреть его включение в следующее обновление ПО.

    ↩

    • fw-tv188b-260827-0003-r24--movie-suppliers.c029 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Ключ expr описателя вычисляется Expr; ложь — поставщик отключается. Для id rutube expr принудительно country(ru), если не установлен плагин rutube_integration (иначе условия нет)
    • fw-tv188b-261021-0117-r25.c051 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Suppliers r25 (movies/suppliers.php): поставщик rutube включается, если установлен плагин rutube_integration; в остальных случаях (и для rutube без плагина) решает ключ expr описателя: ложь — поставщик отключается

    ↩

    • fw-tv188b-261021-0117-r25--shell-ext--entry-handler.c074 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В r24 диалог выбора воспроизведения давал кнопкам play_online поставщиков только s, e и sup_id, без sup_info; wh_* доходили до поставщика лишь через entry/play_recent.
    • fw-tv188b-261021-0117-r25--shell-ext--entry-handler.c060 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 диалог выбора воспроизведения строит для каждого поставщика (с дедупликацией по key_show_only_one) кнопку play_online с s, e, sup_id; только кнопке поставщика, чей id равен whi_sup_id последней записи истории, добавляется sup_info из get_wh_supplier_info.
    • fw-tv188b-261021-0117-r25--shell-ext--entry-handler.c063 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · MovieHelper::get_wh_supplier_info (r25) копирует action_params записи (или пустой объект), добавляет wh_uid, wh_s, wh_e (по умолчанию -1), wh_pos (-1), wh_len (0), wh_tags (JSON, если есть tags) и wh_file_index (если есть index) и возвращает JSON с sup_data и всеми wh_*-полями.

    ↩

    • fw-tv188b-260827-0003-r24--movie-suppliers.c035 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Перечитывание поставщиков: при наличии /tmp/movie_suppliers_changed.flag (reload_suppliers_if_changed); в первый раз ждёт файл suppliers_prepared_path до 30 раз по 0,1 с
    • fw-tv188b-261021-0117-r25.c052 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Suppliers::reload_if_changed (в r24 — reload_suppliers_if_changed) перечитывает поставщиков не только при наличии флага-файла, но и при смене mtime каталога /tmp/movie_suppliers

    ↩

    • fw-tv188b-261021-0117-r25.c188 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у поставщика kbp5_stream (playback_type stream) сразу после ответа do_file_search серии — в пределах 0,12 с, без выбора пользователя — оболочка по очереди вызвала get_stream_url для файлов без url: сначала f1, затем f2_err.
    • fw-tv188b-261021-0117-r25.c194 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 stream_special не использует url файла из ответа do_file_search: у s1 был url http://kbp5.invalid/not-used-s1, но оболочка запросила URL через get_stream_url и взяла его результат, а в url элемента stream_url пустой, file_id s1.
    • fw-tv188b-260827-0003-r24--movie-suppliers--stream-protocol.c051 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Для stream_special process_special_stream_playback_type при пустом списке файлов возвращает ошибку, иначе берёт файл с минимальным count(path) (строгое <, при равенстве — первый) и вызывает get_play_movie_action с online=true и cur_stream_url=''; get_play_file_online_action передаёт cur_stream_url в get_vod_info, тот кладёт stream_url='' в playback url (для single/ass_type!=0 — напрямую cur_stream_url, для серии — при is_current=1), get_stream_url пропускает preloaded только при is_current!=0 && stream_url!='', поэтому идёт в get_stream_url_by_file_id. url из ответа do_file_search для запускаемого stream_special-файла не используется; поставщик должен реализовать get_stream_url

    ↩

    • fw-tv188b-261021-0117-r25--app-launch.c062 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Ожидание потери фокуса fcn.00560a58(delay, метка) в tv188b r25 — если оболочка уже без фокуса, «%s: shell app is already lost focus» и результат 1; если delay < 1 — сразу «%s: wait for shell app loosing focus timed-out» и 0; иначе каждые 100 мс (usleep(100000)) проверяет фокус до delay секунд — потеря фокуса даёт «%s: shell app lost focus in %.2fs» и ненулевой результат, истечение срока — «timed-out» и 0.
    • fw-tv188b-261021-0117-r25--app-launch.c077 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в запросе 7 launch_ext_app с delay 0 (am start настроек) дал «activity launch status: 0», через 4,968 мс — «general: wait for shell app loosing focus timed-out»; настройки открылись (Displayed +123ms), и поверх них выполнился error_action действия — диалог «KB7 error_action / delay=0».
    • fw-tv188b-261021-0117-r25--app-launch--native.c011 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В tv188b r24 ожидание потери фокуса fcn.00549ed8 сначала проверяет, потерян ли фокус уже (тогда результат 1), затем delay < 1 (тогда timed-out и 0); при положительном delay опрашивает фокус с usleep(100000) до истечения delay секунд, возвращая ненулевой результат при потере фокуса и 0 при тайм-ауте.
    • fw-tv188b-260827-0003-r24--movie-suppliers.c061 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Нет пакета — generic отвечает error.missing_app (indirect true, urls http://online.dune-hd.com/apk/generic/.txt); иначе {bin, package, wait_app_start_delay 10, title, indirect true, urls}

    ↩

    • fw-tv188b-261021-0117-r25--app-launch.c070 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 launch_ext_app с cmd «am start --user 0 -n …» ушёл в apk_helper, тот вернул «Unknown option: --user» и activity launch status −1; выполнился error_action (диалог «KB9 error_action»).
    • fw-tv188b-261021-0117-r25--app-launch.c023 · code · tv188b, android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 260724_0207_r24 · Строки «--user» в таблице строк classes.dex нет ни в dune.apk tv188b r25 и r24, ни в APK DMC.
    • fw-tv188b-261021-0117-r25--app-launch.c072 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В tv188b r25 нативный обработчик launch_ext_app (fcn.00560ee8 libduneshell.so), если ветка остановки воспроизведения не вернула управление раньше, для cmd, в которой есть непробельный символ, сравнивает начало cmd с «/system/dunehd/dunehd_service» (strncmp на 0x1d символов, ведущие пробелы не пропускаются): при совпадении печатает «gui_action D: run command '%s'» и передаёт cmd помощнику fcn.00560d20 (popen), иначе печатает «gui_action D: launch activity for command '%s'» и передаёт cmd разборщику apk_helper fcn.006f2b60; если помощник вернул −1, cmd дополнительно уходит в ветку launch activity.

    ↩

    • fw-tv188b-261021-0117-r25--php-framework.c059 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 после include dunelib/utils.php зонд увидел класс HD и method_exists(HD,make_json_rpc_request)=false; прямой вызов завершился E_ERROR Call to undefined method HD::make_json_rpc_request(), а не JSON-ответом.
    • fw-tv188b-261021-0117-r25.c022 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В dunelib/utils.php r25 нет метода HD::make_json_rpc_request: между encode_props и get_mac_addr, где он стоял в r24, его нет
    • fw-tv188b-260827-0003-r24--php-framework.c067 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · HD::make_json_rpc_request($op_name, $params) возвращает массив JSON-RPC 2.0 с растущим id

    ↩

    • fw-tv188b-261021-0117-r25--libphp5.c074 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 прямой вызов /data/data/com.dunehd.app/bin/wget и вызов sh с тем же путём из php_server оба вернули rc=126 и cannot execute binary file.
    • fw-tv188b-261021-0117-r25--libphp5.c073 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 which wget из php_server показал /data/data/com.dunehd.app/bin/wget — ссылку на libxxx_busybox.so; вызов по имени wget к /ping компьютера вернул ok и rc=0.

    ↩

  32. fw-tv188b-261021-0117-r25.c349 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25, 260827_0003_r24 · На tv188b состав из 16 имён параметров ответа /cgi-bin/do?cmd=status в r25 совпадает с r24; в снимках обоих прогонов (player_state=navigator) protocol_version=6, а значения отличаются: android_app_active=0 в r25 и 1 в r24, firmware_version=261021_0117_r25 и 260827_0003_r24, app_version=1.0.1-13-261021_0117_r25 и 1.0.1-13-260827_0003_r24. ↩↩

  33. fw-tv188b-261021-0117-r25.c364 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 config_utils.php::load_product_and_fw() читает android_platform из /tmp/run/versions.txt, но при истинном HD::is_fw_apk() (getenv('HD_FW_APK'); у php_server r25 на tv188b = 1) перезаписывает его содержимым файла /firmware/config/fw_apk_platform.txt. ↩

  34. fw-tv188b-261021-0117-r25.c360 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина kb_probe8 (pid 3005, ppid 2449, uid 1000) HD_FW_APK=1. ↩

  35. fw-tv188b-260827-0003-r24--php-framework.c041 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ConfigUtils::load_product_and_fw() читает /tmp/run/versions.txt (key=value: firmware_version, product, platform_kind, android_platform); для fw_apk android_platform берётся из /firmware/config/fw_apk_platform.txt ↩

  36. fw-tv188b-261021-0117-r25.c365 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 261021_0117_r25 · В образе r25 файл system/system/dunehd/firmware/config/fw_apk_platform.txt содержит строку s928x_android11 (16 байт), его sha256 2e3d08a86de47e91eacb08c92dd6b29df881c4f216a5aa9498a195cf26bc2e55 совпадает с r24. ↩↩

  37. fw-tv188b-261021-0117-r25.c097 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 $FS_PREFIX/firmware/config/fw_apk_platform.txt содержит s928x_android11. ↩

  38. plg-gh-kocourkuba-proiptv.c026 · code · unknown; прошивка — · get_raw_firmware_version() плагина читает строку firmware_version: из $FS_PREFIX/tmp/sysinfo.txt (иначе 'Not detected'), а get_parsed_firmware_ver() разбирает её регуляркой /^(\d)_(\d)_(\D)(\d)(.*)?$/ на build_date, build_number, rev_literal, rev_number, features. ↩

  39. plg-gh-kocourkuba-proiptv.c027 · code · unknown; прошивка — · Плагин сравнивает ревизию прошивки числом rev_number: is_r22_or_higher() — rev_number > 21, is_r24_or_higher() — > 22, is_r25_or_higher() — > 24 (при неразобранной версии rev_number=0). ↩

  40. fw-tv188b-260827-0003-r24--php-framework.c045 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Сравнения версий в Expr (fwv_ge/gt/le/lt) строковые: strcmp(firmware_version, аргумент) ↩

  41. fw-tv188b-261021-0117-r25.c008 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 добавляет идентификаторы GUI-действий APPLY_HASH_DIRTIES_ACTION_ID='apply_hash_dirties', COND_ACTION_ID='cond', FS_CTL_ACTION_ID='fs_ctl', LOAD_AND_SCALE_IMAGE_ACTION_ID='load_and_scale_image', UPDATE_SPECIAL_FAVORITE_FOLDER_ACTION_ID='update_special_favorite_folder' (в r24 их нет) ↩↩

  42. fw-tv188b-260827-0003-r24--php-framework.c040 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ConfigUtils::load_firmware_features() собирает набор флагов из строк /tmp/firmware_features.txt и /tmp/ro_features.txt ↩

    • fw-tv188b-260827-0003-r24.c063 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в окружении dunehd_service (pid 587) есть FS_PREFIX=/data/data/com.dunehd.app, HD_APK=1, HD_FW_APK=1, HD_HTTP_LOCAL_PORT=80 и DUNEHD_SERVICE_DONT_FORK=1, а PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin.
    • fw-tv188b-261021-0117-r25.c091 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у процесса network_manager ($FS_PREFIX/firmware/bin/network_manager, PPID 1) в окружении HD_HTTP_LOCAL_PORT=80, HD_FW_APK=1, HD_APK=1, FS_PREFIX=/data/data/com.dunehd.app, LOG_DIR=/tmp/run, DUNEHD_SERVICE_DONT_FORK=1, PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin, а LD_LIBRARY_PATH=$FS_PREFIX/firmware/lib:/lib:/usr/lib (без /system/xbin/dunehd/firmware/lib).

    ↩

    • fw-tv188b-261021-0117-r25.c313 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 php_server при старте пишет в /tmp/run/<плагин>.log по порядку: «[server] preparing...», «reader fd: N; writer fd: M», «resetting include path to …», загрузку bootstrap.php, dune_api.php, dune_plugin.php, dune_plugin_fw.php, «executing system properties cmd (number of properties: 7)...», загрузку dune_config.php, затем программы плагина, после чего «[server] ready.» и «[server] main loop started.»; get_included_files() из main.php даёт тот же порядок файлов.
    • fw-tv188b-261021-0117-r25.c316 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 include_path в php_server = '.:<каталог плагина>:/data/data/com.dunehd.app/firmware_ext/php/include', каталог плагина — с префиксом $FS_PREFIX: …/flashdata/plugins/kb_probe5 и …/flashdata/plugins/dune-hd.tv у плагинов из flashdata, …/firmware_ext/plugins/shell_ext и …/firmware_ext/plugins/android_apps у встроенных; php_server пишет его в лог «[server] resetting include path to '…'».

    ↩

    • fw-tv188b-260827-0003-r24--php-framework.c067 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · HD::make_json_rpc_request($op_name, $params) возвращает массив JSON-RPC 2.0 с растущим id
    • fw-tv188b-261021-0117-r25.c022 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В dunelib/utils.php r25 нет метода HD::make_json_rpc_request: между encode_props и get_mac_addr, где он стоял в r24, его нет
    • fw-tv188b-261021-0117-r25--php-framework.c059 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 после include dunelib/utils.php зонд увидел класс HD и method_exists(HD,make_json_rpc_request)=false; прямой вызов завершился E_ERROR Call to undefined method HD::make_json_rpc_request(), а не JSON-ответом.

    ↩

    • fw-tv188b-260827-0003-r24--php-framework.c276 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс SyncMyCollectionActionData с ключами (2): mcf_id, post_action
    • fw-tv188b-261021-0117-r25.c015 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 класс SyncMyCollectionActionData содержит только post_action: ключ mcf_id убран из dune_api.php, а ActionFactory::sync_my_collection в shell_ext/lib принимает только $post_action

    ↩

    • fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c070 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::sync_my_collection строит действие sync_my_collection; схема заполнения использует SyncMyCollectionActionData::{mcf_id, post_action}. mcf_id по умолчанию -1, приводится к string.
    • fw-tv188b-261021-0117-r25.c015 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 класс SyncMyCollectionActionData содержит только post_action: ключ mcf_id убран из dune_api.php, а ActionFactory::sync_my_collection в shell_ext/lib принимает только $post_action

    ↩

    • plg-dc-globaltv--lib.c069 · code · android-dune-fw; прошивка 260827_0003_r24, 261021_0117_r25 · Интерфейсы GCompsScreen/RowsScreen в плагине и r24 объявляют get_timer(MediaURL $media_url, &$plugin_cookies), а в r25 get_timer принимает только нетипизированный media_url.
    • fw-tv188b-261021-0117-r25.c044 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В shell_ext/lib r25 сигнатура get_timer стала get_timer($media_url) (без &$plugin_cookies) в интерфейсах GCompsScreen и RowsScreen; RegularScreen тоже объявляет get_timer($media_url), а AbstractRegularScreen по умолчанию возвращает null и кладёт таймер в PluginRegularFolderView::timer

    ↩

    • fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c124 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · RowsFactory::pane формирует или дополняет структуру с полями PluginRowsPane::{rows, focus, bg, header_enabled, single_list_navigation, initial_focus_header, initial_focus_item_id, initial_focus_row_id, horizontal_focus_freedom_factor, horizontal_focus_end_min_offset, vertical_focus_freedom_factor, vertical_focus_gravity, vertical_focus_end_min_offset}. При пустом focus вызывает focus(); header_enabled/single_list_navigation=false, initial_focus_header=-1; hfactor/vfactor=1.0, vgravity=0.0, end_min_offset=0.
    • fw-tv188b-261021-0117-r25.c043 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · RowsFactory::pane в shell_ext/lib r25 получил второй позиционный параметр: pane($rows, $row_dup_map=null, $focus=null, $bg=null, …) и пишет PluginRowsPane::row_dup_map; добавлены RowsFactory::dup_row($id, $dup_id, $header_id=null) (тип PLUGIN_ROW_TYPE_DUP) и row_set_options

    ↩

    • plg-dc-globaltv--lib.c068 · code · android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::edit_list_config плагина принимает options/close_item_params между groups и sel_id; r24 принимает после groups сразу sel_id/post_action.
    • fw-tv188b-261021-0117-r25--shell-ext--ui-lib.c034 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · ActionFactory::edit_list_config принимает обязательный позиционный options между groups и sel_id и добавляет data.options только по истинности.

    ↩

  43. fw-tv188b-261021-0117-r25--ext-epg--ui-lib.c009 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 261021_0117_r25 · В r24 ext_epg/lib/gcomps_factory.php определён get_label_def, создающий GCOMPONENT_LABEL; в r25 ext_epg/lib этого метода нет, вместо него label_v2, создающий GCOMPONENT_TTF_LABEL. ↩

  44. fw-tv188b-261021-0117-r25.c320 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при сбое PHP-вызова (Fatal error или exit(0) в handle_user_input) оболочка пишет в shell.log «[<плагин>] [php] poll_calls() E: treating empty result as failure and stopping server», останавливает php_server («shutting down...», «stopped.»), затем «Error: operation returned PHP_CALL_FAILED.», «[handle_user_input] Failed.» и «[plugin] <плагин>: FATAL ERROR detected (msg = Ошибка приложения)». ↩

  45. fw-tv188b-261021-0117-r25--libphp5--curl-http.c020 · code · android-dune-fw; прошивка 260827_0003_r24 · В r24 _php_add_fs_prefix_to_http при заданной HD_HTTP_LOCAL_PORT заменяет префикс http://127.0.0.1/cgi-bin/plugins/ или http://localhost/cgi-bin/plugins/ на http://127.0.0.1:/cgi-bin/plugins/ с сохранением хвоста — та же CGI-подстановка, что в r25. ↩

  46. fw-tv188b-261021-0117-r25--libphp5--curl-http.c032 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 _php_do_add_fs_prefix_to_http при заданной HD_HTTP_LOCAL_PORT заменяет префикс URL http://localhost/cgi-bin/plugins/ на http://127.0.0.1:/cgi-bin/plugins/, сохраняя хвост URL. ↩

  47. fw-tv188b-261021-0117-r25--libphp5--curl-http.c033 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 _php_do_add_fs_prefix_to_http при заданной HD_HTTP_LOCAL_PORT заменяет и префикс без порта http://127.0.0.1/cgi-bin/plugins/ на http://127.0.0.1:/cgi-bin/plugins/ тем же кодом. ↩

  48. fw-tv188b-261021-0117-r25--libphp5--curl-http.c034 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 _php_do_add_fs_prefix_to_http без HD_HTTP_LOCAL_PORT, а также для http://-URL с другим хостом или путём порт не подставляет и передаёт URL в _php_apply_lcreg_to_http; URL не на http:// возвращается без обработки. ↩

  49. fw-tv188b-261021-0117-r25--libphp5--curl-http.c021 · code · android-dune-fw; прошивка 260827_0003_r24 · В r24 _php_add_fs_prefix_to_http не вызывает lcreg и других функций замены хоста; при отсутствии HD_HTTP_LOCAL_PORT или несовпадении префикса URL не меняется, а печать исходного и нового URL ограждена getenv("PHP_DEBUG"). ↩

  50. fw-tv188b-261021-0117-r25--libphp5--curl-http.c004 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 _php_do_add_fs_prefix_to_http вызывает lcreg при отсутствии HD_HTTP_LOCAL_PORT либо для http:// URL, не попавшего под CGI-подстановку; при заданной HD_HTTP_LOCAL_PORT URL без префикса http:// выходит до lcreg. ↩↩

  51. fw-tv188b-261021-0117-r25.c361 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина kb_probe8 (pid 3005, ppid 2449, uid 1000) HD_HTTP_LOCAL_PORT=80. ↩

  52. fw-tv188b-261021-0117-r25--libphp5--curl-http.c006 · code · android-dune-fw; прошивка 261021_0117_r25 · Инициализация lcreg r25 читает настройки из FS_PREFIX + /config/lcreg.txt и FS_PREFIX + /config/lcreg_pairs.txt; при отсутствии FS_PREFIX использует пустой префикс. ↩

  53. fw-tv188b-261021-0117-r25--libphp5--curl-http.c007 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 lcreg_kind выбирается через atoi первой строки lcreg.txt: 0 выбирает встроенную таблицу lcreg_ru_pairs, 1 читает lcreg_pairs.txt; ошибка открытия/чтения lcreg.txt, результат вне 0/1 или недоступный файл пар дают lcreg_kind=-1. ↩

  54. fw-tv188b-261021-0117-r25--libphp5--curl-http.c011 · code · android-dune-fw; прошивка 261021_0117_r25 · lcreg_get_replacement r25 ищет замену только при lcreg_kind>=0 и префиксе http:// либо https://, сравниваемом через strncmp с учётом регистра. ↩

  55. fw-tv188b-261021-0117-r25--libphp5--curl-http.c010 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 lcreg_ensure_initialized вызывает lcreg_do_initialize только при lcreg_kind=-2; состояния -1, 0 и 1 не запускают повторное чтение через эту функцию. ↩

    • fw-tv188b-261021-0117-r25--libphp5--curl-http.c008 · code · android-dune-fw; прошивка 261021_0117_r25 · В режиме lcreg_kind=1 r25 принимает строки пар с точным разделителем « : »; строку без него пропускает, левую часть копирует до разделителя, правую — начиная через три байта после него, удаляя завершающий LF.
    • fw-tv188b-261021-0117-r25--libphp5--curl-http.c009 · code · android-dune-fw; прошивка 261021_0117_r25 · Чтение пользовательской таблицы lcreg r25 ограничено 1024 принятыми парами; отдельный fgets вызывается с размером 0x400.

    ↩

  56. fw-tv188b-261021-0117-r25--libphp5--curl-http.c012 · code · android-dune-fw; прошивка 261021_0117_r25 · Для lcreg r25 имя хоста выделяется после последнего @ перед первым / (либо концом строки) и до первого : в этой части; совпадение с таблицей требует равной длины и memcmp без изменения регистра. ↩

  57. fw-tv188b-261021-0117-r25--libphp5--curl-http.c013 · code · android-dune-fw; прошивка 261021_0117_r25 · При совпадении lcreg r25 _php_apply_lcreg_to_http создаёт новую строку из исходного префикса до хоста, замены из таблицы и исходного хвоста после хоста; схема, userinfo и хвост с портом/путём копируются из исходного URL. ↩

  58. fw-tv188b-261021-0117-r25--libphp5--curl-http.c005 · code · android-dune-fw; прошивка 261021_0117_r25 · При успешной замене lcreg функция _php_apply_lcreg_to_http r25 печатает исходный и новый URL через printf без проверки PHP_DEBUG. ↩

  59. fw-tv188b-261021-0117-r25--libphp5--curl-http.c002 · code · android-dune-fw; прошивка 261021_0117_r25 · В URL-ветви опции 0x2712 обработчик _php_curl_setopt r25 передаёт строку через _php_add_fs_prefix_to_http перед php_curl_option_url.isra.7. ↩

  60. fw-tv188b-261021-0117-r25--libphp5--curl-http.c016 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 zif_curl_init при переданном URL вызывает php_curl_option_url.isra.7 напрямую; HTTP-подстановка перед этим вызовом есть в URL-ветви _php_curl_setopt, поэтому эти две точки входа имеют разный маршрут обработки URL. ↩↩

  61. fw-tv188b-261021-0117-r25--libphp5--curl-http.c023 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 curl_setopt(CURLOPT_URL,http://localhost/cgi-bin/plugins/kb_probe11/host.sh) из php_server привёл к CGI HTTP_HOST=127.0.0.1 и пустой curl_error. ↩↩↩

  62. fw-tv188b-261021-0117-r25--libphp5--curl-http.c024 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 curl_init(http://localhost/cgi-bin/plugins/kb_probe11/host.sh) из php_server привёл к CGI HTTP_HOST=localhost и пустой curl_error. ↩↩

    • fw-tv188b-261021-0117-r25--libphp5--curl-http.c023 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 curl_setopt(CURLOPT_URL,http://localhost/cgi-bin/plugins/kb_probe11/host.sh) из php_server привёл к CGI HTTP_HOST=127.0.0.1 и пустой curl_error.
    • fw-tv188b-261021-0117-r25--libphp5--curl-http.c024 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 curl_init(http://localhost/cgi-bin/plugins/kb_probe11/host.sh) из php_server привёл к CGI HTTP_HOST=localhost и пустой curl_error.

    ↩

  63. fw-tv188b-261021-0117-r25.c380 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Зонд запроса 6 (kbp6_curl_multi_report) задаёт URL каждого запроса curl_multi через curl_init($u), а не через curl_setopt(CURLOPT_URL); функцию вызывают CGI cm.php (ctx cgi) и main.php php_server (ctx php_server). ↩

  64. fw-tv188b-261021-0117-r25.c381 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина kb_probe6 (запрос 6) HD_HTTP_LOCAL_PORT=80. ↩

  65. fw-tv188b-261021-0117-r25.c378 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 6 php_server плагина kb_probe6 (отчёт curl_multi ctx=php_server, 15:08:30), задавший URL через curl_init($u), обратился к http://localhost/cgi-bin/plugins/kb_probe6/ping.sh?via=localhost — CGI получил HTTP_HOST=localhost; запрос к http://127.0.0.1:80/cgi-bin/plugins/kb_probe6/ping.sh?via=127.0.0.1 пришёл с HTTP_HOST=127.0.0.1. ↩

    • fw-tv188b-261021-0117-r25--libphp5--curl-http.c014 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 _php_stream_open_wrapper_ex при сброшенном бите 1 options передаёт путь через _php_add_fs_prefix до выбора URL-обёртки; при установленном бите 1 использует отдельную ветвь zend_resolve_path.
    • fw-tv188b-261021-0117-r25--libphp5--curl-http.c015 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 _php_add_fs_prefix передаёт вход в _php_do_add_fs_prefix_to_http, когда вход не начинается с / либо проверка _php_path_needs_prefix.part.0 не выбрала файловую ветвь.

    ↩

  66. fw-tv188b-261021-0117-r25--libphp5--curl-http.c022 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 zif_curl_exec перед curl_easy_perform читает сохранённый URL из поля handle +0x16c; если хост (после http:// или https://, без userinfo и порта) не localhost/localhost. и не разрешается getaddrinfo в 127.x или ::1, либо URL пуст или с другой схемой, ставит опцию 0x4ec3 с обработчиком _php_curl_opensocket_remote. ↩

  67. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c017 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Отмена операции PHP-плагина (php_plugin.c, fcn.00272050) находит дескриптор операции по id, печатает «Cancelling... Output-data: %p.» и ставит в дескрипторе байт-флаг отмены — и больше ничего: ни php_server, ни PHP-коду отмена не передаётся. ↩↩

  68. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c018 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Проверка результата операции PHP-плагина (php_plugin.c, fcn.002720ec) при пришедшем результате смотрит флаг отмены в дескрипторе операции: если он выставлен, печатается «Received result for cancelled operation.», а результат не разбирается и не отдаётся оболочке. ↩

  69. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c032 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 по тайм-ауту handle_user_input оболочка останавливает php_server плагина и тем прерывает вызов: за «cancelling by timeout (N s)» следуют «FATAL ERROR detected (msg = operation timed out)», «[php] shutting down...», через ~0,25 с «killing PHP-server process...» и «stopped.», затем «canceling req N (fast: 1)», «PHP-FW was shut down. The operation fails.», «result status canceled» и «canceled in N s»; PHP-код вызова не доработал. ↩↩

  70. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c037 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 следующий вызов плагина после отмены по тайм-ауту не ждёт отменённого: php_server с отменённым вызовом уже убит, и вызов, пришедший через ~4,7 с, сразу выполняется в новом php_server («[php] creating...», новый pid); код отменённого вызова не продолжился. ↩

  71. fw-tv188b-261021-0117-r25.c308 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после каждого перезапуска php_server (по touch main.php, после Fatal error, после exit(0)) статические переменные плагина начинаются заново: счётчик KbProbe5Fw::$n в первом вызове нового процесса снова равен 1 (pid 17676, 17849, 17924). ↩

  72. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c035 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 ключи манифеста operation_timeout/default и operation_timeout/<тип операции> задаются в секундах и работают: 5 дало handle_user_input «start (timeout=5.0s)» и отмену на 5 с, 7 — «timeout=7.0s» и отмену на 7 с. ↩

  73. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c034 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 ключ operation_timeout в данных действия plugin_handle_user_input задаётся в миллисекундах: 3000 дало «start (timeout=3.0s)» и отмену через 3,3 с, 3 — «timeout=0.0s» и отмену через 0,36 с, 60000 — «timeout=60.0s»; значение из данных действия перекрывает operation_timeout/default манифеста (5). ↩↩↩

  74. fw-tv188b-261021-0117-r25.c010 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · DunePluginFw::invoke_operation в r25 обрабатывает get_folder_rows: вызывает $plugin->get_folder_rows(media_url, row_ids), а если метода нет — бросает Exception «Method not found: get_folder_rows»; get_out_type_code сопоставляет операции тип plugin_folder_rows ↩

  75. fw-tv188b-261021-0117-r25.c045 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Ленивая подгрузка строк в shell_ext/lib r25: интерфейс RowsScreen объявляет get_rows(MediaURL $media_url, $row_ids); DefaultDunePlugin::get_folder_rows($media_url_str, $row_ids) находит экран по media_url и вызывает его get_rows; AbstractRowsScreen::get_rows по умолчанию бросает исключение («override it to use lazy rows loading») ↩

  76. fw-tv188b-261021-0117-r25.c017 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В libduneshell.so r25 есть строка «create_fs_ctl_action_from_xml(): not implemented», тогда как для cond, load_and_scale_image, apply_hash_dirties и update_special_favorite_folder есть create_*_action_from_xml() без такой пометки ↩

  77. fw-tv188b-261021-0117-r25--php-framework.c022 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Манифест downloads задаёт is_shown_action первой entry_point как cond с pattern is_plugin_file(dunemdb_supplier_online_movies/__v2); post_action в этом действии не задан. ↩

  78. fw-tv188b-261021-0117-r25.c026 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · firmware_features.txt r25 содержит новый флаг downloads ↩

  79. fw-tv188b-261021-0117-r25.c025 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · ConfigUtils::load_firmware_features() в r25 убирает флаг downloads из набора, если есть файл /tmp/flm.txt (комментарий: оболочка создаёт его для «lite»-лицензии без загрузок) ↩↩

  80. fw-tv188b-261021-0117-r25.c053 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Новый ключ описателя поставщика dl_capable (r25): первый поставщик с dl_capable становится dl-поставщиком (кнопка «Загрузки», Suppliers::get_dl_sup), только если в firmware_features есть флаг downloads ↩

  81. fw-tv188b-261021-0117-r25.c066 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Экран программы встроенного плагина ext_epg r25 выводит метки по ключам imdb_rating, kinopoisk_rating, rating_ru и producer (kinopoisk_rating и producer — новые относительно r24) ↩

  82. fw-tv188b-261021-0117-r25--gui-resources.c020 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 в базовом скине добавлен special_icons/kp.png (2329 байт), в r24 его нет; остальные 742 записи firmware/skin/ совпадают; ext_epg использует gui_skin://special_icons/kp.png. ↩

  83. fw-tv188b-261021-0117-r25.c064 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · libduneshell.so r25 содержит декодер WebP: исходник src/common/mt/webp_decoding.c, функцию decode_webp_image и сообщения «webp E: …» ↩

  84. fw-tv188b-260827-0003-r24--php-framework.c080 · code · tv188b, android-dune-fw; прошивка 250815_1012_r22, 260827_0003_r24 · В dune_api.php 250815_1012_r22 (tv188b) нет классов ChangeMovieDataActionData, ChooseFileActionData, CreateNetworkFolderActionData, CustomIgnoreUpdateActionData, EditMovieDataActionData, FileChooserFilter, FileChooserUiParams, PluginExitFoldersActionData, PluginStreamInfo, PluginTvChannelChange, PluginUpdateTvInfoActionData, PluginVodGetStreamInfoInputData, StreamMarker, SyncMyCollectionActionData, WakeNetworkFolderActionData и соответствующих ACTION_ID, STREAM_MARKER, PLUGIN_OP_GET_VOD_STREAM_INFO, GUI_EVENT_CONFIRM_UPDATE, GUI_EVENT_KEY_FAVORITES, GUI_EVENT_NETWORK_CHANGE, GUI_EVENT_TOPMENU_REFRESH; в 260827_0003_r24 они есть ↩

  85. fw-tv188b-260827-0003-r24--php-framework.c079 · code · tv188b, android-dune-fw; прошивка 250815_1012_r22, 260827_0003_r24 · В 250815_1012_r22 (tv188b) DunePluginFw::invoke_operation не обрабатывает get_vod_stream_info, а в get_out_type_code нет PLUGIN_OP_GET_VOD_STREAM_INFO; в 260827_0003_r24 они есть ↩

  86. fw-tv188b-260827-0003-r24--php-framework.c082 · code · tv188b, tv175u, android-dune-fw; прошивка 240619_0210_r22, 250815_1012_r22, 260724_0207_r24, 260827_0003_r24 · bootstrap.php, dune_config.php, dune_plugin.php и dunelib/dune_countries.php одинаковы (sha256) в tv175u 240619_0210_r22, tv188b 250815_1012_r22 и r24-прошивках; dunelib/config_utils, dune_languages, expr, utils в r22-прошивках отсутствуют ↩

  87. fw-tv188b-260827-0003-r24--movie-suppliers.c077 · code · tv188b, android-dune-fw; прошивка 250815_1012_r22 · В 250815_1012_r22 youtube регистрировался сам: global_actions boot_end/install/update с условием not(firmware_feature(movie_suppliers_update)) запускали bin/register_supplier.sh, писавший описатель прямо в $FS_PREFIX/tmp/movie_suppliers/YouTube ↩

  88. fw-tv188b-260827-0003-r24--movie-suppliers--stream-protocol.c062 · code · tv188b, android-dune-fw; прошивка 250815_1012_r22 · В 250815_1012_r22 Suppliers (shell_ext/movies/suppliers.php) задаёт тот же контракт потоковых команд, что и r24: те же ограничения seasons/episodes в get_episodes, те же ключи playback_url (movie_id, s, e, ass_type, sup_id, is_current, file_id, stream_url), та же проверка url ответа get_stream_url ↩

  89. plg-gh-kocourkuba-proiptv.c032 · code · unknown; прошивка — · Starnet_Entry_Handler при rev_number ≤ 21 (не is_r22_or_higher) показывает диалог err_too_old_player, а без класса SQLite3 — err_no_sqlite, и дальше не обрабатывает вход (кроме confirm_update, который проверяется раньше). ↩

  90. fw-tv188b-260827-0003-r24--php-framework.c056 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · HD::http_get_document по умолчанию отключает проверку TLS-сертификата (CURLOPT_SSL_VERIFYPEER=false), следует редиректам, ставит CURLOPT_ENCODING=1 и тайм-ауты из $DEFAULT_CURL_*; опции вызывающего применяются поверх ↩

  91. fw-tv188b-261021-0117-r25--libphp5.c050 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · www.ssl.com на tv188b r25 из php_server (uid 1000) с полным бандлом, без корня Entrust и только с корнем Entrust при включённой проверке TLS даёт errno 60 «self signed certificate in certificate chain»; без проверки — HTTP 200, а цепочка заканчивается самоподписанным SSL.com TLS RSA Root CA 2022. ↩

  92. fw-tv188b-260827-0003-r24--php-framework.c057 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Если вызывающий передал CURLOPT_SSL_VERIFYPEER=true для https-URL, HD::http_get_document подставляет CURLOPT_CAINFO=/firmware/certs/ca-bundle.crt ↩

    • fw-tv188b-261021-0117-r25--libphp5.c001 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствует строка PHP/5.3.6.
    • fw-tv188b-261021-0117-r25--libphp5.c002 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В зонде kb_probe5 на tv188b 261021_0117_r25 значение PHP_VERSION равно 5.3.6.

    ↩

    • fw-tv188b-261021-0117-r25--libphp5.c009 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена JSON: json_encode, json_decode, json_last_error.
    • fw-tv188b-261021-0117-r25--libphp5.c010 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена cURL: curl_init, curl_copy_handle, curl_version, curl_setopt, curl_setopt_array, curl_exec, curl_getinfo, curl_error, curl_errno, curl_close.
    • fw-tv188b-261021-0117-r25--libphp5.c014 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена mbstring: mb_strlen, mb_substr, mb_convert_encoding, mb_detect_encoding, mb_check_encoding.
    • fw-tv188b-261021-0117-r25--libphp5.c015 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена iconv: iconv_strlen, iconv_substr, iconv_mime_decode, iconv_get_encoding, iconv_set_encoding.
    • fw-tv188b-261021-0117-r25--libphp5.c016 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена PCRE: preg_match, preg_match_all, preg_replace, preg_split, preg_last_error.
    • fw-tv188b-261021-0117-r25--libphp5.c017 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена OpenSSL: openssl_encrypt, openssl_decrypt, openssl_sign, openssl_verify, openssl_random_pseudo_bytes.
    • fw-tv188b-261021-0117-r25--libphp5.c018 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена pcntl: pcntl_fork, pcntl_waitpid, pcntl_signal, pcntl_signal_dispatch, pcntl_exec.
    • fw-tv188b-261021-0117-r25--libphp5.c019 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена posix: posix_getuid, posix_getpid, posix_kill, posix_setuid.
    • fw-tv188b-261021-0117-r25--libphp5.c020 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена sockets: socket_create, socket_connect, socket_select, socket_read, socket_write.
    • fw-tv188b-261021-0117-r25--libphp5.c021 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена XML: simplexml_load_string, xml_parser_create, libxml_use_internal_errors.
    • fw-tv188b-261021-0117-r25--libphp5.c022 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена классов XML/SOAP/ZIP/SQLite: DOMDocument, SoapClient, ZipArchive, SQLite3.

    ↩

    • fw-tv188b-261021-0117-r25--libphp5.c006 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствует версия OpenSSL 1.0.1u от 22 Sep 2016.
    • fw-tv188b-261021-0117-r25--libphp5.c026 · code · android-dune-fw; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24 · В strings библиотек libcurl сборок tv188b r22, r24, r25 и tv175u r24 присутствует libcurl/7.67.0.
    • fw-tv188b-261021-0117-r25--libphp5.c028 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · Наборы имён curl_multi_* (12) и CURLOPT_* (111) в strings libphp5.so совпадают у всех пяти исследованных сборок.

    ↩

    • fw-tv188b-261021-0117-r25--libphp5.c036 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · CA-бандлы всех пяти исследованных сборок совпадают по SHA-256 722be2869ed2c2a949e5edb75b030f1e737e869ca8e8f70bc8d876dd93227ead.
    • fw-tv188b-261021-0117-r25--libphp5.c037 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · Заголовки CA-бандлов пяти исследованных сборок датируют данные Mozilla 11 октября 2022 года.

    ↩

    • fw-tv188b-260827-0003-r24.c063 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в окружении dunehd_service (pid 587) есть FS_PREFIX=/data/data/com.dunehd.app, HD_APK=1, HD_FW_APK=1, HD_HTTP_LOCAL_PORT=80 и DUNEHD_SERVICE_DONT_FORK=1, а PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin.
    • fw-tv188b-261021-0117-r25.c091 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у процесса network_manager ($FS_PREFIX/firmware/bin/network_manager, PPID 1) в окружении HD_HTTP_LOCAL_PORT=80, HD_FW_APK=1, HD_APK=1, FS_PREFIX=/data/data/com.dunehd.app, LOG_DIR=/tmp/run, DUNEHD_SERVICE_DONT_FORK=1, PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin, а LD_LIBRARY_PATH=$FS_PREFIX/firmware/lib:/lib:/usr/lib (без /system/xbin/dunehd/firmware/lib).
    • fw-tv188b-261021-0117-r25.c092 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у процесса httpd ($FS_PREFIX/bin/httpd, PPID 1) в окружении HD_HTTP_LOCAL_PORT=80, HD_FW_APK=1, HD_APK=1, FS_PREFIX=/data/data/com.dunehd.app, LOG_DIR=/tmp/run, DUNEHD_SERVICE_DONT_FORK=1, PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin, а LD_LIBRARY_PATH=$FS_PREFIX/firmware/lib:/lib:/usr/lib (без /system/xbin/dunehd/firmware/lib).

    ↩

    • fw-tv188b-260827-0003-r24.c054 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 три процесса php_server (shell_ext, dune-hd.tv, android_apps) работают от пользователя system с SELinux-меткой u:r:system_app:s0; их родитель — com.dunehd.app (PPID 25631), а UID пакета приложения — 1000 (sharedUser android.uid.system/1000).
    • fw-tv188b-261021-0117-r25.c240 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 PHP-скрипт CGI плагина (php-cgi через CGI-обёртку) работает с posix_getuid() = 0, а php_server того же плагина — с uid 1000.

    ↩

    • fw-tv188b-261021-0117-r25.c152 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 CGI плагина, запущенный httpd через run_plugin_cgi, работает под uid=0(root) gid=0(root) с SELinux-контекстом u:r:shell:s0.
    • fw-tv188b-260827-0003-r24.c058 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 HTTP-сервер «httpd -h /data/data/com.dunehd.app/tmp/www» (pid 1843) работает от root с SELinux-меткой u:r:shell:s0 и PPID 1.

    ↩

    • fw-tv188b-260827-0003-r24--init-runtime--dunehd-service.c001 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 250815_1012_r22, 261021_0117_r25 · Клиент dunehd_service имеет одинаковые размер, SHA-256 и режим доступа в tv188b r22 (250815_1012), r24 (260827_0003) и r25 (261021_0117).
    • fw-tv188b-260827-0003-r24--init-runtime--dunehd-service.c002 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 250815_1012_r22, 261021_0117_r25 · Сервисный ELF dunehd_service имеет одинаковые размер, SHA-256 и режим доступа в tv188b r22 (250815_1012), r24 (260827_0003) и r25 (261021_0117).
    • fw-tv188b-260827-0003-r24--init-runtime--dunehd-service.c003 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 250815_1012_r22, 261021_0117_r25 · Обёртка dunehd_service.sh имеет одинаковые размер, SHA-256 и режим доступа в tv188b r22 (250815_1012), r24 (260827_0003) и r25 (261021_0117).
    • fw-tv188b-260827-0003-r24--init-runtime--dunehd-service.c004 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 250815_1012_r22, 261021_0117_r25 · Файл окружения dunehd_service.env имеет одинаковые размер, SHA-256 и режим доступа в tv188b r22 (250815_1012), r24 (260827_0003) и r25 (261021_0117).

    ↩

    • plg-sdk-demo2.c135 · code · android-dune-fw; прошивка 261021_0117_r25 · DunePluginFw r25 вызывает базовые get_folder_view/get_next_folder_view/get_tv_info/get_tv_stream_url/get_vod_info/get_vod_stream_url с media_url/cookies, если ветвь _v2 не выбрана.
    • plg-sdk-demo2.c134 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 интерфейс DunePlugin объявляет те же 11 основных операций, которые реализует DefaultDunePlugin demo2.

    ↩

  93. fw-tv188b-261021-0117-r25.c260 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 PHP-плагин, программа которого объявляет наследника DunePluginFw с методом call_plugin() и присваивает его экземпляр в DunePluginFw::$instance (зонд kb_probe6), загружается php_server и получает от оболочки операции handle_user_input и get_vod_stream_url. ↩

    • fw-tv188b-260827-0003-r24--movie-suppliers.c010 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · do_movie_suppliers_update запускает «sh /bin/movie_suppliers_update.sh» с парами аргументов (через escape_shell_arg) — только если строка «version_index:id1-id2…» отличается от сохранённой в /flashdata/plugins_data/<плагин>/movie_suppliers_params.txt; после запуска строка записывается туда
    • fw-tv188b-261021-0117-r25.c125 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 movie_suppliers_update.sh плагина-поставщика kb_probe6_sup запущен с парами аргументов « » (подпись равна id) для всех восьми id в порядке их перечисления в params/movie_suppliers манифеста.

    ↩

    • fw-tv188b-261021-0117-r25--app-launch.c001 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 определяет класс LaunchExtAppActionData с ключами (8) cmd, ensure_playback_stopped, delay, package, version, msg_toast, params, error_action — тот же набор, что в r24.
    • fw-tv188b-261021-0117-r25--app-launch.c016 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В r24 (tv188b) finalize_launch_cmd, plain_launch_app и чтение app_data.json в shell_ext/android_apps/model.php такие же, как в r25 (diff файлов — две строки, не про запуск).
    • fw-tv188b-261021-0117-r25--app-launch.c018 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25, 260827_0003_r24 · dune.apk tv188b (r24 и r25) — пакет com.dunehd.app с android:sharedUserId="android.uid.system".

    ↩

  94. fw-tv188b-261021-0117-r25--media-player.c038 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 261021_0117_r25 · subtitles.php в tv188b r24 и r25 имеет одинаковые размер 25911 байт и SHA256 b476a7eab854827cf514a5b02a644c7bc4ae5d4f8efd55629fc846fae32c249e. ↩

    • fw-tv188b-261021-0117-r25--gui-resources.c023 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · firmware/fonts/ r25 и r24 совпадают: 6 файлов, 0 изменённых.
    • fw-tv188b-261021-0117-r25--gui-resources.c022 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · on_screen_keyboards/ r25 и r24 совпадают: 7 файлов, 0 изменённых.
    • fw-tv188b-261021-0117-r25--gui-resources.c021 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · alternative_skins/ r25 и r24 совпадают: 821 запись, 0 изменённых; Air 313, Black 192, Silver 316.
    • fw-tv188b-261021-0117-r25--gui-resources.c020 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 в базовом скине добавлен special_icons/kp.png (2329 байт), в r24 его нет; остальные 742 записи firmware/skin/ совпадают; ext_epg использует gui_skin://special_icons/kp.png.

    ↩

  95. fw-tv188b-260827-0003-r24--shell-ext--ui-lib--gcomp-list.c046 · code · android-dune-fw; прошивка 261021_0117_r25 · Извлечённый gcomp_list.php в tv188b 261021_0117_r25 побайтно совпадает с разобранной копией 260827_0003_r24 (550 строк). ↩

  96. fw-tv188b-260827-0003-r24--movie-suppliers--movie-services.c040 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Файлы movies/suppliers_config.php и movies/movie_services_config.php в shell_ext r25 побайтно совпадают с r24. ↩

  97. fw-tv188b-261021-0117-r25--network-services.c063 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25, 260827_0003_r24 · init_network.sh, init_torrents.sh, udhcpc_callback.sh и smb.bash в r24 и r25 совпадают побайтово: размеры и SHA-256 в tree.tsv одинаковые. ↩

    • fw-tv188b-261021-0117-r25.c368 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 261021_0117_r25 · В образах r24 и r25 есть text-файл system/system/dunehd/firmware/scripts/ffmpeg.sh размером 457 байт с sha256 b26df76585300fd394662fbd02cdb3555cb0b1fd8a9859e5a7d0e876eef867df; в обеих версиях он одинаков.
    • fw-tv188b-261021-0117-r25.c369 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 261021_0117_r25 · В образах r24 и r25 system/system/dunehd/firmware/bin/ffmpeg — симлинк на /data/data/com.dunehd.app/lib/libxxx_ffmpeg.so.

    ↩

    • fw-tv188b-260827-0003-r24--php-framework.c056 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · HD::http_get_document по умолчанию отключает проверку TLS-сертификата (CURLOPT_SSL_VERIFYPEER=false), следует редиректам, ставит CURLOPT_ENCODING=1 и тайм-ауты из $DEFAULT_CURL_*; опции вызывающего применяются поверх
    • fw-tv188b-261021-0117-r25.c366 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 HD::http_get_document() и HD::http_server_responding() по умолчанию ставят CURLOPT_SSL_VERIFYPEER=false.
    • fw-tv188b-260827-0003-r24--php-framework.c057 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Если вызывающий передал CURLOPT_SSL_VERIFYPEER=true для https-URL, HD::http_get_document подставляет CURLOPT_CAINFO=/firmware/certs/ca-bundle.crt
    • fw-tv188b-261021-0117-r25.c367 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 HD::http_get_document() добавляет CURLOPT_CAINFO=/firmware/certs/ca-bundle.crt только если в $opts передан истинный CURLOPT_SSL_VERIFYPEER и URL начинается с https://, после чего применяет $opts к хендлу; вызывающий может включить проверку, но CAINFO принудительно становится бандлом прошивки (переданный в $opts CAINFO перезаписывается).

    ↩

    • fw-tv188b-261021-0117-r25.c008 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 добавляет идентификаторы GUI-действий APPLY_HASH_DIRTIES_ACTION_ID='apply_hash_dirties', COND_ACTION_ID='cond', FS_CTL_ACTION_ID='fs_ctl', LOAD_AND_SCALE_IMAGE_ACTION_ID='load_and_scale_image', UPDATE_SPECIAL_FAVORITE_FOLDER_ACTION_ID='update_special_favorite_folder' (в r24 их нет)
    • fw-tv188b-261021-0117-r25.c013 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25: CondActionData {pattern, post_action}, LoadAndScaleImageActionData {icon_url, local_path, scale_if_needed, icon_width, icon_height, post_action}, UpdateSpecialFavoriteFolderActionData {name, delete, skip_interactions, post_action}, ApplyHashDirtiesActionData {post_action}
    • fw-tv188b-261021-0117-r25.c017 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В libduneshell.so r25 есть строка «create_fs_ctl_action_from_xml(): not implemented», тогда как для cond, load_and_scale_image, apply_hash_dirties и update_special_favorite_folder есть create_*_action_from_xml() без такой пометки

    ↩

    • fw-tv188b-261021-0117-r25.c008 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 добавляет идентификаторы GUI-действий APPLY_HASH_DIRTIES_ACTION_ID='apply_hash_dirties', COND_ACTION_ID='cond', FS_CTL_ACTION_ID='fs_ctl', LOAD_AND_SCALE_IMAGE_ACTION_ID='load_and_scale_image', UPDATE_SPECIAL_FAVORITE_FOLDER_ACTION_ID='update_special_favorite_folder' (в r24 их нет)
    • fw-tv188b-261021-0117-r25.c012 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 вводит файловые команды для действия fs_ctl: перечисление FsCmdKind (resolve_url, stat, scandir, get_file) и классы FsCtlActionData {cmd, output_path, post_action}, FsCmdDef {kind, specific_def}, FsResolveUrlDef {url, try_mount_if_needed}, FsStatDef {path}, FsScandirDef {path, with_stat, max_items_count}, FsGetFileDef {path, target_path, skip, max_size, chunk_size}
    • fw-tv188b-261021-0117-r25.c017 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В libduneshell.so r25 есть строка «create_fs_ctl_action_from_xml(): not implemented», тогда как для cond, load_and_scale_image, apply_hash_dirties и update_special_favorite_folder есть create_*_action_from_xml() без такой пометки

    ↩

  98. fw-tv188b-261021-0117-r25.c012 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 вводит файловые команды для действия fs_ctl: перечисление FsCmdKind (resolve_url, stat, scandir, get_file) и классы FsCtlActionData {cmd, output_path, post_action}, FsCmdDef {kind, specific_def}, FsResolveUrlDef {url, try_mount_if_needed}, FsStatDef {path}, FsScandirDef {path, with_stat, max_items_count}, FsGetFileDef {path, target_path, skip, max_size, chunk_size} ↩

    • fw-tv188b-261021-0117-r25.c008 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 добавляет идентификаторы GUI-действий APPLY_HASH_DIRTIES_ACTION_ID='apply_hash_dirties', COND_ACTION_ID='cond', FS_CTL_ACTION_ID='fs_ctl', LOAD_AND_SCALE_IMAGE_ACTION_ID='load_and_scale_image', UPDATE_SPECIAL_FAVORITE_FOLDER_ACTION_ID='update_special_favorite_folder' (в r24 их нет)
    • fw-tv188b-261021-0117-r25.c013 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25: CondActionData {pattern, post_action}, LoadAndScaleImageActionData {icon_url, local_path, scale_if_needed, icon_width, icon_height, post_action}, UpdateSpecialFavoriteFolderActionData {name, delete, skip_interactions, post_action}, ApplyHashDirtiesActionData {post_action}

    ↩↩↩

  99. fw-tv188b-261021-0117-r25.c009 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 вводит операцию плагина PLUGIN_OP_GET_FOLDER_ROWS='get_folder_rows' с выходным типом PLUGIN_OUT_DATA_PLUGIN_FOLDER_ROWS='plugin_folder_rows' и классы PluginFolderRowsInputData {media_url, row_ids} и PluginFolderRows {rows} ↩

  100. fw-tv188b-261021-0117-r25.c011 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 описывает строки с ленивой подгрузкой: тип строки PLUGIN_ROW_TYPE_DUP='row_dup', опции PLUGIN_ROW_OPT_LOADING=0x4 и PLUGIN_ROW_OPT_OPTIMIZE_INVISIBLE=0x8, поле PluginRowsPane::row_dup_map, PluginFolderView::type_mask и GCOMP_OPT_STUB=0x400000 ↩

    • fw-tv188b-261021-0117-r25.c011 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 описывает строки с ленивой подгрузкой: тип строки PLUGIN_ROW_TYPE_DUP='row_dup', опции PLUGIN_ROW_OPT_LOADING=0x4 и PLUGIN_ROW_OPT_OPTIMIZE_INVISIBLE=0x8, поле PluginRowsPane::row_dup_map, PluginFolderView::type_mask и GCOMP_OPT_STUB=0x400000
    • fw-tv188b-261021-0117-r25--php-framework.c015 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля PluginRowsPane: row_dup_map — (PluginRowMap *).
    • fw-tv188b-261021-0117-r25--php-framework.c016 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля PluginFolderView: type_mask — int.

    ↩

    • fw-tv188b-261021-0117-r25.c014 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 добавляет поля в существующие классы: FileChooserUiParams::{with_network_folders, with_network_browser, new_folder_default_name}, PluginSystemActionData::handle_response
    • fw-tv188b-261021-0117-r25--php-framework.c013 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля FileChooserUiParams: with_network_folders — bool; with_network_browser — bool; new_folder_default_name — (char *).

    ↩

  101. fw-tv188b-261021-0117-r25.c014 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 добавляет поля в существующие классы: FileChooserUiParams::{with_network_folders, with_network_browser, new_folder_default_name}, PluginSystemActionData::handle_response ↩

  102. fw-tv188b-261021-0117-r25.c021 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Новый dunelib/installed_plugins.php (r25): класс InstalledPlugins читает /tmp/run/installed_plugins.xml (INSTALLED_PLUGINS_FILE) и кэширует список, перечитывая файл при смене mtime; методы get_by_name($plugins, $name), reload(), ensure_loaded() ↩

  103. fw-tv188b-261021-0117-r25.c024 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В HD (dunelib/utils.php) r25 добавлены статические методы ensure_empty_file($path), log_elapsed($msg, $start_tm, $suffix=''), read_int($path, $def=0), read_string($path, $def='') ↩

  104. fw-tv188b-261021-0117-r25.c027 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dunelib/dl_state.php (r25): DlState отправляет команды менеджеру загрузок JSON-файлами в /tmp/run/dl_input/<время>.<…>.in с cmd_type add (id, name, total, files[path, url, size_mb, ext_ts], params), remove, pause, resume (group_id, file_paths), start_ts, change_dl_folder, test_dl_folder ↩

  105. fw-tv188b-261021-0117-r25.c023 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · HD::http_get_document в r25 пишет в лог « http <метод>: » (метод — CURLOPT_CUSTOMREQUEST, иначе POST при CURLOPT_POSTFIELDS, иначе GET) и « http DATA: …» вместо «HTTP fetching»/«HTTP POST fields»; сообщения об ошибках — в нижнем регистре («http request failed (код)») ↩↩

    • fw-tv188b-261021-0117-r25.c022 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В dunelib/utils.php r25 нет метода HD::make_json_rpc_request: между encode_props и get_mac_addr, где он стоял в r24, его нет
    • fw-tv188b-261021-0117-r25--php-framework.c059 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 после include dunelib/utils.php зонд увидел класс HD и method_exists(HD,make_json_rpc_request)=false; прямой вызов завершился E_ERROR Call to undefined method HD::make_json_rpc_request(), а не JSON-ответом.

    ↩

    • fw-tv188b-260827-0003-r24.c040 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · По сравнению с 250815_1012_r22 в firmware_features.txt r24 добавлены флаги dunemdb_supplier_plugin_api_v7, sup_api_v8, movie_suppliers_order, lcfg_v2, light_stop
    • fw-tv188b-261021-0117-r25.c101 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 /tmp/firmware_features.txt — по флагу в строке: tmpfs, dunemdb_supplier_plugin_api_v2…v7, sup_api_v8, tv_config, newgui2021, app_root_url_type, movie_suppliers_update, movie_suppliers_order, url_sdcard, lcfg_v2, light_stop, apk, fw_apk, drm_apps, downloads.

    ↩

    • fw-tv188b-260827-0003-r24--firmware-config.c010 · code · android-dune-fw; прошивка 260827_0003_r24 · firmware_features.txt объявляет 19 флагов возможностей: tmpfs, dunemdb_supplier_plugin_api_v2, dunemdb_supplier_plugin_api_v3, dunemdb_supplier_plugin_api_v4, dunemdb_supplier_plugin_api_v5, dunemdb_supplier_plugin_api_v6, dunemdb_supplier_plugin_api_v7, sup_api_v8, tv_config, newgui2021, app_root_url_type, movie_suppliers_update, movie_suppliers_order, url_sdcard, lcfg_v2, light_stop, apk, fw_apk, drm_apps.
    • fw-tv188b-261021-0117-r25.c101 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 /tmp/firmware_features.txt — по флагу в строке: tmpfs, dunemdb_supplier_plugin_api_v2…v7, sup_api_v8, tv_config, newgui2021, app_root_url_type, movie_suppliers_update, movie_suppliers_order, url_sdcard, lcfg_v2, light_stop, apk, fw_apk, drm_apps, downloads.

    ↩

    • fw-tv188b-260827-0003-r24--movie-suppliers.c049 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · firmware_features.txt прошивки 260827_0003_r24 содержит флаги movie_suppliers_update и movie_suppliers_order
    • fw-tv188b-261021-0117-r25.c101 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 /tmp/firmware_features.txt — по флагу в строке: tmpfs, dunemdb_supplier_plugin_api_v2…v7, sup_api_v8, tv_config, newgui2021, app_root_url_type, movie_suppliers_update, movie_suppliers_order, url_sdcard, lcfg_v2, light_stop, apk, fw_apk, drm_apps, downloads.

    ↩

    • fw-tv188b-261021-0117-r25.c026 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · firmware_features.txt r25 содержит новый флаг downloads
    • fw-tv188b-261021-0117-r25.c025 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · ConfigUtils::load_firmware_features() в r25 убирает флаг downloads из набора, если есть файл /tmp/flm.txt (комментарий: оболочка создаёт его для «lite»-лицензии без загрузок)
    • fw-tv188b-261021-0117-r25.c115 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 файла /tmp/flm.txt нет.

    ↩

  106. fw-tv188b-261021-0117-r25.c006 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 в firmware_ext/plugins 15 каталогов встроенных плагинов с dune_plugin.xml: к 13 из r24 добавлены downloads и s928x_dvfel ↩

  107. fw-tv188b-261021-0117-r25.c007 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Новые исполняемые файлы Dune в r25: libxxx_dl_manager.so, libxxx_lcconv.so, libxxx_vsftpd.so в /system/bin; симлинки firmware/bin/dl_manager, firmware/bin/lcconv и firmware_ext/ftpserver/bin/vsftpd ведут в /data/data/com.dunehd.app/lib/ ↩

  108. fw-tv188b-261021-0117-r25--network-services.c035 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 появились скрипты add_atv_route.sh, usbnet_nat_fast_repair.sh и usbnet_nat_full_repair.sh; в r24 этих файлов нет (в отсортированном tree.tsv r24 add_atv_route.sh отсутствует между dune_keyboard_russian_low.txt и bd_upgrade.sh, а repair-скрипты — между umount_loop.sh и usbnet_nat_setup.sh). ↩

  109. fw-tv188b-261021-0117-r25.c036 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Манифест bluray в r25 без global_actions: после сразу php; файлы bin/start.sh и bin/stop.sh удалены (в bin/ остались init.sh и plugin_env.sh) ↩

  110. fw-tv188b-261021-0117-r25.c070 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В экране audio menu_config.xml r25 есть кнопка button_additional_audio_settings, а настроек native_sample_rate, start_silence_for_audio_files и disable_usb_audio, которые были в этом экране r24, нет. ↩

  111. fw-tv188b-261021-0117-r25.c069 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · menu_config.xml r25 содержит экран настроек ftp_server с настройками ftp_server_enabled, ftp_server_anonymous_access, ftp_server_user_name и ftp_server_password. ↩

  112. fw-tv188b-261021-0117-r25--plugin-loader.c016 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В strings libduneshell.so r25 есть шаблон запроса req %lld/%s->%s(%s.%s); в r24 был req %lld (%s->%s/%s). ↩

  113. fw-tv188b-261021-0117-r25--plugin-loader.c013 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В strings libduneshell.so r25 шаблоны start и cancelling by timeout используют (%s.%s) вместо (%s) в r24; сообщение [plugin] showing progress dialog сохранено. ↩

  114. fw-tv188b-261021-0117-r25--plugin-loader.c014 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В strings libduneshell.so r25 шаблоны canceled и finished with status используют (%s.%s) вместо (%s) в r24, сохраняя формат длительности %.3fs. ↩

  115. fw-tv188b-261021-0117-r25--plugin-loader.c015 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В strings libduneshell.so r25 шаблоны result action, result action null и result status используют (%s.%s) вместо (%s) в r24. ↩

    • fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c030 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 (261021_0117_r25) набор сообщений исполнителя операций тот же, добавлены «plugin_opexec I: waiting for mc index validation», «plugin_opexec I: mc index now valid» и «plugin_opexec D: %s: %s» (вместо «still working...»), а сообщения операции получили формат «%s->%s(%s.%s)».
    • fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c044 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в запросе 9 при PLUGIN_OPEXEC = 1 в shell.log шли «plugin_opexec D: new activated req 92/…», «plugin_opexec D: req 93/…: still working...» и «plugin_opexec D: a-removing req 93/…»; сообщений «canceling req» в сохранённом выводе C1 нет.

    ↩

  116. fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c032 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 строки форка автопроверки изменились: вместо «fork(grand-child)» и «grand-child process is started with pid %d» — «grand-child process %d» и новое «hd_debug: plugin online upgrade forked with the log held»; остальные строки plugin_updater, plugin online upgrade и plugin_archive те же (кроме исчезнувшей plugin_archive_async_loader) ↩

    • fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c029 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в /tmp/run лежат .log и .pid плагинов с работающим php_server (android_apps, dune-hd.tv, shell_ext); .pid датированы 15:40, логи — 15:40–15:41
    • fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c036 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 php_server содержит путь /tmp/run/%s.pid и импорт FS_writestring, которых нет в strings php_server r24

    ↩

    • doc-sdk-dune-devel-info.c001 · doc · any-documented; прошивка — · На ATV и Android 11+ AOSP к путям /config, /tmp, /flashdata, /firmware и /firmware_ext нужно добавлять префикс FS_PREFIX /data/data/com.dunehd.app; в других разделах документации этот префикс может быть опущен, и тогда его добавляют самостоятельно.
    • fw-tv188b-261021-0117-r25.c254 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в файловых функциях встроенного PHP (php_server и php-cgi) realpath('/config') = /data/data/com.dunehd.app/config, realpath('/firmware') = /system/dunehd/firmware, realpath('/firmware_ext/php') = /system/dunehd/firmware_ext/php, хотя в корне ФС (adb shell) /firmware и /firmware_ext нет, а /config — другой каталог.
    • fw-tv188b-261021-0117-r25.c255 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 во встроенном PHP (php_server и php-cgi CGI плагина) путь /flashdata существует: is_dir('/flashdata') = true, realpath — /data/data/com.dunehd.app/flashdata, хотя в корне ФС (adb shell) /flashdata нет.

    ↩

    • doc-sdk-dune-devel-info.c002 · doc · any-documented; прошивка — · В PHP-плагинах и CGI-программах переменная окружения FS_PREFIX равна /data/data/com.dunehd.app на ATV и Android 11+ AOSP и не установлена на остальных платформах.
    • fw-tv188b-261021-0117-r25.c350 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 команды зонда из php_server (uid 1000) дают FS_PREFIX=/data/data/com.dunehd.app; which wget и command -v wget возвращают /data/data/com.dunehd.app/bin/wget.
    • fw-tv188b-261021-0117-r25.c092 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у процесса httpd ($FS_PREFIX/bin/httpd, PPID 1) в окружении HD_HTTP_LOCAL_PORT=80, HD_FW_APK=1, HD_APK=1, FS_PREFIX=/data/data/com.dunehd.app, LOG_DIR=/tmp/run, DUNEHD_SERVICE_DONT_FORK=1, PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin, а LD_LIBRARY_PATH=$FS_PREFIX/firmware/lib:/lib:/usr/lib (без /system/xbin/dunehd/firmware/lib).
    • fw-tv188b-260827-0003-r24.c063 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в окружении dunehd_service (pid 587) есть FS_PREFIX=/data/data/com.dunehd.app, HD_APK=1, HD_FW_APK=1, HD_HTTP_LOCAL_PORT=80 и DUNEHD_SERVICE_DONT_FORK=1, а PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin.
    • fw-tv188b-260827-0003-r24.c021 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Скрипт /system/xbin/dunehd/init монтирует tmpfs в /tmp, запускает dunehd_service и выставляет FS_PREFIX=/data/data/com.dunehd.app, HD_APK=1, HD_FW_APK=1, HD_HTTP_LOCAL_PORT=80

    ↩

    • doc-sdk-dune-devel-info.c003 · doc · any-documented; прошивка — · В PHP-плагинах и CGI-программах переменная окружения HD_APK равна 1 на ATV и Android 11+ AOSP и не установлена на остальных платформах.
    • fw-tv188b-261021-0117-r25.c359 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина kb_probe8 (pid 3005, ppid 2449, uid 1000) HD_APK=1.
    • fw-tv188b-260827-0003-r24.c063 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в окружении dunehd_service (pid 587) есть FS_PREFIX=/data/data/com.dunehd.app, HD_APK=1, HD_FW_APK=1, HD_HTTP_LOCAL_PORT=80 и DUNEHD_SERVICE_DONT_FORK=1, а PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin.
    • fw-apk-260724-0207-r24--data-deploy.c034 · code · android-atv; прошивка 260724_0207_r24 · runDaemonProcess задаёт HD_APK=1; переменной HD_FW_APK среди его строк нет (const-string метода: LOG_DIR, HD_APK, HD_HTTP_LOCAL_PORT, FS_PREFIX, PATH, LD_LIBRARY_PATH, HOME, PWD, /tmp/run и пути)

    ↩

    • doc-sdk-dune-devel-info.c004 · doc · any-documented; прошивка — · В PHP-плагинах и CGI-программах переменная окружения HD_FW_APK равна 1 на Android 11+ AOSP (в тексте — «Anroid 11+ AOSP») и не установлена на остальных платформах.
    • fw-tv188b-261021-0117-r25.c360 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина kb_probe8 (pid 3005, ppid 2449, uid 1000) HD_FW_APK=1.
    • fw-tv188b-260827-0003-r24.c063 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в окружении dunehd_service (pid 587) есть FS_PREFIX=/data/data/com.dunehd.app, HD_APK=1, HD_FW_APK=1, HD_HTTP_LOCAL_PORT=80 и DUNEHD_SERVICE_DONT_FORK=1, а PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin.
    • fw-apk-260724-0207-r24--data-deploy.c034 · code · android-atv; прошивка 260724_0207_r24 · runDaemonProcess задаёт HD_APK=1; переменной HD_FW_APK среди его строк нет (const-string метода: LOG_DIR, HD_APK, HD_HTTP_LOCAL_PORT, FS_PREFIX, PATH, LD_LIBRARY_PATH, HOME, PWD, /tmp/run и пути)

    ↩

    • doc-sdk-dune-devel-info.c005 · doc · any-documented; прошивка — · В PHP-плагинах и CGI-программах переменная окружения HD_HTTP_LOCAL_PORT равна 11080 на ATV; на остальных платформах она пустая (старые версии прошивки) или равна 80 (новые версии прошивки).
    • fw-tv188b-261021-0117-r25.c361 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина kb_probe8 (pid 3005, ppid 2449, uid 1000) HD_HTTP_LOCAL_PORT=80.
    • fw-tv188b-260827-0003-r24.c063 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в окружении dunehd_service (pid 587) есть FS_PREFIX=/data/data/com.dunehd.app, HD_APK=1, HD_FW_APK=1, HD_HTTP_LOCAL_PORT=80 и DUNEHD_SERVICE_DONT_FORK=1, а PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin.
    • fw-apk-260724-0207-r24--data-deploy.c033 · code · android-atv; прошивка 260724_0207_r24 · runDaemonProcess задаёт HD_HTTP_LOCAL_PORT=11080 (константа HDConfig.HD_HTTP_LOCAL_PORT, подставлена в байткод как const/16 11080)

    ↩

    • doc-sdk-dune-devel-info.c006 · doc · any-documented; прошивка — · PHP-движок сам добавляет FS_PREFIX ко всем нужным путям, кроме команд, переданных аргументами в shell_exec() и system(); поэтому старый код PHP-плагина может полностью работать на новых платформах без изменений.
    • fw-tv188b-261021-0117-r25.c253 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 встроенный PHP (php_server и php-cgi CGI) в команде shell_exec добавляет $FS_PREFIX (/data/data/com.dunehd.app) к словам /tmp/…, /firmware/…, /config/…, /flashdata/… и к пути в одинарных кавычках ('/tmp/h'), но не к /etc/…, не к x/tmp/f и не к пути в двойных кавычках ("/tmp/g").

    ↩

    • doc-sdk-dune-devel-info.c007 · doc · any-documented; прошивка — · На Android 11+ AOSP каталог /tmp доступен и как $FS_PREFIX/tmp, и как /tmp.
    • fw-tv188b-261021-0117-r25.c291 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 tmp_dir_path у kb_probe5 = '/data/data/com.dunehd.app/tmp/plugins/kb_probe5' — путь /tmp/plugins/kb_probe5 с префиксом FS_PREFIX=/data/data/com.dunehd.app; is_dir() для него true.
    • fw-tv188b-261021-0117-r25.c329 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 php_server при старте пишет «Starting logging to '/data/data/com.dunehd.app/tmp/run/<плагин>.log' (<= 3072000)»; в окружении php_server LOG_DIR=/tmp/run и LOG_MAX_FILE_SIZE=3072000.

    ↩

    • doc-sdk-dune-devel-info.c008 · doc · any-documented; прошивка — · На последних ATV и Android 11+ AOSP процесс главного GUI Dune HD называется com.dunehd.app, а не com.dunehd.shell.
    • fw-tv188b-260827-0003-r24.c062 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 com.dunehd.app (pid 25631), его процесс :bg (pid 1590) и com.dunehd.systemui (pid 4952) работают от пользователя system с SELinux-меткой u:r:system_app:s0; userId пакета com.dunehd.app — 1000 (sharedUser android.uid.system/1000).
    • fw-tv188b-261021-0117-r25.c298 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На снимках tv188b r25 (collect4 и начало collect6, до установки зондов) работают три php_server — shell_ext, dune-hd.tv (программа /flashdata/plugins/dune-hd.tv/i24h.php) и android_apps; все — дочерние процессы com.dunehd.app с Uid 1000.

    ↩

    • doc-sdk-dune-devel-info.c009 · doc · any-documented; прошивка — · Если плагин содержит исполняемые shell-скрипты, их нельзя запускать напрямую: их нужно вызывать через sh или bash (пример «bash /path/to/script»).
    • fw-tv188b-261021-0117-r25.c080 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 global_action plugin_system с run_string «bin/ga.sh boot» (путь относительно каталога плагина) оболочка исполняет как «Running system(sh /data/data/com.dunehd.app/flashdata/plugins/kb_probe5/bin/ga.sh boot)» — с префиксом sh и абсолютным путём каталога плагина.
    • fw-tv188b-260827-0003-r24--http-api.c008 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · CGI-скрипт плагина запускается run_plugin_cgi как shell-скрипт (sh), а не напрямую: PHP-обработчик плагин должен вызвать сам
    • fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c012 · code · android-atv; прошивка 260724_0207_r24 · Если команда начинается с $FS_PREFIX или с пути, для которого _php_path_needs_prefix.part.0 не 0, и этот путь (после префикса) не начинается с /firmware/bin/ или /firmware_ext/php/, _php_add_fs_prefix_to_cmd начинает результат со строки «sh » (3 байта)

    ↩

    • plg-gh-kocourkuba-proiptv.c027 · code · unknown; прошивка — · Плагин сравнивает ревизию прошивки числом rev_number: is_r22_or_higher() — rev_number > 21, is_r24_or_higher() — > 22, is_r25_or_higher() — > 24 (при неразобранной версии rev_number=0).
    • plg-gh-kocourkuba-proiptv.c032 · code · unknown; прошивка — · Starnet_Entry_Handler при rev_number ≤ 21 (не is_r22_or_higher) показывает диалог err_too_old_player, а без класса SQLite3 — err_no_sqlite, и дальше не обрабатывает вход (кроме confirm_update, который проверяется раньше).

    ↩

  117. plg-gh-kocourkuba-proiptv.c036 · code · unknown; прошивка — · get_ffmpeg_path() при is_r25_or_higher() и наличии $FS_PREFIX/firmware/bin/ffmpeg использует его, иначе — свою сборку bin/ffmpeg-7.1.3 (для bin/media_check.sh); комментарий: «Firmware r25 and newer ships its own ffmpeg 7.1». ↩↩↩↩

  118. plg-gh-kocourkuba-proiptv.c029 · code · unknown; прошивка — · Вне APK get_platform_info() читает $FS_PREFIX/tmp/run/versions.txt как ini: нет файла или platform_kind не 'android' — платформа 'unsupported'; иначе platform=platform_kind, type=android_platform. ↩

  119. plg-gh-kocourkuba-proiptv.c028 · code · unknown; прошивка — · Плагин определяет оболочку-APK по переменным окружения: is_apk() — (bool)getenv('HD_APK'), is_fw_apk() — (bool)getenv('HD_FW_APK'), is_limited_apk() — is_apk() && !is_fw_apk(); is_android() — is_file('/system/dunehd/init'). ↩

  120. fw-tv188b-261021-0117-r25.c359 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина kb_probe8 (pid 3005, ppid 2449, uid 1000) HD_APK=1. ↩

  121. plg-gh-kocourkuba-proiptv.c081 · code · unknown; прошивка — · В get_platform_info() при is_null($platform) (static-кэш пуст) и истинном is_apk() — это первая ветвь, до else if (!is_dune()) и else — platform='android'; внутри неё type='fw_apk' при истинном is_fw_apk(), иначе type='apk'; versions.txt эта ветвь не читает (parse_ini_file — в ветви else). ↩

    • plg-gh-kocourkuba-proiptv.c022 · code · android-dune-fw; прошивка 250815_1012_r22 · php_r22/dune_api.php и php_r22/dune_plugin_fw.php побайтно совпадают с dune_api.php и dune_plugin_fw.php прошивки tv188b 250815_1012_r22 (одинаковые sha256 в tree.tsv); копии php_apk_r22/ этих файлов — те же.
    • plg-gh-kocourkuba-proiptv.c023 · code · android-dune-fw; прошивка 260827_0003_r24, 260724_0207_r24 (APK), 261021_0117_r25 · php_r24/dune_api.php, php_r24/dune_plugin_fw.php и php_r24/include/dunelib/{config_utils,utils}.php побайтно совпадают с одноимёнными файлами прошивки tv188b 260827_0003_r24 и APK 260724_0207_r24 (одинаковые sha256 в tree.tsv); с r25 (261021_0117) dune_api.php и dune_plugin_fw.php уже не совпадают.

    ↩

  122. plg-dc-globaltv--lib.c001 · code · android-dune-fw; прошивка 260827_0003_r24 · В копиях lib Global TV 260130_1351 и shell_ext/lib tv188b r24 побайтово тождественна группа поддержки архивов: archive.php, archive_cache.php. ↩

    • plg-dc-globaltv--lib.c070 · code · android-dune-fw; прошивка 260827_0003_r24 · В ActionFactory::show_error плагина поля stop_playback/retry_delay_ms добавляются при defined(stop_playback), а r24 записывает их без проверки defined.
    • plg-dc-globaltv--lib.c071 · code · android-dune-fw; прошивка 260827_0003_r24 · В ActionFactory::show_dialog плагина max_height добавляется при defined, а r24 записывает это поле без проверки.

    ↩

  123. plg-dc-dune-backup.c133 · code · unknown; прошивка — · Блок цветных кнопок A/B/C/D в popup_menu добавляется, только если не flag_apk, не flag_new и intval(firmware_version) < 240619; иначе пункты не показываются. ↩

  124. doc-sdk-plugins.c042 · doc · any-documented; прошивка — · По SDK тайм-аут операций плагина по умолчанию составляет 10 секунд; operation_timeout задаёт общий () и потиповой (N) тайм-аут. ↩

  125. fw-tv188b-261021-0117-r25.c309 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 операция handle_user_input PHP-плагина без operation_timeout в манифесте (kb_probe5, kb_probe6; ENTER на точке входа с plugin_handle_user_input) стартует с тайм-аутом 60 с: в shell.log «…->handle_user_input(…): start (timeout=60.0s)». ↩

  126. doc-sdk-plugins--gui-actions.c042 · doc · any-documented; прошивка — · PluginHandleUserInputAction не имеет данных; выполняет операцию Handle_user_input(GuiAction::$params) и возвращает её результат как post action ↩

  127. doc-sdk-plugins.c137 · doc · android; прошивка — · Текст документа буквально говорит: при установке на Android содержимое .platform.android удаляется, а содержимое .platform.87xx переносится в корень ↩

    • fw-tv188b-261021-0117-r25.c214 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 штатный установщик ZIP применил к корню плагина сначала .platform.android (скопировал only_android.txt и bin/marker.txt в корень), затем поверх — .platform.android-arm-api19 (bin/marker.txt перезаписан); в установленном плагине bin/marker.txt = «.platform.android-arm-api19» и есть only_android.txt. В shell.log — «[plugin_installer] applying /tmp/plugin_tmp/.platform.».
    • fw-tv188b-261021-0117-r25.c215 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 штатный установщик ZIP не применил .platform.87xx и .platform.foo и удалил все четыре каталога .platform.* (android-arm-api19, 87xx, android, foo: «[plugin_installer] removing /tmp/plugin_tmp/.platform.») до копирования; в установленном плагине нет ни каталогов .platform.*, ни only_87xx.txt.

    ↩

  128. fw-tv188b-260827-0003-r24--http-api--ext-command-params.c040 · doc · any-documented; прошивка — · В описании IP Control указано, что протокол 4 добавил cmd=open_path&url=URL для открытия папки, раздела меню или запуска пункта по root://…; приведён пример root://applications/RadioTime. ↩

  129. fw-tv188b-260827-0003-r24--http-api--ext-command-params.c093 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 cmd=open_path&url=root://applications/<подпись пункта> отвечает command_status=ok, но точку входа плагина не запускает (вызовов 0 → 0), а launch_media_url с plugin_launcher://{name=<плагин>} {ep_media_url=} её запускает (0 → 1). ↩

  130. fw-tv188b-261021-0117-r25.c170 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 запрос /cgi-bin/do?cmd=kb_probe5_ping&plugin=kb_probe5 не запустил www/cgi-bin/run.php плагина: файл /tmp/kb_probe5/run_php.txt, который run.php пишет при каждом запуске, не появился, а в shell.log после запроса нет строк handle_extcmd, kb_probe5, run.php, php-cgi и «headers missing». ↩↩

  131. fw-tv188b-261021-0117-r25.c203 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 каталоги плагинов, положенные adb push в /data/data/com.dunehd.app/flashdata/plugins, не подхватились перечитыванием по IP Control (cmd=main_screen, затем cmd=ir_code&ir_code=B24DBF00; обе команды ответили command_status ok): в shell.log после них нет ни строк kb_probe5, ни «Loading plugins from», ни populate_plugins, а kb_probe5 нет в /tmp/run/installed_plugins.xml. kb_probe5 и kb_probe5_sup зарегистрировались после am force-stop com.dunehd.app. ↩↩

  132. doc-sdk-plugins.c140 · doc · android; прошивка — · В SDK для Android приведены команды развёртывания плагина: adb push в /flashdata/plugins/ и chmod -R +x для bin и www/cgi-bin внутри каталога плагина. ↩

  133. fw-tv188b-261021-0117-r25.c207 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в корне ФС каталога /flashdata нет, а оболочка в shell.log называет каталог плагинов /flashdata/plugins («Loading plugins from '/flashdata/plugins'», «invalid plugin manifest from '/flashdata/plugins/kb_probe5_badname/dune_plugin.xml'», «copying recursively '/tmp/plugin_tmp' to '/flashdata/plugins/kb_probe5_plat'»); файлы этих плагинов лежат в /data/data/com.dunehd.app/flashdata/plugins. ↩

  134. doc-sdk-plugins--gui-actions.c017 · doc · any-documented; прошивка — · С прошивки 150529 событие GUI_EVENT_PLAYBACK_GOING_TO_SWITCH генерируется перед переключением на новый media URL; в отличие от GUI_EVENT_PLAYBACK_STOP, оно не генерируется при остановке и выключении ↩

    • fw-tv188b-261021-0117-r25.c283 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 событие playback_going_to_switch приходит и в конце последней серии VOD, когда перехода на новый URL нет и плеер закрывается — после состояния stopped и непосредственно перед playback_stop с playback_end_of_stream=1.
    • doc-sdk-plugins--operations.c107 · doc · any-documented; прошивка — · PluginVodInfo::buffering_ms (предбуферизация в мс) не реализован

    ↩

  135. fw-tv188b-261021-0117-r25.c287 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при старте VOD зонда kb_probe6 с PluginVodInfo::buffering_ms=3000 оболочка пишет в shell.log «[player] setting buffering to 3000ms» и «[player] DEBUG: using special buffering 3000ms». ↩

  136. fw-tv188b-261021-0117-r25--media-player.c053 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при регистрации actions в plugin VOD плагину доставляются key_pause, key_play, стрелки, key_subtitle, key_audio, key_next, key_1, key_info и key_popup_menu. ↩↩

  137. fw-tv188b-261021-0117-r25.c190 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 shell_ext/bin/media_check вызывает /firmware/scripts/ffmpeg.sh, а такого файла на устройстве нет: «media_check: line 27: /firmware/scripts/ffmpeg.sh: No such file or directory», «ffmpeg finished with status 1». ↩

  138. fw-tv188b-261021-0117-r25.c368 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 261021_0117_r25 · В образах r24 и r25 есть text-файл system/system/dunehd/firmware/scripts/ffmpeg.sh размером 457 байт с sha256 b26df76585300fd394662fbd02cdb3555cb0b1fd8a9859e5a7d0e876eef867df; в обеих версиях он одинаков. ↩

  139. fw-tv188b-261021-0117-r25.c369 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 261021_0117_r25 · В образах r24 и r25 system/system/dunehd/firmware/bin/ffmpeg — симлинк на /data/data/com.dunehd.app/lib/libxxx_ffmpeg.so. ↩

  140. fw-tv188b-261021-0117-r25.c254 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в файловых функциях встроенного PHP (php_server и php-cgi) realpath('/config') = /data/data/com.dunehd.app/config, realpath('/firmware') = /system/dunehd/firmware, realpath('/firmware_ext/php') = /system/dunehd/firmware_ext/php, хотя в корне ФС (adb shell) /firmware и /firmware_ext нет, а /config — другой каталог. ↩

  141. fw-tv188b-261021-0117-r25--builtin-plugins-misc.c048 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 прямой запуск $P/firmware/bin/ffmpeg -version с LD_LIBRARY_PATH=$P/lib:/system/dunehd/firmware/lib из adb shell вывел ffmpeg version 7.1.3; путь ffmpeg — ссылка на $P/lib/libxxx_ffmpeg.so. ↩

  142. fw-tv188b-261021-0117-r25--builtin-plugins-misc.c047 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 запуск sh $P/firmware/scripts/ffmpeg.sh -version из adb shell напечатал ffmpeg not found. ↩↩

    • fw-tv188b-260827-0003-r24--php-framework.c041 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ConfigUtils::load_product_and_fw() читает /tmp/run/versions.txt (key=value: firmware_version, product, platform_kind, android_platform); для fw_apk android_platform берётся из /firmware/config/fw_apk_platform.txt
    • fw-tv188b-261021-0117-r25.c364 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 config_utils.php::load_product_and_fw() читает android_platform из /tmp/run/versions.txt, но при истинном HD::is_fw_apk() (getenv('HD_FW_APK'); у php_server r25 на tv188b = 1) перезаписывает его содержимым файла /firmware/config/fw_apk_platform.txt.

    ↩

  143. fw-tv175u-260724-0207-r24.c022 · code · tv175u, android; прошивка 260724_0207_r24 · Скрипт /system/dunehd/init пишет /tmp/run/versions.txt: product (из product_id.txt), firmware_version, platform_kind=android и android_platform (из android_platform.txt) ↩

  144. doc-sdk-dune-devel-info.c008 · doc · any-documented; прошивка — · На последних ATV и Android 11+ AOSP процесс главного GUI Dune HD называется com.dunehd.app, а не com.dunehd.shell. ↩

  145. doc-sdk-plugins.c141 · doc · sigma-smp86xx, sigma-smp87xx, android; прошивка — · Перезапуск процесса оболочки (перезагрузка всех плагинов): на Sigma — killall shell, на Android — killall com.dunehd.shell ↩↩

  146. fw-tv188b-260827-0003-r24.c062 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 com.dunehd.app (pid 25631), его процесс :bg (pid 1590) и com.dunehd.systemui (pid 4952) работают от пользователя system с SELinux-меткой u:r:system_app:s0; userId пакета com.dunehd.app — 1000 (sharedUser android.uid.system/1000). ↩

  147. fw-tv188b-261021-0117-r25--app-launch.c020 · code · tv188b, android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 260724_0207_r24 · Главная activity оболочки com.dunehd.shell.MainActivity наследует android.app.NativeActivity и объявлена с android:launchMode="3" в dune.apk tv188b r25, r24 и в APK DMC. ↩

  148. fw-tv188b-261021-0117-r25.c233 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после am force-stop com.dunehd.app новый процесс приложения заново регистрирует плагины: в shell.log 35 строк «Plugin '

    ' of type '' is registered», в том числе для kb_probe6 и kb_probe6_sup, положенных adb push перед этим. ↩

  149. doc-sdk-dune-devel-info.c006 · doc · any-documented; прошивка — · PHP-движок сам добавляет FS_PREFIX ко всем нужным путям, кроме команд, переданных аргументами в shell_exec() и system(); поэтому старый код PHP-плагина может полностью работать на новых платформах без изменений. ↩

  150. fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c008 · code · android-atv; прошивка 260724_0207_r24 · _php_add_fs_prefix_to_cmd вызывают php_exec, zif_shell_exec, zif_popen, zif_proc_open и virtual_popen (перекрёстные ссылки radare2 в листинге) ↩

  151. fw-tv188b-260827-0003-r24.c035 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Встроенный плагин shell_ext несёт собственные ELF curl и php-cgi в shell_ext/bin/ ↩

    • fw-tv188b-261021-0117-r25.c378 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 6 php_server плагина kb_probe6 (отчёт curl_multi ctx=php_server, 15:08:30), задавший URL через curl_init($u), обратился к http://localhost/cgi-bin/plugins/kb_probe6/ping.sh?via=localhost — CGI получил HTTP_HOST=localhost; запрос к http://127.0.0.1:80/cgi-bin/plugins/kb_probe6/ping.sh?via=127.0.0.1 пришёл с HTTP_HOST=127.0.0.1.
    • fw-tv188b-261021-0117-r25.c380 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Зонд запроса 6 (kbp6_curl_multi_report) задаёт URL каждого запроса curl_multi через curl_init($u), а не через curl_setopt(CURLOPT_URL); функцию вызывают CGI cm.php (ctx cgi) и main.php php_server (ctx php_server).

    ↩

  152. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c041 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 запрос из php_server функцией file_get_contents к http://localhost/cgi-bin/plugins/

    /… приходит в httpd с HTTP_HOST=127.0.0.1, а curl к тому же URL — с HTTP_HOST=localhost: localhost заменяется на 127.0.0.1 в потоковой обёртке http, но не в curl. ↩

    • fw-tv188b-261021-0117-r25--libphp5--curl-http.c023 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 curl_setopt(CURLOPT_URL,http://localhost/cgi-bin/plugins/kb_probe11/host.sh) из php_server привёл к CGI HTTP_HOST=127.0.0.1 и пустой curl_error.
    • fw-tv188b-261021-0117-r25--libphp5--curl-http.c032 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 _php_do_add_fs_prefix_to_http при заданной HD_HTTP_LOCAL_PORT заменяет префикс URL http://localhost/cgi-bin/plugins/ на http://127.0.0.1:/cgi-bin/plugins/, сохраняя хвост URL.

    ↩

  153. fw-tv188b-261021-0117-r25--shell-ext--movies.c060 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В strings libxxx_movie_indexer.so r25 есть /config/lcreg.txt, %s/config/lcreg_pairs.txt, «D: lcreg map '%s' (%d) -> '%s' (%d)», «D: using lcreg_kind %d», путь common/mt/lcreg.c и следом перечень пар хостов dune-hd.com / r2.dune-hd.com, …, dunemdb.dune-hd.com / r2.dunemdb.dune-hd.com, dunemdb-02.dune-hd.com / r2.dunemdb-02.dune-hd.com. ↩

  154. fw-tv188b-261021-0117-r25--shell-ext--movies.c061 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · lcreg (common/mt/lcreg.c, общий для нативных библиотек) подменяет хосты Dune HD их парой r2.<хост> (в том числе dunemdb.dune-hd.com → r2.dunemdb.dune-hd.com) по настройке /config/lcreg.txt и lcreg_pairs.txt. ↩

  155. fw-tv188b-261021-0117-r25.c018 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Действие fs_ctl, по-видимому, нельзя задать в XML (dune_plugin.xml), только в JSON-ответе PHP-плагина ↩

  156. fw-tv188b-261021-0117-r25.c020 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · PluginSystemActionData::handle_response=yes, вероятно, заставляет оболочку после завершения run_string проверить /restart_needed_flag и перезапустить GUI; для команды в фоне (с «&») флаг игнорируется ↩

  157. fw-tv188b-261021-0117-r25.c042 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · smart_dirty=yes, вероятно, переводит обновление EPF плагина на флаги: плагин пишет маску в /tmp/ui/dirty/<плагин>_epfs, а оболочка по ней и type_mask EPF выбирает срочность update_epfs — ASAP или отложенную очередь; непересечение масок не отменяет постановку в очередь, type_mask=0 сохраняет ASAP ↩

  158. fw-tv188b-261021-0117-r25--php-framework.c023 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Вероятно, cond вычисляет булев pattern и использует его результат как условие видимости entry_point downloads. ↩

  159. fw-tv188b-261021-0117-r25--php-framework.c044 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Вероятно, PLUGIN_ROW_OPT_LOADING помечает строку для последующей подгрузки через get_folder_rows; точные триггеры, порядок и повтор нативных запросов из PHP/strings не следуют. ↩

  160. plg-gh-kocourkuba-proiptv.c021 · inference · unknown; прошивка — · Вероятно, php_r22/, php_r24/ и php_apk_r22/ — эталонные копии PHP-фреймворка прошивок для локальной отладки: разработчик копирует нужную в ./php (она в .gitignore), а plugin_test_env.php подключает её; в пакет плагина они не входят (пакет собирается только из dune_plugin/), и на устройстве плагин ветку не выбирает — работает с фреймворком самой прошивки. ↩

  161. plg-gh-kocourkuba-proiptv.c034 · inference · unknown; прошивка — · Вероятно, прошивка r24 трактует возвращённое из confirm_update значение false как отказ от обновления плагина. ↩

  162. fw-tv188b-261021-0117-r25--php-framework.c035 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Вероятно, apply_hash_dirties заставляет нативную оболочку обработать записи HashDirties после изменения hash-привязок; формат результата действия и момент очистки файла не установлены. ↩

  163. fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c030 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 при playback_url=kbplazy://0 без суффикса ответ get_vod_stream_url с engine:1,http_headers:X-KB477%3A%20one дал серверу запрос ExoPlayer /m/kb9-a.mp4?b=lazy без суффикса dune_params и с заголовком X-KB477: one. ↩

    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c023 · inference · android-dune-fw; прошивка 261021_0117_r25 · Предполагается, что заголовки потока задаются и из ответа get_vod_stream_url: вернуть URL с суффиксом |||dune_params|||engine:1,http_headers: при playback_url серии без этого суффикса. Код (разбор stream URL, ответ PHP как stream URL) это допускает.
    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c030 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 при playback_url=kbplazy://0 без суффикса ответ get_vod_stream_url с engine:1,http_headers:X-KB477%3A%20one дал серверу запрос ExoPlayer /m/kb9-a.mp4?b=lazy без суффикса dune_params и с заголовком X-KB477: one.

    ↩

  164. fw-tv188b-261021-0117-r25--app-launch.c040 · inference, disputed · tv188b, android-dune-fw; прошивка 261021_0117_r25, 260827_0003_r24 · Гипотеза для плагинов на tv188b — cmd «/system/dunehd/dunehd_service do am start …» в launch_ext_app уходит в shell, то есть в системный am от имени демона dunehd_service (root), где есть --user и прочие опции, которых нет в IntentBuilder, и нет ограничения exported. ↩

    • fw-tv188b-260827-0003-r24--plugin-loader.c039 · inference, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Строки r24 (libduneshell.so:5986-6004, libxxx_do.so:281-285) предполагают перенаправление внешней команды ext_command с параметром plugin плагину: readlink /tmp/www/cgi-bin/plugins/, chdir, запуск /firmware_ext/php/php-cgi с SCRIPT_FILENAME=<…>/run.php, php.ini и переменными REQUEST_METHOD, QUERY_STRING, EXTCMD_ORIG_COMMAND_NAME; условие ветки не установлено.
    • fw-tv188b-260827-0003-r24--http-api.c041 · inference, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Команду /cgi-bin/do, адресованную плагину, код ext_command (в CGI do — libxxx_do.so — и в libduneshell.so), вероятно, исполняет так: readlink /tmp/www/cgi-bin/plugins/<плагин> и chdir, затем execv php-cgi со SCRIPT_FILENAME=<…>/run.php (вероятно, от цели readlink), php.ini (каталог не установлен) и переменными REQUEST_METHOD, QUERY_STRING, EXTCMD_ORIG_COMMAND_NAME

    ↩

  165. doc-sdk-plugins--operations.c108 · doc, disputed · any-documented; прошивка — · По тексту документа PluginVodInfo::actions при VOD-воспроизведении поддерживает из клавиш только цветные (GUI_EVENT_KEY_A_RED, GUI_EVENT_KEY_B_GREEN, GUI_EVENT_KEY_C_YELLOW, GUI_EVENT_KEY_D_BLUE); также описаны события таймера (GUI_EVENT_TIMER) и остановки (GUI_EVENT_PLAYBACK_STOP), но перечень в документе обрывается на «- playback» и не является исчерпывающим. ↩

  166. doc-sdk-plugins.c142 · doc, disputed · any-documented; прошивка — · Перечитать плагины без перезапуска оболочки: в верхнем меню нажать ANGLE/ROTATE (или Refresh в POP UP MENU) либо по IP Control: cmd=main_screen, затем cmd=ir_code&ir_code=B24DBF00 ↩

  167. fw-tv188b-260827-0003-r24.c070 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 окружение php_server отдельно не снято: сбор 24-environ выбирал процессы по pgrep -f dunehd, а в argv php_server строки dunehd нет; при этом окружение родителя com.dunehd.app не содержит FS_PREFIX, HD_APK, HD_FW_APK, LOG_DIR, TMPDIR и PHP_PROC_OPEN_SH, поэтому наличие этих переменных у php_server на r24 не установлено. ↩

  168. fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c009 · inference · android-atv; прошивка 260724_0207_r24 · Вероятно, подстановке FS_PREFIX в командах подвержены PHP-функции exec, system и passthru (через php_exec), shell_exec (и оператор …), popen и proc_open ↩

  169. fw-tv188b-261021-0117-r25--libphp5--curl-http.c035 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Наблюдение запроса 11 (curl_setopt(CURLOPT_URL) с http://localhost/cgi-bin/plugins/…, HD_HTTP_LOCAL_PORT=80 → HTTP_HOST=127.0.0.1, REQUEST_URI сохранён) согласуется с заменой префикса localhost по c032; порт в ответе CGI не виден (SERVER_PORT пуст), поэтому подстановку именно порта оно не подтверждает. ↩