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

Быстрый старт: минимальный PHP-плагин на r25

Редакция 2026-11-02. Разработчик и его LLM-агент получают за один проход плагин, который ставится и открывается на Android-прошивке Dune HD, и понимают, почему он устроен именно так. Отправная точка — зонды, которые реально ставились на одно устройство: Pro 8K Plus (tv188b), прошивка 261021_0117_r25 (device). Код r24 (code) и SDK (doc) — справка; факт только из SDK помечен «по SDK, на r24+ не подтверждено». На другие прошивки и устройства наблюдения не переносятся. Каждое фактическое предложение ссылается на claim id.

Рядом: установка, подпись, удаление — «Пакет плагина»; экраны — «Экраны и папки плагина»; клавиши и диалоги — «Ввод и диалоги»; очередь, тайм-ауты и php_server — «Операции плагина, тайм-ауты и php_server»; приёмы плагинов — «Приёмы разработки плагинов Dune HD»; грабли — «Грабли».

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

Вопрос Ответ Где
Проверены ли листинги §2.2 и §2.4 на устройстве? да, в одном прогоне на tv188b r25 (запрос 11): файлы зонда kb_probe5, побайтно равные §2.2 и §2.4 при сверке на компьютере (устройство r25)1, поставлены через adb push (устройство r25)2 и из ZIP (устройство r25)3; в обоих случаях ENTER на пункте дал диалог «KB probe 5» с «OK: props» (устройство r25)4 §2.2, §2.5–§2.7
Какие файлы нужны? dune_plugin.xml обязателен по SDK (SDK)5; для PHP-плагина к нему нужна программа, путь к которой задан в манифесте (SDK)6; зонд kb_probe10 из этих двух файлов на r25 установился и отработал (устройство r25)7 §2.1
Почему пункта нет в «Приложениях»? на r25 точки входа без icon_url там не появлялись (устройство r25)8 §2.3
Куда класть плагин на r25? /data/data/com.dunehd.app/flashdata/plugins/, а не /flashdata/plugins: такого каталога в корне ФС нет (устройство r25)9 §2.5
Как плагин подхватывается после adb push? после am force-stop com.dunehd.app; перечитывание по IP Control новый каталог не подхватило (устройство r25)10 §2.5
Что должна делать программа? объявить наследника DunePluginFw с call_plugin() и присвоить экземпляр в DunePluginFw::$instance (устройство r25, SDK)11 §2.4
Нужна ли hd_create_plugin()? SDK называет её обязательной (SDK)12, но зонды kb_probe5 и kb_probe10 на r25 работали без неё (устройство r25)13 §2.4, §5
Где лог плагина? /tmp/run/<плагин>.log, туда идут hd_print() и ошибки PHP (устройство r25)14 §2.9
Что значит «Ошибка приложения»? сбой вызова: Fatal error, exit() или null из call_plugin (устройство r25)15; диалог общей ошибки, без текста PHP, дал и E_PARSE при загрузке main.php на tv188b r25 (устройство r25)16 §2.10
Правка main.php применяется сама? да, после touch main.php при следующем вызове (устройство r25)17; правка подключаемого файла — нет (устройство r25)18 §2.11

1. Как устроен плагин: от манифеста до ответа PHP

Объект: PHP-плагин с программой main.php на tv188b r25 (device); сверх этого — код r24 и SDK.

Плагин — каталог в flashdata/plugins с манифестом, который оболочка читает при старте (устройство r25)19 и регистрирует (устройство r25)20, а PHP запускает только когда пункт выбрали (устройство r25)21. Поэтому у «плагин не работает» много разных причин, и каждая видна на своём шаге цепочки:

  1. При старте приложения оболочка читает flashdata/plugins и firmware_ext/plugins («Loading plugins from …») (устройство r25)19 и регистрирует плагин («Plugin '

    ' of type '' is registered») (устройство r25)20. Запись появляется в /tmp/run/installed_plugins.xml (устройство r25)22.

  2. Без icon_url пункта в разделе «Приложения» нет (устройство r25)8, а у kb_probe5 после добавления icon_url в точки входа в записи появились launch_capable 1 и category applications (устройство r25)23.
  3. При регистрации процесса PHP ещё нет: php_server запускается при первом вызове плагина (устройство r25)21.
  4. php_server подключает системные файлы и затем программу плагина, после чего пишет «[server] ready.» (устройство r25)24. К исполнению main.php уже определены DunePluginFw, DuneSystem, PLUGIN_OP_HANDLE_USER_INPUT и hd_print (устройство r25)25.
  5. ENTER на пункте исполняет действие из actions точки входа (SDK)26: в зонде это plugin_handle_user_input (устройство r25)27. Плагин получает JSON-контекст в call_plugin($call_ctx_json) (устройство r25)28.
  6. Плагин возвращает JSON со структурой PluginOutputData (по коду r24) (код r24, SDK)29, а plugin_show_error из ответа оболочка исполняет (устройство r25)30.

Между вызовами php_server живёт: статические переменные класса сохраняются (устройство r25)31, но после каждого перезапуска начинаются заново (устройство r25)32. Вызовы одного плагина сериализуются (SDK)33; подробно — «Операции плагина, тайм-ауты и php_server».

Другие прошивки. В коде r24 те же опоры: абстрактный DunePluginFw со статическим $instance и методом call_plugin (код r24)34 и загрузка системных файлов из php_server (код r24)35. bootstrap.php, dune_config.php и dune_plugin.php одинаковы в проверенных r22 и r24 (tv175u, tv188b) (код r22, r24)36. Прогонов на r24 нет — §6; Sigma и платформенные варианты — «Пакет плагина».

2. Задачи

2.1. Какие файлы нужны в пакете

Объект: каталог PHP-плагина на tv188b r25 (device).

По SDK dune_plugin.xml — единственный файл, обязательный для загрузки, а остальные файлы указываются в манифесте и могут называться как угодно (SDK)5. PHP-плагину нужна ещё программа, путь к которой задаёт params/program (SDK)6. Пример такого каталога — probes/kb_probe10/: зонд из двух файлов, dune_plugin.xml и main.php, на r25 установился и отработал; его точка входа запущена через plugin_launcher, а handle_user_input выполнил kbp10_run (устройство r25)7. Это не листинг главы; два файла сокращённых манифеста §2.2 и main.php §2.4 (устройство r25)1 поставлены отдельно (устройство r25)37.

Файл Зачем Нужен ли Claim
dune_plugin.xml манифест в корне пакета да (SDK)38
main.php (имя задаёт params/program) программа PHP-плагина для type php (устройство r25, SDK)39
bin/ исполняемые файлы, например для global_actions нет (устройство r25, SDK)40
www/, www/cgi-bin/ статика и CGI, см. §2.12 нет (устройство r25)41

Каталог называется так же, как name в манифесте; иначе плагин не зарегистрируется (устройство r25)42. Полный перечень содержимого пакета — «Пакет плагина».

2.2. Написать dune_plugin.xml

Объект: манифест PHP-плагина с одной точкой входа на tv188b r25.

Упрощение и проверка. Листинги этого раздела и §2.4 получены из файлов зонда kb_probe5 удалением лишнего. В запросе 11 на tv188b r25 (один прогон) файлы зонда dune_plugin.xml (751 байт) и main.php (1692 байта) побайтно совпали с этими листингами (устройство r25)1: cmp выполнялся на компьютере до установки, хеш копии на плеере не сверялся. Установка — §2.5 и §2.6, результат на экране — §2.7. Полный манифест, который стоял на r25, — probes/kb_probe5/dune_plugin.xml: в нём 6 точек входа и global_actions.

Из манифеста зонда оставлены строки 1, 3–26 и 102, 141 — одна точка входа без global_actions:

<dune_plugin>
  <name>kb_probe5</name>
  <caption>KB probe 5</caption>
  <type>php</type>
  <params>
    <program>main.php</program>
  </params>
  <version>261026_0000</version>
  <version_index>1</version_index>
  <entry_points>
    <entry_point>
      <parent_media_url>root://applications</parent_media_url>
      <media_url>kbp5_props</media_url>
      <caption>KB probe 5: props</caption>
      <icon_url>gui_skin://large_icons/apps.aai</icon_url>
      <actions>
        <key_enter>
          <type>plugin_handle_user_input</type>
          <params>
            <handler_id>kbp5</handler_id>
            <control_id>props</control_id>
          </params>
        </key_enter>
      </actions>
    </entry_point>
  </entry_points>
</dune_plugin>

Полный манифест той же формы — probes/kb_probe10/dune_plugin.xml: одна точка входа и без global_actions; лишний для старта блок operation_timeout задаёт тайм-аут 600 с (ключи задаются в секундах (устройство r25)43). Значение каждого элемента — §3.1. Имя в манифесте должно совпадать с именем каталога: иначе оболочка пишет invalid plugin manifest ... name ... is not equal to directory name ... и плагин не регистрируется (устройство r25)44. Допустимые символы name по SDK — алфавитно-цифровые, -, ., _, длина не более 64 (SDK)45.

2.3. Сделать пункт видимым: точка входа и icon_url

Объект: entry_point с parent_media_url root://applications на tv188b r25 (device).

icon_url на r25 решает, появится ли пункт. Зонд kb_probe5 сначала стоял без него: в installed_plugins.xml было launch_capable 0 и не было category. После добавления gui_skin://large_icons/apps.aai в каждую точку входа и перезапуска приложения стало launch_capable 1 и category applications (устройство r25)23. Без icon_url пунктов в разделе «Приложения» не было (устройство r25)8. Запись плагина в installed_plugins.xml при этом есть (устройство r25)23, поэтому смотреть надо не на её наличие, а на launch_capable.

Что проверено, а что нет:

  • значок скина: gui_skin:// входит в схемы URL картинок по SDK (SDK)46, каталог large_icons есть в базовом скине r25 (код r25)47, а пункт листинга §2.2 с gui_skin://large_icons/apps.aai виден с иконкой в «Приложения» → DUNE HD (запрос 11) (устройство r25)48;
  • иконка из пакета: по SDK её можно взять по plugin_file://path (SDK)46. В запросе 11 на tv188b r25 зонд kb_probe11p с icon_url plugin_file://icons/kb11.png зарегистрирован с launch_capable=1, category=applications и logo_url=plugin_file://%kb_probe11p%/icons/kb11.png, а его пункт в «Приложения» → DUNE HD показал синюю квадратную иконку (устройство r25)49; приём — в «Приёмы разработки плагинов Dune HD»;
  • родитель setup://applications без icon_url: в запросе 11 на tv188b r25 зонд kb_probe11i с единственной такой точкой зарегистрирован с launch_capable=0, а при просмотре всех четырёх рядов «Настройки → Приложения» пункта не увидели (устройство r25)50;
  • другие родители без icon_url — в §6.

2.4. Написать main.php: DunePluginFw и call_plugin

Объект: программа PHP-плагина на tv188b r25 (device), PHP 5.3.6 (устройство r25)51.

По SDK программа делает одно: объявляет наследника DunePluginFw, реализует в нём call_plugin() и присваивает экземпляр в DunePluginFw::$instance (SDK)52. Плагин с такой программой (kb_probe6) на r25 загружается и получает операции (устройство r25)53. Подключать системные файлы самому не нужно: они загружены до main.php (устройство r25)25.

Функция hd_create_plugin(), которую SDK называет обязательной для PHP-плагина (SDK)12, зондам kb_probe5 и kb_probe10 на r25 не понадобилась: они работали без неё, с классом-наследником DunePluginFw (устройство r25)13. Обе стороны — в §5.

Это probes/kb_probe5/main.php без диагностики. Убраны запись в /tmp/kb_probe5, lib/kbp5_lib.php, счётчик $n, дамп свойств и ветки sleep, fatal, exit, native, restart_gui; строка msg_lines склеена из двух. Именно этот вариант поставлен в запросе 11 на tv188b r25, см. §2.2 (устройство r25)54.

<?php
function kbp5_print($s)
{
    if (function_exists('hd_print'))
        hd_print("kbp5: $s");
}

function kbp5_handle_user_input($user_input)
{
    $control_id = isset($user_input->control_id) ? $user_input->control_id : '';
    kbp5_print("handle_user_input control_id=$control_id");

    return array(
        GuiAction::handler_string_id => PLUGIN_SHOW_ERROR_ACTION_ID,
        GuiAction::caption => null,
        GuiAction::data => array(
            PluginShowErrorActionData::fatal => false,
            PluginShowErrorActionData::title => 'KB probe 5',
            PluginShowErrorActionData::msg_lines => array('OK: ' . $control_id),
        ),
        GuiAction::params => null,
    );
}

class KbProbe5Fw extends DunePluginFw
{
    public function call_plugin($call_ctx_json)
    {
        $ctx = json_decode($call_ctx_json);

        $out = null;
        if (isset($ctx->op_type_code) && $ctx->op_type_code === PLUGIN_OP_HANDLE_USER_INPUT)
            $out = kbp5_handle_user_input($ctx->input_data);
        else
            kbp5_print('unsupported op ' . (isset($ctx->op_type_code) ? $ctx->op_type_code : '?'));

        $res = array(
            PluginOutputData::has_data => !is_null($out),
            PluginOutputData::plugin_cookies => isset($ctx->plugin_cookies) ? $ctx->plugin_cookies : null,
            PluginOutputData::is_error => false,
            PluginOutputData::error_action => null,
        );
        if (!is_null($out))
        {
            $res[PluginOutputData::data_type] = PLUGIN_OUT_DATA_GUI_ACTION;
            $res[PluginOutputData::data] = $out;
        }
        return json_encode($res);
    }
}

DunePluginFw::$instance = new KbProbe5Fw();
?>

Почему так:

  • call_plugin всегда возвращает JSON: если вернуть null, оболочка считает это сбоем и показывает «Ошибка приложения» (устройство r25)55;
  • plugin_cookies возвращаются в ответе: поле есть и во входном контексте, и в PluginOutputData (устройство r25, код r24)56;
  • тип данных при handle_user_input по коду r24 — PLUGIN_OUT_DATA_GUI_ACTION (gui_action) (код r24)57;
  • handler_id и control_id из манифеста приходят в input_data (устройство r25)58: здесь control_id попадает в текст сообщения, а handler_id не проверяется.

Зонды kb_probe7_to и kb_probe10 вместо своей ветки зовут $this->invoke_operation($plugin, $ctx) и get_out_type_code(); что делают эти методы DunePluginFw по коду r24 — (код r24)59. Полный файл такого вида (76 строк): probes/kb_probe7_to/main.php.

2.5. Установить на r25 через adb push

Объект: развёртывание без установщика на tv188b r25 (device).

Так ставились PHP-зонды kb_probe5 и kb_probe6: каталог копируется в flashdata/plugins, ему выставляются владелец и права, затем перезапускается приложение (устройство r25)60. Команды взяты из логов прогона (files/21-push.txt, collect5-README.md); $P из лога раскрыт, а команды на устройстве записаны через adb shell:

adb connect <IP>:5555
adb root
adb push kb_probe5 /data/data/com.dunehd.app/flashdata/plugins/
adb shell 'chown -R system:system /data/data/com.dunehd.app/flashdata/plugins/kb_probe5; chmod -R +x /data/data/com.dunehd.app/flashdata/plugins/kb_probe5/bin /data/data/com.dunehd.app/flashdata/plugins/kb_probe5/www/cgi-bin 2>/dev/null'
adb shell am force-stop com.dunehd.app

Почему именно так:

  • /flashdata в корне ФС нет, хотя оболочка в логах называет каталог /flashdata/plugins (устройство r25)61; PHP этот путь видит (устройство r25)62, а adb push — нет;
  • развёртывание шло под adb root, с chown и chmod (устройство r25)20; chcon не понадобился, метка совпала с соседним плагином (устройство r25)63;
  • перечитывание по IP Control новый каталог не подхватило, а am force-stop — подхватил (устройство r25)10; приложение поднимается само за 1–2 с (устройство r25)64 и заново регистрирует плагины (устройство r25)65;
  • chmod относится только к bin и www/cgi-bin (устройство r25)20; вывод ошибок отброшен, как в логе прогона, потому что этих каталогов в минимальном плагине нет;
  • global_actions install при таком развёртывании не выполняется (устройство r25)66, update при смене version_index на месте — тоже (устройство r25)67; boot придёт при ближайшем старте приложения (устройство r25)68.

Проверка регистрации — две команды. Первая из 22-reload.txt, вторая читает файл, который сверяет §2.3:

adb shell "grep -a -n -E 'kb_probe5|is not equal to directory' /tmp/run/shell.log | tail -40"
adb shell cat /tmp/run/installed_plugins.xml

Ожидаемо в shell.log — Plugin 'kb_probe5' of type 'php' is registered (устройство r25)20. Запись в installed_plugins.xml после прогона с icon_url (устройство r25)69:

    <name>kb_probe5</name>
    <caption>KB probe 5</caption>
    <path>/data/data/com.dunehd.app/flashdata/plugins/kb_probe5</path>
    <version_index>1</version_index>
    <version>261026_0000</version>
    <launch_capable>1</launch_capable>
    <category>applications</category>

Листинги §2.2 и §2.4 проверены на этом способе в запросе 11 на tv188b r25 (один прогон): после adb push, chown system:system и перезапуска приложения сокращённый kb_probe5 зарегистрирован как php с launch_capable=1 и category=applications (устройство r25)2. Установку без adb root и chown этот прогон не проверял (§6).

Подробности и расхождения с SDK — «Пакет плагина». Удаление такого плагина: rm -rf каталога и снова am force-stop; в одном прогоне плагин исчез из списка только после него (устройство r25)70, в другом после перечитывания по IP Control записи уже не было (устройство r25)71 — см. §5.

2.6. Установить на r25 из ZIP

Объект: штатный установщик на tv188b r25 (device) и упаковка архива.

По SDK плагин ставится запуском файла dune_plugin*.zip (SDK)72, а dune_plugin.xml лежит в корне архива (SDK)73. На r25 так установлен dune_plugin_kb_probe5_plat.zip из /sdcard/DuneHD: в файловом браузере плеера, в каталог flashdata/plugins/kb_probe5_plat (устройство r25)74. Перезапуск приложения при этом не нужен: оболочка пишет «[plugin_installer] reloading plugin» и регистрирует плагин в том же процессе (устройство r25)75. Файл в bin/ стал исполняемым, а файлы в корне — нет (устройство r25)76.

Этот зонд — типа plain, без PHP (устройство r25)75. PHP-плагин из ZIP проверен в запросе 11 на tv188b r25 (один прогон). dune_plugin_kb_probe5.zip с двумя файлами листинга §2.2 и §2.4 зарегистрировал kb_probe5 как php без смены pid приложения (устройство r25)3; пункт «KB probe 5: props» доступен в «Приложения» без перезапуска, ENTER даёт диалог «KB probe 5 / OK: props» (устройство r25)77. В листинге нет global_actions, поэтому install этот зонд не показал (устройство r25)3.

Остальное показал зонд kb_probe11z того же прогона. В его архиве не было dune_plugin.sign и dune_plugin_signer_id.txt, а штатный установщик принял архив и зарегистрировал плагин как php (устройство r25)78. Это один прогон на данном устройстве: он не определяет external_plugins_enabled и не доказывает отключение проверки подписей (устройство r25)78; что известно о подписи — «Пакет плагина» и §6. После установки оболочка выполнила global action install как sh bin/ga.sh install, а маркер ga_install.txt записал event=install и uid=1000(system) (устройство r25)79; при adb push с перезапуском приложения он не выполняется (устройство r25)66. Файлы bin/ga.sh и www/cgi-bin/ping.sh из ZIP с mode 644 в каталоге плагина получили 755 (устройство r25)80. ENTER пультом на «KB11 zip» в «Приложения» → DUNE HD вызвал handle_user_input с control_id=enter и диалог «KB probe 11z / OK: zip» (устройство r25)81.

Архив из корня каталога плагина собирает строка из скрипта probe/dialog_scroll_probe_build.sh; метаданные macOS исключены:

(cd "$src" && zip -q -X -r "$out" . -x '.DS_Store' '._*')

Остальное об установщике — «Пакет плагина».

2.7. Первый экран: сообщение plugin_show_error

Объект: ответ handle_user_input с действием plugin_show_error на tv188b r25 (device).

Минимальный видимый результат — сообщение: экрана-папки для него не нужно. Откройте «Приложения», выберите пункт и нажмите ENTER: оболочка вызовет handle_user_input, а в ответ исполнит plugin_show_error (устройство r25)82. По SDK в меню это диалог с заголовком и строками (SDK)83, а данные действия — fatal, title, msg_lines (SDK)84. Зонд передаёт fatal => false: при fatal == true действие выводит в верхнее меню (SDK)85.

На экране это видно так (запрос 11, tv188b r25, один прогон): пункт «KB probe 5: props» виден в «Приложения» → DUNE HD, и ENTER открывает диалог с заголовком «KB probe 5» и строкой «OK: props» (устройство r25)48. Тот же диалог получен и после установки листинга из ZIP (устройство r25)77.

Что должно появиться в логах при первом нажатии. В shell.log — старт и результат вызова, в скобках handler_id.control_id (устройство r25)82:

plugin D: kb_probe5->handle_user_input(kbp5.props): start (timeout=60.0s)
plugin D: kb_probe5->handle_user_input(kbp5.props) result action: kb_probe5->plugin_show_error(.)

В /tmp/run/kb_probe5.log — запуск php_server (устройство r25)24 и строка из hd_print (устройство r25)86:

[17362] [t17362] [2026-10-26 10:37:59.843274] [kb_probe5] [server] ready.
[17362] [t17362] [2026-10-26 10:37:59.843283] [kb_probe5] [server] main loop started.
[17362] [t17362] [2026-10-26 10:38:00.049121] kbp5: handle_user_input control_id=props

Контекст этого вызова (files/40-php-props.txt, строка 126) — в §3.2. Подробнее об ошибках и сообщениях — «Ввод и диалоги».

2.8. Первый экран-папка: plugin_open_folder и get_folder_view

Объект: control-папка стороннего плагина; пробник dialog_scroll_probe 0.1.0 на Pro 8K Plus r25, операции папок — по SDK и dune_api.php r24.

Настоящий экран — это папка: на PLUGIN_OPEN_FOLDER оболочка вызывает get_folder_view() плагина (SDK)87 и показывает результат как содержимое папки (SDK)88. Пробник dialog_scroll_probe стоял на r25: окна show_dialog, которые строит его программа, наблюдались на устройстве и проверены настоящим пультом (устройство r25)89. Это второй образец: его можно брать целиком, два файла лежат в probe/dialog_scroll_probe/. Что сама папка на r25 открылась, отдельным claim пока не оформлено — см. §6.

Манифест пробника целиком — точка входа в setup://applications, ENTER открывает папку (SDK)88. Про ip_address_required см. «Приёмы разработки плагинов Dune HD»:

<dune_plugin>
  <name>dialog_scroll_probe</name>
  <caption>Dialog Scroll Probe</caption>
  <type>php</type>
  <params>
    <program>main.php</program>
  </params>
  <entry_points>
    <entry_point>
      <parent_media_url>setup://applications</parent_media_url>
      <media_url>setup</media_url>
      <caption>Dialog Scroll Probe</caption>
      <icon_url>gui_skin://large_icons/info.aai</icon_url>
      <ip_address_required>no</ip_address_required>
      <valid_time_required>no</valid_time_required>
      <actions>
        <key_enter>
          <type>plugin_open_folder</type>
          <data>
            <media_url>setup</media_url>
            <caption>Dialog Scroll Probe</caption>
          </data>
        </key_enter>
      </actions>
    </entry_point>
  </entry_points>
  <version>0.1.0</version>
  <version_index>1</version_index>
</dune_plugin>

Разбор операций в call_plugin — строки 42–72 main.php. В отличие от §2.4 здесь две операции и две разные метки типа:

    public function call_plugin($call_ctx_json)
    {
        $ctx = json_decode($call_ctx_json);
        $op = is_object($ctx) && isset($ctx->op_type_code) ? $ctx->op_type_code : null;
        $in = is_object($ctx) && isset($ctx->input_data) ? $ctx->input_data : null;
        $out = array(
            PluginOutputData::has_data => false,
            PluginOutputData::plugin_cookies =>
                is_object($ctx) && isset($ctx->plugin_cookies) ? $ctx->plugin_cookies : null,
            PluginOutputData::is_error => false,
            PluginOutputData::error_action => null);
        $data = null;
        $type = null;
        if ($op === PLUGIN_OP_GET_FOLDER_VIEW)
        {
            $data = self::folder_view();
            $type = PLUGIN_OUT_DATA_PLUGIN_FOLDER_VIEW;
        }
        else if ($op === PLUGIN_OP_HANDLE_USER_INPUT)
        {
            $data = self::user_input($in);
            $type = PLUGIN_OUT_DATA_GUI_ACTION;
        }
        if (!is_null($data))
        {
            $out[PluginOutputData::has_data] = true;
            $out[PluginOutputData::data_type] = $type;
            $out[PluginOutputData::data] = $data;
        }
        return json_encode($out);
    }

Сама папка — строки 100–120: список кнопок в PLUGIN_FOLDER_VIEW_CONTROLS:

    private static function button($name, $caption, $width, $action, $params = null)
    {
        return array(GuiControlDef::name => $name, GuiControlDef::title => null,
            GuiControlDef::kind => GUI_CONTROL_BUTTON,
            GuiControlDef::specific_def => array(GuiButtonDef::caption => $caption,
                GuiButtonDef::width => $width, GuiButtonDef::push_action => $action),
            GuiControlDef::params => $params);
    }

    private static function folder_view()
    {
        $defs = array();
        foreach (self::$rows as $id => $caption)
            $defs[] = self::button($id, $caption, 1200, self::input($id));
        return array(
            PluginFolderView::view_kind => PLUGIN_FOLDER_VIEW_CONTROLS,
            PluginFolderView::multiple_views_supported => false,
            PluginFolderView::data => array(
                PluginControlsFolderView::defs => $defs,
                PluginControlsFolderView::initial_sel_ndx => -1));
    }

Кнопка несёт push_action, а строка действия собирается в input(), строки 74–82; initial_sel_ndx => -1 — контрол по умолчанию (SDK)90. Тип данных folder view по коду r24 — plugin_folder_view (код r24)57; поля папки по SDK — defs, initial_sel_ndx, params (SDK)91. Дальше: control-папка — «Экраны и папки плагина», обычный каталог — там же §2.1, контролы — «Контролы диалогов и папок». Регулярная папка зонда в запросе 11 на tv188b r25 не открылась: оболочка вызвала get_folder_view("kbp11_reg"), а вместо папки появился диалог «Ошибка приложения» (устройство r25)92; о причине — §6.

2.9. Смотреть логи: /tmp/run/<плагин>.log и shell.log

Объект: логи плагина и оболочки на tv188b r25 (device).

Логи — главный инструмент разработки; смотреть их надо в двух местах: один про PHP, другой про оболочку.

Лог Что в нём Команда Claim
/tmp/run/<плагин>.log запуск php_server, строки hd_print(), ошибки и предупреждения PHP adb shell tail -60 /tmp/run/kb_probe5.log (устройство r25)93
/tmp/run/shell.log регистрация, отказ манифеста, старт и результат операций, сбой вызова adb shell "grep -a -E 'kb_probe5' /tmp/run/shell.log \| tail -40" (устройство r25)94
/tmp/run/installed_plugins.xml что зарегистрировано, launch_capable, category adb shell cat /tmp/run/installed_plugins.xml (устройство r25)69

Что учитывать при чтении:

  • время в обоих логах на 3 часа меньше местного (устройство r25)95;
  • реальный путь лога плагина — /data/data/com.dunehd.app/tmp/run/<плагин>.log, предел 3072000 байт (устройство r25)96;
  • @ не спасает от записи: предупреждение от @mkdir(...) попало в лог при каждом запуске php_server (устройство r25)97;
  • SDK советует busybox tail -F через telnet или ADB (SDK)98; по SDK, на r24+ не подтверждено;
  • флаг /config/hd_debug/PHP_CLIENT.txt со значением 1 на работающем приложении новых строк не дал (устройство r25)99; прочие флаги — «Операции плагина, тайм-ауты и php_server».

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

2.10. Почему плагин не появился или не открывается

Объект: диагностика на tv188b r25 (device); строки r24 отмечены.

Идите по цепочке §1 сверху вниз: сначала shell.log и installed_plugins.xml, затем лог плагина.

Симптом Что видно Причина Что сделать Claim
Плагина нет в списке после adb push нет строки is registered, нет в installed_plugins.xml приложение не перезапущено; перечитывание по IP Control новый каталог не подхватывает adb shell am force-stop com.dunehd.app (устройство r25)10
То же invalid plugin manifest … name '<name>' is not equal to directory name '<каталог>' name не равен имени каталога; плагин не регистрируется ни под одним именем привести к одному имени (устройство r25)44
То же, манифест иной r24, строки: name is missing, caption is invalid or missing, type is missing, type '%s' is not supported ошибка в обязательном элементе (строки — из кода r24) сверить с §3.1 (код r24)100
Плагин зарегистрирован, пункта в «Приложениях» нет launch_capable 0, нет category у точек входа нет icon_url добавить icon_url, затем am force-stop (устройство r25)101
Плагин plain не виден в меню launch_capable 0 так у зонда-поставщика (launch_capable 0) см. §2.12 (устройство r25)102
ENTER: «Ошибка приложения / Произошла ошибка. Приложение будет закрыто.» лог плагина: php-call failed. и [E_ERROR] …; shell.log: treating empty result as failure Fatal error или exit() в вызове исправить по строке [файл:строка]; следующий вызов поднимет новый php_server (устройство r25)103
То же, а php-call failed нет shell.log: treating empty result as failure, PHP_CALL_FAILED call_plugin вернул null всегда возвращать JSON (устройство r25)55
Диалог общей ошибки приложения, без текста PHP (запрос 11, намеренно сломанный kb_probe11s) лог плагина: […/main.php:4] [E_PARSE] syntax error, unexpected ';'; shell.log: PHP_CALL_FAILED и plugin_show_error синтаксическая ошибка в main.php: его загрузка завершилась E_PARSE исправить строку из [файл:строка] (устройство r25)16
Через минуту: «Превышено время операции» cancelling by timeout, killing PHP-server process вызов не уложился в тайм-аут: у handle_user_input без operation_timeout он 60 с ускорить вызов или задать operation_timeout (устройство r25)104
Правка кода не действует тот же pid, старое поведение изменён подключаемый файл, а php_server перезапускается по main.php touch main.php (устройство r25)105
php-cgi не запускается из adb shell CANNOT LINK… так он на r25 и не стартует; из CGI-обёртки плагина работает проверять через HTTP-запрос к CGI (устройство r25)106

Прочие грабли — «Грабли».

2.11. Правка и перезапуск: что применяется само

Объект: цикл разработки на tv188b r25 (device).

Что изменили Как применить Что произойдёт Claim
main.php touch main.php, затем вызов плагина следующий вызов сначала перезапустит php_server («PHP-script modification detected») (устройство r25)17
подключаемый файл lib/*.php изменить файл, затем touch main.php без touch вызов исполнит тот же процесс со старым кодом (устройство r25)105
dune_plugin.xml adb push и am force-stop com.dunehd.app приложение заново зарегистрирует плагины (устройство r25)107

После перезапуска php_server (по touch, после Fatal error, после exit(0)) статические переменные начинаются заново (устройство r25)32, а SDK предупреждает, что на глобальные переменные полагаться нельзя (SDK)108. Для постоянных данных в SDK есть data_dir_path, но на устройствах без System Storage и Flash Memory Storage ключ не задан (SDK)109; его значение на r25 — §3.4.

2.12. Веб-часть и плагин без PHP

Объект: www/, www/cgi-bin/ и type plain на tv188b r25 (device).

Веб-часть для старта не нужна, но её легко добавить: www/index.txt отдаётся по http://<IP>/plugins/<p>/index.txt (устройство r25)110, а скрипт www/cgi-bin/env.sh — исполняется по http://<IP>/cgi-bin/plugins/<p>/env.sh (устройство r25)111. Оба отвечают и из локальной сети (устройство r25)112. В коде r24 скрипт CGI запускается как shell-скрипт (код r24)113, а на r25 работает под root (устройство r25)114; в примере ниже заголовки печатает сам скрипт. Начало probes/kb_probe5/www/cgi-bin/env.sh:

#!/bin/sh
echo "Content-Type: text/plain"
echo ""

Подробно — «Пакет плагина».

Плагин без PHP — <type>plain</type> без params/program: зонд-поставщик kb_probe5_sup (probes/kb_probe5_sup/) с такими манифестом и каталогом bin/ регистрируется с launch_capable 0 (устройство r25)102. Что он делает — «Поставщик каталога «Фильмы»». В libduneshell.so r24 есть сообщение «operation '%s' is not supported for plain plugin type» (код r24)115.

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

3.1. Элементы манифеста минимального плагина

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

Элемент Значение в листинге Назначение Где работает Claim
name kb_probe5 идентификатор; [A-Za-z0-9._-], до 64 символов; равен имени каталога формат — SDK; равенство — r25 (устройство r25, SDK)116
caption KB probe 5 подпись плагина в настройках SDK; на r25 попадает в запись installed_plugins.xml (устройство r25, SDK)117
type php тип; на r25 регистрируются php, plain, internal.internal r25 (устройство r25)118
params/program main.php путь к главному PHP-файлу SDK; на r25 загружается из каталога плагина (устройство r25, SDK)119
version, version_index 261026_0000, 1 подпись версии для интерфейса и растущее число версии; описаны в разделе об онлайн-обновлении SDK; на r25 попадают в запись installed_plugins.xml (устройство r25, SDK)120
entry_point/parent_media_url root://applications раздел меню; по SDK — root://tv, root://applications, setup://applications в зонде r25 — root://applications (устройство r25, SDK)121
entry_point/media_url kbp5_props идентификатор узла, уникален в плагине SDK; уникальность на r25 не проверялась (SDK)122
entry_point/caption KB probe 5: props подпись точки входа по SDK; пункт с этой подписью показан в меню SDK; показ в меню — tv188b r25, запрос 11 (устройство r25, SDK)123
entry_point/icon_url gui_skin://large_icons/apps.aai значок; на tv188b r25 иконку показали также plugin_file://icons/kb11.png; без icon_url пункт не появлялся в root://applications, а в setup://applications его не увидели (§2.3) r25 (устройство r25)124
entry_point/actions/key_enter plugin_handle_user_input + params действие на ENTER; params приходят в input_data r25 (устройство r25, SDK)125

Поля entry_point SDK перечисляет как возможные и ни одно не называет обязательным (SDK)126 (по SDK, на r24+ не подтверждено); подробности о icon_url на r25 — §5. Обязательны ли version и version_index вне онлайн-обновления — см. §6. Необязательный operation_timeout в манифесте задаётся в секундах (устройство r25)43, подробно — «Операции плагина, тайм-ауты и php_server». Что делают ENTER и PLAY у других плагинов — «Приёмы разработки плагинов Dune HD».

3.2. Контекст вызова и ответ call_plugin

Вход на r25 — JSON, на верхнем уровне только op_type_code, op_id, opexec_id, internet_status, input_data и plugin_cookies; путей плагина в нём нет (устройство r25)28. Строка из лога вызова зонда:

{"op_type_code":"handle_user_input","op_id":"4","opexec_id":"4","internet_status":"1","input_data":{"handler_id":"kbp5","control_id":"props","play_mode":"none","topmenu_root_id":"section:applications","selected_media_url":"kbp5_props","orig_selected_media_url":"kbp5_props"},"plugin_cookies":{}}

Поля ответа ниже — по коду r24 (dune_api.php), кроме отмеченных «по SDK».

Ключ ответа Значение Claim
PluginOutputData::has_data есть ли данные (код r24)127
PluginOutputData::data_type тип данных: gui_action, plugin_folder_view и другие, по операции (код r24)57
PluginOutputData::data сами данные (код r24)127
PluginOutputData::plugin_cookies cookies плагина (код r24)127
PluginOutputData::is_error, error_action ошибка и действие для неё, по SDK (SDK)128

Сами GUI-действия — массивы с handler_string_id и data (SDK)129; строковые id в dune_api.php r24 — (код r24)130.

3.3. Что загружено до main.php и какой это PHP

Что Значение на r25 Claim
Порядок загрузки bootstrap.php, dune_api.php, dune_plugin.php, dune_plugin_fw.php, свойства, dune_config.php, программа плагина (устройство r25)24
Определено к main.php DunePluginFw, DuneSystem, PLUGIN_OP_HANDLE_USER_INPUT, hd_print (устройство r25)25
Версия и SAPI в php_server PHP 5.3.6, php_sapi_name() = hd (устройство r25)131
Версия и SAPI в CGI PHP 5.3.6, cgi-fcgi (устройство r25)132
uid php_server — 1000, CGI — 0 (устройство r25)133
include_path .:<каталог плагина>:/data/data/com.dunehd.app/firmware_ext/php/include (устройство r25)134
Свойства DuneSystem::$properties, 8 ключей, в том числе пути §3.4 (устройство r25)135

3.4. Пути плагина на r25

Свойство или путь Значение у kb_probe5 Claim
install_dir_path /data/data/com.dunehd.app/flashdata/plugins/kb_probe5 (устройство r25)136
tmp_dir_path /data/data/com.dunehd.app/tmp/plugins/kb_probe5 (устройство r25)137
data_dir_path /data/data/com.dunehd.app/flashdata/plugins_data/kb_probe5 (устройство r25)138
plugin_www_url http://127.0.0.1:80/plugins/kb_probe5/ (устройство r25)139
plugin_cgi_url http://127.0.0.1:80/cgi-bin/plugins/kb_probe5/ (устройство r25)139

Прочие пути на устройстве — «Пакет плагина».

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

Зонд пишет call_plugin вручную ради наглядности, а плагины обычно подключают каркас. У 8 встроенных плагинов r24 есть свой default_dune_plugin_fw.php с классом DefaultDunePluginFw (код r24)140. В копии android_apps (и идентичной bt_setup) его call_plugin оборачивает call_plugin_impl в json_decode и json_encode (код r24)141, а в файле встроенного плагина экземпляр регистрируется в конце (код r24)142. В Twitch TV файл-программа называет класс через DefaultDunePluginFw::$plugin_class_name (код)143, а экран открывает plugin_open_folder (код)144; Screenshoter вместо этого ставит на ENTER свой обработчик plugin_handle_user_input (код)145. Эта схема и её грабли — «Приёмы разработки плагинов Dune HD».

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

  • hd_create_plugin(). SDK в одном месте требует от PHP-плагина программу с этой функцией (SDK)12, а в другом описывает программу через наследника DunePluginFw, call_plugin() и DunePluginFw::$instance (SDK)52. На tv188b r25 зонды kb_probe5 и kb_probe10 работали без hd_create_plugin(): их main.php объявляет наследника DunePluginFw, и handle_user_input выполнялся (устройство r25)13; зонд kb_probe6 с такой программой загружается и получает от оболочки операции handle_user_input и get_vod_stream_url (устройство r25)53. Стороны (SDK)12 и (устройство r25)13 связаны conflicts_with.
  • icon_url. SDK описывает icon_url среди параметров отображения (disputed, claim — в §6). Поля entry_point он перечисляет как возможные, ни одно не называя обязательным — по SDK, на r24+ не подтверждено (SDK)126. На r25 без него launch_capable 0 и пункт не появлялся (устройство r25)101; в запросе 11 то же наблюдалось у единственной точки setup://applications: launch_capable=0, пункта не увидели (устройство r25)50. Связи conflicts_with у этих claims нет.
  • Путь adb push. SDK приводит adb push в /flashdata/plugins/ (SDK)146; на r25 такого каталога в корне ФС нет, а рабочий путь — /data/data/com.dunehd.app/flashdata/plugins/ (устройство r25)147.
  • Перечитывание плагинов. SDK предлагает cmd=main_screen и cmd=ir_code&ir_code=B24DBF00 (disputed, claim — в §6); на r25 новый каталог они не подхватили (устройство r25)10. Удаление плагина после такого перечитывания в разных прогонах дало разный результат, стороны связаны conflicts_with (устройство r25)148.
  • Поля control-папки. SDK перечисляет у PluginControlsFolderView поля defs, initial_sel_ndx и params (SDK)91, а в dune_api.php r24 у класса есть ещё actions и timer (код r24)149. Стороны связаны conflicts_with.
  • Тайм-аут операции. SDK — 10 с по умолчанию (SDK)150, r25 — 60 с у handle_user_input без operation_timeout (устройство r25)151. По тайм-ауту r25 останавливает php_server и тем прерывает вызов (устройство r25)152, а inference из кода r24 предполагал, что вызов не прерывается и его результат отбрасывается (inference, claim — в §6); подробно — «Операции плагина, тайм-ауты и php_server».
  • Типы плагина. Раздел манифеста SDK называет только php (SDK)6, другой раздел добавляет plain (SDK)153, а на r25 регистрируются php, plain и internal.internal (устройство r25)118.

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

Листинги и шаги этой главы. В базе нет данных о следующем.

Что Что известно Что наблюдать
Открытие control-папки dialog_scroll_probe снимок есть: files/shots/screen.png, отдельного claim нет оформить claim
Регулярная папка стороннего плагина на r25 в запросе 11 (tv188b r25, один прогон) папка зонда не открылась: после запуска KB11 reg оболочка вызвала get_folder_view("kbp11_reg"), вместо папки — диалог «Ошибка приложения», ENTER на элементах не нажимали (устройство r25)92. В отличие от ответа AbstractRegularScreen зонд не задаёт archive и folder_type (код r25)154, а SetupFoldersScreen дополнительно задаёт геометрию подписи, not_loaded_view_item_params и async_icon_loading=false (код r25)155. Причина не установлена, дефект прошивки этим прогоном не установлен (гипотеза — ниже) повторить с полной формой, снять сырой JSON и shell.log
Проверка подписи при установке ZIP на r25 неподписанные kb_probe5_plat (устройство r25)156 и kb_probe11z (устройство r25)78 приняты; механизм и политика этим не установлены (гипотеза — ниже) ZIP с неверной dune_plugin.sign: отказ или установка
adb не описано, как включить его в меню, и не проверено без adb root, chown, chmod шаги на чистом устройстве
Точка входа без icon_url у других родителей, например root://tv наблюдались root://applications (устройство r25)8 и setup://applications (устройство r25)50; root://tv из перечня SDK (§3.1) без него не пробовали снять icon_url у точки входа в root://tv
Другие сбои в коде верхнего уровня main.php и повторная загрузка после исправления в запросе 11 наблюдалась E_PARSE намеренно сломанного kb_probe11s (§2.10) (устройство r25)16 Fatal error вне функций; исправить файл и вызвать снова
Где на экране виден caption плагина на r25 в меню пункт показан с подписью точки входа «KB probe 5: props» (устройство r25)48; подпись плагина в настройках — описание SDK (§3.1) где появляется caption плагина
Манифест без version, version_index или entry_point/caption в листингах эти элементы есть; вне онлайн-обновления требований к первым двум в claims нет снять элемент: регистрация и пункт в меню
Эта цепочка на r24 и других устройствах зонды на r24 не ставились повторить на r24

Гипотезы и ослабленные утверждения.

Утверждение Статус Claim
Ошибка открытия KB11 reg могла быть связана с неполной формой ответа зонда; дефект прошивки прогоном не установлен inference (вывод r25)157
Отсутствие подписи не помешало установке kb_probe5_plat; это не доказывает, что подпись не проверяется у других плагинов, и не задаёт политику кастомных прошивок inference (вывод r25)158
SDK: параметры отображения точки входа, среди них icon_url doc, disputed (SDK)159
SDK: перечитать плагины по IP Control или ANGLE doc, disputed (SDK)160
Тайм-аут r24 не прерывает PHP-вызов: результат приходит позже и отбрасывается inference, disputed (вывод r24)161
gui_skin:// разрешается относительно каталога текущего скина inference (вывод r25)162
Оболочка вызывает плагин через DunePluginFw::$instance->call_plugin inference (вывод r24)163
php_server исполняет вызов выражением $out = …($in) inference (вывод r24)164
Неизвестные элементы манифеста игнорируются с сообщением inference (вывод r24)165
r24 поддерживает типы php и plain, у plain операции отклоняются inference (вывод r24)166
Правка main.php подхватывается по времени изменения (на r25 наблюдалось, §2.11) inference, disputed (вывод r24)167

  1. fw-tv188b-261021-0117-r25--plugin-loader.c041 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 проверка cmp подтвердила побайтовое совпадение dune_plugin.xml (751 байт) и main.php (1692 байт) зонда kb_probe5 с листингами quick-start §2.2 и §2.4. ↩↩↩

  2. fw-tv188b-261021-0117-r25--plugin-loader.c042 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 сокращённый kb_probe5 после adb push, chown system:system и перезапуска приложения зарегистрирован как php с launch_capable=1 и category=applications. ↩↩

  3. fw-tv188b-261021-0117-r25--plugin-loader.c044 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 установка dune_plugin_kb_probe5.zip с двумя файлами листинга зарегистрировала kb_probe5 как php без смены pid приложения 12389. ↩↩↩

    • fw-tv188b-261021-0117-r25--plugin-loader.c043 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 после adb push листинга kb_probe5 пункт «KB probe 5: props» виден с иконкой в «Приложения» → DUNE HD; ENTER открывает диалог «KB probe 5» с «OK: props».
    • fw-tv188b-261021-0117-r25--plugin-loader.c045 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 после установки ZIP листинга kb_probe5 пункт «KB probe 5: props» доступен в «Приложения» без перезапуска приложения; ENTER даёт диалог «KB probe 5 / OK: props».

    ↩

  4. doc-sdk-plugins.c025 · doc · any-documented; прошивка — · dune_plugin.xml — единственный файл, обязательный для загрузки плагина; остальные файлы указываются в манифесте и могут называться как угодно ↩↩

  5. doc-sdk-plugins.c030 · doc · any-documented; прошивка — · Раздел манифеста утверждает, что из типов движка (dune_plugin->type) поддерживается только 'php' с единственным обязательным параметром 'program' — путём к главному PHP-файлу ↩↩↩

  6. fw-tv188b-261021-0117-r25.c371 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 зонд kb_probe10, установленный из двух файлов (dune_plugin.xml и main.php), установился и отработал: точка входа kbp10_run запущена через plugin_launcher, handle_user_input выполнил kbp10_run, в /tmp/kb_probe10 появились started.txt и wget.txt. ↩↩

  7. 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.c206 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 плагин разворачивается без установщика: каталог копируется adb push (под adb root) в /data/data/com.dunehd.app/flashdata/plugins/, затем chown -R system:system и chmod -R +x для bin и www/cgi-bin; после перезапуска приложения (am force-stop com.dunehd.app) оболочка регистрирует такой плагин («Plugin '

      ' of type '' is registered»).

    • 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.

    ↩

  8. 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. ↩↩↩↩

    • doc-sdk-plugins.c054 · doc · any-documented; прошивка — · Программа плагина должна: объявить класс-наследник DunePluginFw, реализовать в нём call_plugin() и присвоить экземпляр в DunePluginFw::$instance
    • 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.

    ↩

  9. doc-sdk-plugins.c026 · doc · any-documented; прошивка — · PHP-плагин обязан содержать PHP-программу с функцией hd_create_plugin(); путь к ней задаётся в dune_plugin.xml ↩↩↩↩

  10. fw-tv188b-261021-0117-r25.c372 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 PHP-зонды kb_probe5 и kb_probe10 работали без hd_create_plugin(): их main.php объявляет класс, унаследованный от DunePluginFw, и handle_user_input выполнялся. ↩↩↩↩

    • fw-tv188b-261021-0117-r25.c328 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 строки hd_print() из кода плагина попадают в /tmp/run/<плагин>.log с префиксом «[pid] [t] [время]»: hd_print("kbp5: …") зонда дал «[17362] [t17362] [2026-10-26 10:38:00.049061] kbp5: props dumped to /tmp/kb_probe5/props.txt».
    • fw-tv188b-261021-0117-r25.c326 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 ошибки и предупреждения PHP в коде плагина php_server пишет в /tmp/run/<плагин>.log строкой вида «[<полный путь файла>:<строка>] [E_WARNING] …» / «[…] [E_ERROR] …».

    ↩

    • 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-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 = Ошибка приложения)»; на экране — «Ошибка приложения / Произошла ошибка. Приложение будет закрыто.».

    ↩

  11. fw-tv188b-261021-0117-r25--php-framework.c058 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 загрузка намеренно синтаксически сломанного main.php kb_probe11s завершилась E_PARSE на строке 4 (syntax error, unexpected ';'); shell.log записал PHP_CALL_FAILED и plugin_show_error. ↩↩↩

  12. 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. ↩↩

  13. 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» сообщений о перезапуске нет. ↩

  14. fw-tv188b-261021-0117-r25.c225 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при каждой из пяти загрузок плагинов в снимке shell.log оболочка пишет «=====> Loading plugins from '/flashdata/plugins'», а затем «… '/firmware_ext/plugins'»; других каталогов в строках «Loading plugins from» нет. ↩↩

  15. fw-tv188b-261021-0117-r25.c206 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 плагин разворачивается без установщика: каталог копируется adb push (под adb root) в /data/data/com.dunehd.app/flashdata/plugins/, затем chown -R system:system и chmod -R +x для bin и www/cgi-bin; после перезапуска приложения (am force-stop com.dunehd.app) оболочка регистрирует такой плагин («Plugin '

    ' of type '' is registered»). ↩↩↩↩↩

  16. fw-tv188b-261021-0117-r25.c297 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 php_server нового PHP-плагина из flashdata запускается при первом вызове плагина, а не при его регистрации: после регистрации kb_probe6 процесса php_server kb_probe6 нет, а при первом handle_user_input в shell.log идут «start (timeout=60.0s)», «[kb_probe6] [php] creating...», «server started; pid: 31928.», «ready.» (так же у kb_probe5, pid 17362). ↩↩

  17. fw-tv188b-261021-0117-r25.c211 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 запись /tmp/run/installed_plugins.xml для плагина из $FS_PREFIX/flashdata/plugins (от до ) содержит name, caption, path, version_index, version и launch_capable; path — полный путь с $FS_PREFIX (/data/data/com.dunehd.app/flashdata/plugins/

    ). Полей version_id, patch_index и delete_capable в записях зондов нет. ↩

  18. fw-tv188b-261021-0117-r25.c212 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у плагина kb_probe5, все 6 точек входа которого (parent_media_url root://applications) были без icon_url, в /tmp/run/installed_plugins.xml launch_capable 0 и нет category; после добавления в каждую точку входа icon_url gui_skin://large_icons/apps.aai и перезапуска приложения — launch_capable 1 и category applications. ↩↩↩

  19. 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 даёт тот же порядок файлов. ↩↩↩

  20. fw-tv188b-261021-0117-r25.c314 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 к исполнению программы плагина (код верхнего уровня main.php) уже определены классы DunePluginFw и DuneSystem, константа PLUGIN_OP_HANDLE_USER_INPUT и функция hd_print. ↩↩↩

  21. doc-sdk-plugins.c038 · doc · any-documented; прошивка — · actions точки входа — соответствие событие (клавиша) → GUI-действие при фокусе на точке входа; popup_menu добавляет пункты в контекстное меню точки входа ↩

  22. fw-tv188b-261021-0117-r25.c336 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 строковый id plugin_handle_user_input в key_enter манифеста принят: при выборе точки входа kbp5.native shell.log пишет «plugin D: kb_probe5->handle_user_input(kbp5.native): start (timeout=60.0s)». ↩

  23. fw-tv188b-261021-0117-r25.c296 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 JSON-контекст вызова handle_user_input, который получает call_plugin PHP-плагина, содержит на верхнем уровне только op_type_code, op_id, opexec_id, internet_status, input_data и plugin_cookies; install_dir_path, tmp_dir_path, data_dir_path, plugin_www_url и plugin_cgi_url в нём нет. ↩↩

    • doc-sdk-plugins.c046 · doc · any-documented; прошивка — · Вызов плагина концептуально — string call_plugin(string call_ctx_json): JSON с кодом операции и параметрами на входе, JSON с результатом на выходе
    • fw-tv188b-260827-0003-r24--php-framework.c213 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginOutputData с ключами (6): has_data, data_type, data, plugin_cookies, is_error, error_action

    ↩

  24. fw-tv188b-261021-0117-r25.c339 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 строковый id plugin_show_error в ответе handle_user_input принят: shell.log пишет result action plugin_show_error. ↩

  25. fw-tv188b-261021-0117-r25.c307 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 статическая переменная класса плагина сохраняется между вызовами, пока жив php_server: счётчик KbProbe5Fw::$n, увеличиваемый в каждом call_plugin, рос 1→5 в пяти вызовах процесса 17362 (13:38:00–13:39:25). ↩

  26. 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). ↩↩

  27. doc-sdk-plugins.c060 · doc · any-documented; прошивка — · Плагин обрабатывает одновременно только один вызов: вызовы из Dune GUI всегда сериализуются ↩

  28. fw-tv188b-260827-0003-r24--php-framework.c016 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Абстрактный класс DunePluginFw имеет статическое поле $instance (комментарий: должно содержать экземпляр DunePluginFw) и абстрактный метод call_plugin($call_ctx_json), возвращающий строку ↩

  29. fw-tv188b-260827-0003-r24--php-framework.c304 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · php_server содержит пути /firmware_ext/php/bootstrap.php, dune_api.php, dune_plugin.php, dune_plugin_fw.php, dune_config.php, шаблон «require ('%s');» и сообщение «[server] loading '%s'...» ↩

  30. 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-прошивках отсутствуют ↩

    • fw-tv188b-261021-0117-r25--plugin-loader.c042 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 сокращённый kb_probe5 после adb push, chown system:system и перезапуска приложения зарегистрирован как php с launch_capable=1 и category=applications.
    • fw-tv188b-261021-0117-r25--plugin-loader.c044 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 установка dune_plugin_kb_probe5.zip с двумя файлами листинга зарегистрировала kb_probe5 как php без смены pid приложения 12389.

    ↩

    • doc-sdk-plugins.c025 · doc · any-documented; прошивка — · dune_plugin.xml — единственный файл, обязательный для загрузки плагина; остальные файлы указываются в манифесте и могут называться как угодно
    • doc-sdk-plugins.c016 · doc · any-documented; прошивка — · Установщик плагина — ZIP-архив с файлом dune_plugin.xml на верхнем уровне и прочими файлами плагина

    ↩

    • doc-sdk-plugins.c030 · doc · any-documented; прошивка — · Раздел манифеста утверждает, что из типов движка (dune_plugin->type) поддерживается только 'php' с единственным обязательным параметром 'program' — путём к главному PHP-файлу
    • 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 даёт тот же порядок файлов.

    ↩

    • doc-sdk-plugins.c092 · doc · any-documented; прошивка — · Файлы в bin/ и www/cgi-bin/ плагина при установке становятся исполняемыми (ZIP не хранит UNIX-атрибуты)
    • 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-261021-0117-r25.c154 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 файл www/index.txt плагина отдаётся по http:///plugins/

      /index.txt: HTTP 200, Content-type: text/plain, Accept-Ranges: bytes, тело — содержимое файла.

    • fw-tv188b-261021-0117-r25.c155 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 запрос http:///cgi-bin/plugins/kb_probe5/env.sh?kbp5=1 выполнил скрипт www/cgi-bin/env.sh плагина: его вывод вернулся с HTTP 200, QUERY_STRING=kbp5=1 и REQUEST_URI переданы скрипту.

    ↩

  31. 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 его нет ни под тем, ни под другим именем. ↩

  32. 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 с. ↩↩

    • fw-tv188b-261021-0117-r25.c209 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25, если name в dune_plugin.xml не равен имени каталога плагина, оболочка при загрузке пишет в shell.log «[populate_plugins] invalid plugin manifest from '<путь>/dune_plugin.xml': name '' is not equal to directory name '<каталог>'».
    • 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 его нет ни под тем, ни под другим именем.

    ↩↩

  33. doc-sdk-plugins.c028 · doc · any-documented; прошивка — · dune_plugin->name — идентификатор плагина: непустой, только алфавитно-цифровые символы и '-', '.', '_', длина не более 64 ↩

  34. doc-sdk-plugins.c101 · doc · any-documented; прошивка — · Картинки можно указывать как http://, plugin_archive://archive/path, plugin_file://path или gui_skin://path (ресурс стандартного скина прошивки) ↩↩

  35. fw-tv188b-261021-0117-r25--gui-resources.c003 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Базовый скин firmware/skin/ в r25 — 743 записи tree.tsv (292 image, 388 binary, 63 text): 12 каталогов ресурсов (battery_icons, button_icons, cut_images, flags, images, large_icons, osd_icons, scrollbar_icons, small_icons, special_icons, weather_icons, wifi_icons) и два файла dune_skin.properties, dune_skin_config.xml; крупнейшие — cut_images 245, flags 241, large_icons 82. ↩

  36. fw-tv188b-261021-0117-r25--plugin-loader.c043 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 после adb push листинга kb_probe5 пункт «KB probe 5: props» виден с иконкой в «Приложения» → DUNE HD; ENTER открывает диалог «KB probe 5» с «OK: props». ↩↩↩

  37. fw-tv188b-261021-0117-r25--plugin-loader.c058 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 kb_probe11p с icon_url=plugin_file://icons/kb11.png зарегистрирован с launch_capable=1, category=applications и logo_url=plugin_file://%kb_probe11p%/icons/kb11.png; в Приложения → DUNE HD пункт KB11 file icon показал синюю квадратную иконку. ↩

  38. fw-tv188b-261021-0117-r25--plugin-loader.c057 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 kb_probe11i с единственной точкой setup://applications без icon_url зарегистрирован с launch_capable=0; при просмотре всех четырёх рядов Настройки → Приложения пункта KB11 no icon не увидели. ↩↩↩

  39. 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. ↩

  40. doc-sdk-plugins.c054 · doc · any-documented; прошивка — · Программа плагина должна: объявить класс-наследник DunePluginFw, реализовать в нём call_plugin() и присвоить экземпляр в DunePluginFw::$instance ↩↩

  41. 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-261021-0117-r25--plugin-loader.c041 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 проверка cmp подтвердила побайтовое совпадение dune_plugin.xml (751 байт) и main.php (1692 байт) зонда kb_probe5 с листингами quick-start §2.2 и §2.4.
    • fw-tv188b-261021-0117-r25--plugin-loader.c042 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 сокращённый kb_probe5 после adb push, chown system:system и перезапуска приложения зарегистрирован как php с launch_capable=1 и category=applications.
    • fw-tv188b-261021-0117-r25--plugin-loader.c044 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 установка dune_plugin_kb_probe5.zip с двумя файлами листинга зарегистрировала kb_probe5 как php без смены pid приложения 12389.

    ↩

  42. 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-261021-0117-r25.c296 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 JSON-контекст вызова handle_user_input, который получает call_plugin PHP-плагина, содержит на верхнем уровне только op_type_code, op_id, opexec_id, internet_status, input_data и plugin_cookies; install_dir_path, tmp_dir_path, data_dir_path, plugin_www_url и plugin_cgi_url в нём нет.
    • fw-tv188b-260827-0003-r24--php-framework.c213 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginOutputData с ключами (6): has_data, data_type, data, plugin_cookies, is_error, error_action

    ↩

    • fw-tv188b-260827-0003-r24--php-framework.c025 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · DunePluginFw::get_out_type_code($op_code) сопоставляет операции типам выходных данных: folder view → plugin_folder_view, regular folder items → plugin_regular_folder_range, handle_user_input и change_tv_favorites → gui_action, tv_info → plugin_tv_info, day_epg → plugin_tv_epg_program_list, *_url → url, vod_info → plugin_vod_info, vod_stream_info → plugin_stream_info
    • fw-tv188b-260827-0003-r24--php-framework.c111 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php задаёт перечисление PluginOutputDataType строковыми константами: PLUGIN_OUT_DATA_PLUGIN_FOLDER_VIEW='plugin_folder_view', PLUGIN_OUT_DATA_PLUGIN_REGULAR_FOLDER_RANGE='plugin_regular_folder_range', PLUGIN_OUT_DATA_GUI_ACTION='gui_action', PLUGIN_OUT_DATA_PLUGIN_TV_INFO='plugin_tv_info', PLUGIN_OUT_DATA_PLUGIN_TV_EPG_PROGRAM_LIST='plugin_tv_epg_program_list', PLUGIN_OUT_DATA_URL='url', PLUGIN_OUT_DATA_PLUGIN_VOD_INFO='plugin_vod_info', PLUGIN_OUT_DATA_PLUGIN_STREAM_INFO='plugin_stream_info'

    ↩↩↩

  43. fw-tv188b-261021-0117-r25.c262 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 params (handler_id, control_id) действия plugin_handle_user_input из key_enter точки входа в манифесте приходят полями handler_id и control_id в input_data операции handle_user_input. ↩

    • fw-tv188b-260827-0003-r24--php-framework.c019 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · invoke_operation использует поля контекста вызова op_type_code, input_data, plugin_cookies, internet_status, opexec_id; имя вызываемого метода плагина равно значению op_type_code
    • fw-tv188b-260827-0003-r24--php-framework.c025 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · DunePluginFw::get_out_type_code($op_code) сопоставляет операции типам выходных данных: folder view → plugin_folder_view, regular folder items → plugin_regular_folder_range, handle_user_input и change_tv_favorites → gui_action, tv_info → plugin_tv_info, day_epg → plugin_tv_epg_program_list, *_url → url, vod_info → plugin_vod_info, vod_stream_info → plugin_stream_info

    ↩

    • fw-tv188b-261021-0117-r25.c206 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 плагин разворачивается без установщика: каталог копируется adb push (под adb root) в /data/data/com.dunehd.app/flashdata/plugins/, затем chown -R system:system и chmod -R +x для bin и www/cgi-bin; после перезапуска приложения (am force-stop com.dunehd.app) оболочка регистрирует такой плагин («Plugin '

      ' of type '' is registered»).

    • 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 перед этим.

    ↩

  44. 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. ↩

  45. 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 нет. ↩

  46. fw-tv188b-261021-0117-r25.c208 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 каталоги плагинов, положенные adb push под adb root в /data/data/com.dunehd.app/flashdata/plugins и переданные chown system:system, имеют SELinux-метку u:object_r:system_app_data_file:s0 — такую же, как у каталога соседнего плагина (Bazinga3); chcon не понадобился. ↩

  47. fw-tv188b-261021-0117-r25.c084 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после am force-stop com.dunehd.app приложение Dune поднимается само (новый pid) за 1–2 с, без am start. ↩

  48. 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 перед этим. ↩

  49. 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 выполнились. ↩↩

  50. 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. ↩

  51. fw-tv188b-261021-0117-r25.c076 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 плагин, положенный через adb push без перезагрузки, получил boot при ближайшем старте приложения Dune (после am force-stop), а не при загрузке системы; флага kb_probe5_plugin_boot_action_executed.flag до этого не было. ↩

    • fw-tv188b-261021-0117-r25.c211 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 запись /tmp/run/installed_plugins.xml для плагина из $FS_PREFIX/flashdata/plugins (от до ) содержит name, caption, path, version_index, version и launch_capable; path — полный путь с $FS_PREFIX (/data/data/com.dunehd.app/flashdata/plugins/

      ). Полей version_id, patch_index и delete_capable в записях зондов нет.

    • fw-tv188b-261021-0117-r25.c212 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у плагина kb_probe5, все 6 точек входа которого (parent_media_url root://applications) были без icon_url, в /tmp/run/installed_plugins.xml launch_capable 0 и нет category; после добавления в каждую точку входа icon_url gui_skin://large_icons/apps.aai и перезапуска приложения — launch_capable 1 и category applications.

    ↩↩

  52. fw-tv188b-261021-0117-r25.c204 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 (collect6) плагины, удалённые rm -rf из /data/data/com.dunehd.app/flashdata/plugins, после перечитывания по IP Control (cmd=main_screen + cmd=ir_code&ir_code=B24DBF00) остались в /tmp/run/installed_plugins.xml (grep -c kb_probe6 = 4) и в меню «Приложения»; исчезли они только после am force-stop com.dunehd.app. ↩

  53. fw-tv188b-261021-0117-r25.c205 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 (collect5) после rm -rf каталогов зондов kb_probe5* из /data/data/com.dunehd.app/flashdata/plugins и перечитывания по IP Control (cmd=main_screen + cmd=ir_code&ir_code=B24DBF00) в /tmp/run/installed_plugins.xml не было ни одной строки с kb_probe5 (grep -c = 0). ↩

  54. doc-sdk-plugins.c017 · doc · any-documented; прошивка — · Плагин устанавливается запуском файла dune_plugin*.zip с любого носителя (например, USB-флешки) и ставится во флеш-память устройства ↩

  55. doc-sdk-plugins.c016 · doc · any-documented; прошивка — · Установщик плагина — ZIP-архив с файлом dune_plugin.xml на верхнем уровне и прочими файлами плагина ↩

  56. fw-tv188b-261021-0117-r25.c219 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 dune_plugin_kb_probe5_plat.zip, запущенный в файловом браузере плеера из /sdcard/DuneHD, установлен в /data/data/com.dunehd.app/flashdata/plugins/kb_probe5_plat; после установки есть также каталоги /data/data/com.dunehd.app/flashdata/plugins_archive/kb_probe5_plat, …/flashdata/plugins_data/kb_probe5_plat и /tmp/plugins/kb_probe5_plat. ↩

  57. fw-tv188b-261021-0117-r25.c218 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после штатной установки ZIP оболочка пишет «[plugin_installer] reloading plugin», регистрирует плагин («Plugin 'kb_probe5_plat' of type 'plain' is registered») и «[plugin_installer] Done.» в том же процессе приложения (pid 19586), без перезапуска приложения. ↩↩

  58. fw-tv188b-261021-0117-r25.c216 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после штатной установки ZIP файл bin/marker.txt, который в ZIP имел права -rw-r--r--, получил -rwxr-xr-x, а dune_plugin.xml и only_android.txt в корне плагина остались -rw-r--r--. ↩

  59. fw-tv188b-261021-0117-r25--plugin-loader.c045 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 после установки ZIP листинга kb_probe5 пункт «KB probe 5: props» доступен в «Приложения» без перезапуска приложения; ENTER даёт диалог «KB probe 5 / OK: props». ↩↩

  60. fw-tv188b-261021-0117-r25--plugin-loader.c046 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 штатный установщик принял dune_plugin_kb_probe11z.zip без dune_plugin.sign и dune_plugin_signer_id.txt и зарегистрировал kb_probe11z как php. ↩↩↩

  61. fw-tv188b-261021-0117-r25--plugin-loader.c047 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 после установки kb_probe11z оболочка выполнила global action install как sh bin/ga.sh install; маркер ga_install.txt записал event=install и uid=1000(system). ↩

  62. fw-tv188b-261021-0117-r25--plugin-loader.c052 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 штатная установка kb_probe11z изменила mode файлов bin/ga.sh и www/cgi-bin/ping.sh с 644 в ZIP на 755 в каталоге плагина. ↩

  63. fw-tv188b-261021-0117-r25--plugin-loader.c048 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 после установки неподписанного kb_probe11z ENTER пультом на «KB11 zip» в «Приложения» → DUNE HD вызвал handle_user_input с control_id=enter и диалог «KB probe 11z / OK: zip». ↩

    • fw-tv188b-261021-0117-r25.c336 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 строковый id plugin_handle_user_input в key_enter манифеста принят: при выборе точки входа kbp5.native shell.log пишет «plugin D: kb_probe5->handle_user_input(kbp5.native): start (timeout=60.0s)».
    • fw-tv188b-261021-0117-r25.c339 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 строковый id plugin_show_error в ответе handle_user_input принят: shell.log пишет result action plugin_show_error.

    ↩↩

  64. doc-sdk-plugins--gui-actions.c044 · doc · any-documented; прошивка — · PluginShowErrorAction в режиме воспроизведения показывает одну строку текста в центре экрана, а в меню Dune — диалог с заголовком и строками сообщения ↩

  65. doc-sdk-plugins--gui-actions.c043 · doc · any-documented; прошивка — · Данные PluginShowErrorAction — класс PluginShowErrorActionData: fatal (Boolean), title (String), msg_lines (List, необязательно) ↩

  66. doc-sdk-plugins--gui-actions.c045 · doc · any-documented; прошивка — · При fatal == true PluginShowErrorAction планирует выход из плагина по фатальной ошибке: воспроизведение останавливается, браузер Dune переходит в верхнее меню ↩

  67. fw-tv188b-261021-0117-r25.c328 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 строки hd_print() из кода плагина попадают в /tmp/run/<плагин>.log с префиксом «[pid] [t] [время]»: hd_print("kbp5: …") зонда дал «[17362] [t17362] [2026-10-26 10:38:00.049061] kbp5: props dumped to /tmp/kb_probe5/props.txt». ↩

  68. doc-sdk-plugins--operations.c003 · doc · any-documented; прошивка — · get_folder_view() вызывается, когда GUI Dune исполняет действие PLUGIN_OPEN_FOLDER ↩

  69. doc-sdk-plugins--gui-actions.c033 · doc · any-documented; прошивка — · PluginOpenFolderAction открывает папку плагина: caption добавляется в блок пути, выполняется операция Get_folder_view($media_url), её результат показывается как содержимое папки ↩↩

    • fw-tv188b-261021-0117-r25--php-framework--native-actions.c036 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В show_dialog подпись не получает фокус: в окне A из 30 подписей и кнопки OK фокус при открытии стоит на OK.
    • fw-tv188b-261021-0117-r25--php-framework--native-actions.c049 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Настоящий пульт на той же прошивке подтвердил: в окнах A (подписи) и B (подписи с max_height 875) прокрутки нет, в C (кнопки) есть, кнопка OK закрывает окно.

    ↩

  70. doc-sdk-plugins--operations.c023 · doc · any-documented; прошивка — · PluginControlsFolderView::initial_sel_ndx — индекс (с 0) контрола, получающего фокус первым; -1 означает контрол по умолчанию (первый) ↩

  71. doc-sdk-plugins--operations.c020 · doc · any-documented; прошивка — · Класс PluginControlsFolderView имеет поля defs (Array), initial_sel_ndx (int), params (PluginFolderViewParams) ↩↩

  72. fw-tv188b-261021-0117-r25--php-framework.c054 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 после запуска KB11 reg оболочка вызвала get_folder_view("kbp11_reg"), а lead увидел диалог «Ошибка приложения» вместо папки и не нажимал ENTER на элементах. ↩↩

    • 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.c328 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 строки hd_print() из кода плагина попадают в /tmp/run/<плагин>.log с префиксом «[pid] [t] [время]»: hd_print("kbp5: …") зонда дал «[17362] [t17362] [2026-10-26 10:38:00.049061] kbp5: props dumped to /tmp/kb_probe5/props.txt».
    • fw-tv188b-261021-0117-r25.c326 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 ошибки и предупреждения PHP в коде плагина php_server пишет в /tmp/run/<плагин>.log строкой вида «[<полный путь файла>:<строка>] [E_WARNING] …» / «[…] [E_ERROR] …».

    ↩

    • fw-tv188b-261021-0117-r25.c206 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 плагин разворачивается без установщика: каталог копируется adb push (под adb root) в /data/data/com.dunehd.app/flashdata/plugins/, затем chown -R system:system и chmod -R +x для bin и www/cgi-bin; после перезапуска приложения (am force-stop com.dunehd.app) оболочка регистрирует такой плагин («Plugin '

      ' of type '' is registered»).

    • fw-tv188b-261021-0117-r25.c209 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25, если name в dune_plugin.xml не равен имени каталога плагина, оболочка при загрузке пишет в shell.log «[populate_plugins] invalid plugin manifest from '<путь>/dune_plugin.xml': name '' is not equal to directory name '<каталог>'».
    • fw-tv188b-261021-0117-r25.c336 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 строковый id plugin_handle_user_input в key_enter манифеста принят: при выборе точки входа kbp5.native shell.log пишет «plugin D: kb_probe5->handle_user_input(kbp5.native): start (timeout=60.0s)».
    • fw-tv188b-261021-0117-r25.c339 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 строковый id plugin_show_error в ответе handle_user_input принят: shell.log пишет result action plugin_show_error.
    • 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 = Ошибка приложения)».

    ↩

  73. fw-tv188b-261021-0117-r25.c330 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 метки времени в /tmp/run/<плагин>.log и shell.log на 3 часа меньше местного времени: вызов, который date() в php_server kb_probe5 записал как 13:38:00, в логе плагина помечен 10:38:00.049. ↩

  74. 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. ↩

  75. fw-tv188b-261021-0117-r25.c327 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 предупреждение PHP попадает в /tmp/run/<плагин>.log и для выражения с оператором подавления @: @mkdir(...) в main.php:11 зонда при существующем каталоге дал строку «[…/main.php:11] [E_WARNING] mkdir() …: File exists» при каждом запуске php_server. ↩

  76. doc-sdk-plugins.c139 · doc · sigma-smp86xx, sigma-smp87xx, android; прошивка — · Лог плагина — /tmp/run/.log (Sigma: tail -F через telnet; Android: busybox tail -F через telnet/ADB) ↩

  77. fw-tv188b-261021-0117-r25.c325 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после создания /config/hd_debug/PHP_CLIENT.txt со значением 1 на работающем приложении (13:39:01, без его перезапуска) в выборке shell.log по вызовам kb_probe5 сообщений «start_call(): call_id…» и «[call: N]: starting...» не появилось — только «start (timeout=60.0s)» и «result action» (и строки перезапуска по mtime). ↩

  78. fw-tv188b-260827-0003-r24--plugin-loader.c009 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит сообщения проверки манифеста: «name is missing», «name '%s' is invalid», «plugin already registered with name», «name '%s' is not equal to directory name '%s'», «caption is invalid or missing», «type is missing», «type '%s' is not supported» ↩

    • fw-tv188b-261021-0117-r25.c212 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у плагина kb_probe5, все 6 точек входа которого (parent_media_url root://applications) были без icon_url, в /tmp/run/installed_plugins.xml launch_capable 0 и нет category; после добавления в каждую точку входа icon_url gui_skin://large_icons/apps.aai и перезапуска приложения — launch_capable 1 и category applications.
    • fw-tv188b-261021-0117-r25.c213 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 точки входа плагина kb_probe5 (root://applications), заданные без icon_url, в разделе «Приложения» не появлялись.

    ↩↩

  79. fw-tv188b-261021-0117-r25.c221 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 плагин с type plain без params/program (зонды-поставщики kb_probe5_sup и kb_probe6_sup: в каталоге только dune_plugin.xml и bin/) регистрируется; его запись в /tmp/run/installed_plugins.xml — launch_capable 0 и movie_suppliers со значением params/movie_suppliers. ↩↩

    • fw-tv188b-261021-0117-r25.c319 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при Fatal error в handle_user_input (вызов несуществующей функции) php_server пишет в /tmp/run/<плагин>.log «[<плагин>] [server] php-call failed.» и строку «[<путь к файлу>:<строка>] [E_ERROR] Call to undefined function …»; «can not retrieve 'out'» не появляется.
    • 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-261021-0117-r25.c236 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после сбоя операции handle_user_input php_server с «op 11 failed (read status: 2)» и PHP_CALL_FAILED оболочка пишет «FATAL ERROR detected (msg = Ошибка приложения)» и показывает диалог «Ошибка приложения / Произошла ошибка. Приложение будет закрыто.» с кнопкой OK; после закрытия плеер не завис.

    ↩

    • 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.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.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-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.c241 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 $FS_PREFIX/firmware_ext/php/php-cgi, запущенный из adb shell (adbd root) с LD_LIBRARY_PATH=$FS_PREFIX/lib:$LD_LIBRARY_PATH, не стартует — «CANNOT LINK EXECUTABLE … library "libiconv.so.2" not found: needed by main executable», код 1 (и с -v, и с -q -f).
    • fw-tv188b-261021-0117-r25.c238 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 php-cgi, запущенный CGI-обёрткой плагина без изменения LD_LIBRARY_PATH, стартует и выполняет скрипт; в окружении php-cgi LD_LIBRARY_PATH=/data/data/com.dunehd.app/firmware/lib:/lib:/usr/lib.

    ↩

    • fw-tv188b-261021-0117-r25.c212 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у плагина kb_probe5, все 6 точек входа которого (parent_media_url root://applications) были без icon_url, в /tmp/run/installed_plugins.xml launch_capable 0 и нет category; после добавления в каждую точку входа icon_url gui_skin://large_icons/apps.aai и перезапуска приложения — launch_capable 1 и category applications.
    • 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 перед этим.

    ↩

  80. doc-sdk-plugins.c061 · doc · any-documented; прошивка — · Глобальные переменные PHP обычно сохраняются между вызовами, но экземпляр движка может быть пересоздан в любой момент между вызовами — плагин не должен на них полагаться ↩

  81. doc-sdk-plugins.c066 · doc · any-documented; прошивка — · data_dir_path (постоянные данные) недоступен на устройствах без System Storage и Flash Memory Storage — тогда ключ не задан ↩

  82. fw-tv188b-261021-0117-r25.c154 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 файл www/index.txt плагина отдаётся по http:///plugins/

    /index.txt: HTTP 200, Content-type: text/plain, Accept-Ranges: bytes, тело — содержимое файла. ↩

  83. fw-tv188b-261021-0117-r25.c155 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 запрос http:///cgi-bin/plugins/kb_probe5/env.sh?kbp5=1 выполнил скрипт www/cgi-bin/env.sh плагина: его вывод вернулся с HTTP 200, QUERY_STRING=kbp5=1 и REQUEST_URI переданы скрипту. ↩

  84. fw-tv188b-261021-0117-r25.c156 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 статика www и CGI плагина отвечают на запросы с другого хоста локальной сети: CGI видит REMOTE_ADDR=[::ffff:<адрес в LAN>] при HTTP_HOST=<адрес в LAN> (IP плеера), файл www/index.txt отдаётся тому же клиенту с HTTP 200. ↩

  85. fw-tv188b-260827-0003-r24--http-api.c008 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · CGI-скрипт плагина запускается run_plugin_cgi как shell-скрипт (sh), а не напрямую: PHP-обработчик плагин должен вызвать сам ↩

  86. 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. ↩

  87. fw-tv188b-260827-0003-r24--plugin-loader--manifest.c053 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит сообщение «[plugin] error: operation '%s' is not supported for plain plugin type» и имя program рядом с run.php и php_plugin_op_handle.c ↩

    • doc-sdk-plugins.c028 · doc · any-documented; прошивка — · dune_plugin->name — идентификатор плагина: непустой, только алфавитно-цифровые символы и '-', '.', '_', длина не более 64
    • 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 его нет ни под тем, ни под другим именем.

    ↩

    • doc-sdk-plugins.c029 · doc · any-documented; прошивка — · dune_plugin->caption — подпись плагина, показываемая в Setup / Misc / Plugins
    • fw-tv188b-261021-0117-r25.c211 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 запись /tmp/run/installed_plugins.xml для плагина из $FS_PREFIX/flashdata/plugins (от до ) содержит name, caption, path, version_index, version и launch_capable; path — полный путь с $FS_PREFIX (/data/data/com.dunehd.app/flashdata/plugins/

      ). Полей version_id, patch_index и delete_capable в записях зондов нет.

    ↩

  88. fw-tv188b-261021-0117-r25.c220 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 оболочка регистрирует плагины типов php, plain и internal.internal (dune_internal): «Plugin '

    ' of type '<тип>' is registered». ↩↩

    • doc-sdk-plugins.c030 · doc · any-documented; прошивка — · Раздел манифеста утверждает, что из типов движка (dune_plugin->type) поддерживается только 'php' с единственным обязательным параметром 'program' — путём к главному PHP-файлу
    • fw-tv188b-261021-0117-r25.c290 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 install_dir_path у kb_probe5 = '/data/data/com.dunehd.app/flashdata/plugins/kb_probe5' (is_dir() = true) — тот же путь, что плагина в /tmp/run/installed_plugins.xml.
    • 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 даёт тот же порядок файлов.

    ↩

    • doc-sdk-plugins.c105 · doc · any-documented; прошивка — · Онлайн-обновление: в манифесте задаются version_index (число, растёт с каждой версией, в UI не показывается), version (подпись для UI) и check_update (schema, url, timeout, required, auto)
    • fw-tv188b-261021-0117-r25.c211 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 запись /tmp/run/installed_plugins.xml для плагина из $FS_PREFIX/flashdata/plugins (от до ) содержит name, caption, path, version_index, version и launch_capable; path — полный путь с $FS_PREFIX (/data/data/com.dunehd.app/flashdata/plugins/

      ). Полей version_id, patch_index и delete_capable в записях зондов нет.

    ↩

    • doc-sdk-plugins.c031 · doc · any-documented; прошивка — · Точку входа (entry_point) можно поместить в папки root://tv, root://applications, setup://applications
    • fw-tv188b-261021-0117-r25.c212 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у плагина kb_probe5, все 6 точек входа которого (parent_media_url root://applications) были без icon_url, в /tmp/run/installed_plugins.xml launch_capable 0 и нет category; после добавления в каждую точку входа icon_url gui_skin://large_icons/apps.aai и перезапуска приложения — launch_capable 1 и category applications.

    ↩

  89. doc-sdk-plugins.c037 · doc · any-documented; прошивка — · media_url точки входа — идентификатор узла меню плагина, уникальный в пределах плагина; используется в операциях плагина ↩

    • doc-sdk-plugins.c149 · doc · any-documented; прошивка — · caption у entry_point — подпись точки входа (entry point caption).
    • fw-tv188b-261021-0117-r25--plugin-loader.c043 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 после adb push листинга kb_probe5 пункт «KB probe 5: props» виден с иконкой в «Приложения» → DUNE HD; ENTER открывает диалог «KB probe 5» с «OK: props».

    ↩

    • fw-tv188b-261021-0117-r25.c212 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у плагина kb_probe5, все 6 точек входа которого (parent_media_url root://applications) были без icon_url, в /tmp/run/installed_plugins.xml launch_capable 0 и нет category; после добавления в каждую точку входа icon_url gui_skin://large_icons/apps.aai и перезапуска приложения — launch_capable 1 и category applications.
    • 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--plugin-loader.c043 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 после adb push листинга kb_probe5 пункт «KB probe 5: props» виден с иконкой в «Приложения» → DUNE HD; ENTER открывает диалог «KB probe 5» с «OK: props».
    • fw-tv188b-261021-0117-r25--plugin-loader.c057 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 kb_probe11i с единственной точкой setup://applications без icon_url зарегистрирован с launch_capable=0; при просмотре всех четырёх рядов Настройки → Приложения пункта KB11 no icon не увидели.
    • fw-tv188b-261021-0117-r25--plugin-loader.c058 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 kb_probe11p с icon_url=plugin_file://icons/kb11.png зарегистрирован с launch_capable=1, category=applications и logo_url=plugin_file://%kb_probe11p%/icons/kb11.png; в Приложения → DUNE HD пункт KB11 file icon показал синюю квадратную иконку.

    ↩

    • doc-sdk-plugins.c038 · doc · any-documented; прошивка — · actions точки входа — соответствие событие (клавиша) → GUI-действие при фокусе на точке входа; popup_menu добавляет пункты в контекстное меню точки входа
    • fw-tv188b-261021-0117-r25.c262 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 params (handler_id, control_id) действия plugin_handle_user_input из key_enter точки входа в манифесте приходят полями handler_id и control_id в input_data операции handle_user_input.
    • fw-tv188b-261021-0117-r25.c336 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 строковый id plugin_handle_user_input в key_enter манифеста принят: при выборе точки входа kbp5.native shell.log пишет «plugin D: kb_probe5->handle_user_input(kbp5.native): start (timeout=60.0s)».

    ↩

  90. doc-sdk-plugins.c148 · doc · any-documented; прошивка — · Поля entry_point перечислены как возможные («may contain the following fields»); документ не называет ни одно из них обязательным. ↩↩

  91. fw-tv188b-260827-0003-r24--php-framework.c213 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginOutputData с ключами (6): has_data, data_type, data, plugin_cookies, is_error, error_action ↩↩↩

  92. doc-sdk-plugins.c058 · doc · any-documented; прошивка — · Результат операции — PluginOutputData с полями has_data, data_type, data, plugin_cookies, is_error, error_action; при ошибке is_error = true и может быть задано error_action ↩

  93. doc-sdk-plugins.c070 · doc · any-documented; прошивка — · GUI-действие в PHP — массив с handler_string_id (тип) и data (параметры); среди типов PLUGIN_OPEN_FOLDER, PLUGIN_TV_PLAY, PLUGIN_VOD_PLAY и особый HANDLE_USER_INPUT, чей результат handle_user_input() исполняется как следующее действие ↩

  94. fw-tv188b-260827-0003-r24--php-framework.c116 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: LAUNCH_EXT_APP_ACTION_ID='launch_ext_app', LAUNCH_MEDIA_URL_ACTION_ID='launch_media_url', OPEN_FOLDER_ACTION_ID='open_folder', PLAYLIST_PLAY_ACTION_ID='playlist_play', PLUGIN_CLEAR_ARCHIVE_CACHE_ACTION_ID='plugin_clear_archive_cache', PLUGIN_EXIT_FOLDERS_ACTION_ID='plugin_exit_folders', PLUGIN_HANDLE_USER_INPUT_ACTION_ID='plugin_handle_user_input', PLUGIN_INVALIDATE_FOLDERS_ACTION_ID='plugin_invalidate_folders', PLUGIN_OPEN_FOLDER_ACTION_ID='plugin_open_folder', PLUGIN_REFRESH_ENTRY_POINTS_ACTION_ID='plugin_refresh_entry_points', PLUGIN_REPLACE_PATH_ACTION_ID='plugin_replace_path', PLUGIN_RUN_NATIVE_CODE_ACTION_ID='plugin_run_native_code', PLUGIN_SHOW_ERROR_ACTION_ID='plugin_show_error', PLUGIN_SYSTEM_ACTION_ID='plugin_system', PLUGIN_TV_PLAY_ACTION_ID='plugin_tv_play' ↩

    • 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.c003 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В зонде kb_probe5 на tv188b 261021_0117_r25 php_sapi_name возвращает hd.

    ↩

  95. fw-tv188b-261021-0117-r25.c239 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php-cgi CGI плагина PHP_VERSION = 5.3.6, php_sapi_name() = cgi-fcgi. ↩

  96. 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. ↩

  97. 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 '…'». ↩

  98. fw-tv188b-261021-0117-r25.c288 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 DuneSystem::$properties у PHP-плагина kb_probe5 из flashdata содержит 8 ключей: sdk_version '1.0.0', plugin_name 'kb_probe5', install_dir_path, tmp_dir_path, data_dir_path, plugin_www_url, plugin_cgi_url, few_buttons_remote_type '0'. ↩

  99. fw-tv188b-261021-0117-r25.c290 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 install_dir_path у kb_probe5 = '/data/data/com.dunehd.app/flashdata/plugins/kb_probe5' (is_dir() = true) — тот же путь, что плагина в /tmp/run/installed_plugins.xml. ↩

  100. 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. ↩

  101. fw-tv188b-261021-0117-r25.c292 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 data_dir_path у kb_probe5 (плагин в flashdata) = '/data/data/com.dunehd.app/flashdata/plugins_data/kb_probe5'; is_dir() для него true. ↩

  102. fw-tv188b-261021-0117-r25.c289 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у kb_probe5 plugin_www_url = 'http://127.0.0.1:80/plugins/kb_probe5/', plugin_cgi_url = 'http://127.0.0.1:80/cgi-bin/plugins/kb_probe5/' — с явным портом 80. ↩↩

  103. fw-tv188b-260827-0003-r24--php-framework.c289 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Класс DefaultDunePluginFw extends DunePluginFw определён не в php/, а в файлах default_dune_plugin_fw.php 8 встроенных плагинов: в lib/ у android_apps, bt_setup, dunestore, ext_epg, ktv_start, radiotime, shell_ext и в phplib/ у bluray ↩

  104. fw-tv188b-260827-0003-r24--php-framework.c290 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В копии android_apps (и идентичной bt_setup) DefaultDunePluginFw::call_plugin($call_ctx_json) возвращает json_encode(call_plugin_impl(json_decode($call_ctx_json))) ↩

  105. fw-tv188b-260827-0003-r24--php-framework.c291 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Файл default_dune_plugin_fw.php встроенного плагина в конце регистрирует экземпляр: DunePluginFw::$instance = new DefaultDunePluginFw() ↩

  106. plg-gh-aspel-twitch-dune-plugin.c022 · code · unknown; прошивка — · Точка входа main.php подключает lib/default_dune_plugin_fw.php и main_plugin.php, затем задаёт класс плагина DefaultDunePluginFw::$plugin_class_name = 'TwitchPlugin'. ↩

  107. plg-gh-aspel-twitch-dune-plugin.c007 · code · unknown; прошивка — · В первой точке входа ENTER назначен на действие plugin_open_folder. ↩

  108. plg-dc-screenshoter.c014 · code · unknown; прошивка — · В обеих точках входа клавиши key_enter и key_play вызывают действие plugin_handle_user_input с handler_id = entry ↩

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

    • 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.
    • fw-tv188b-261021-0117-r25.c206 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 плагин разворачивается без установщика: каталог копируется adb push (под adb root) в /data/data/com.dunehd.app/flashdata/plugins/, затем chown -R system:system и chmod -R +x для bin и www/cgi-bin; после перезапуска приложения (am force-stop com.dunehd.app) оболочка регистрирует такой плагин («Plugin '

      ' of type '' is registered»).

    ↩

    • fw-tv188b-261021-0117-r25.c204 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 (collect6) плагины, удалённые rm -rf из /data/data/com.dunehd.app/flashdata/plugins, после перечитывания по IP Control (cmd=main_screen + cmd=ir_code&ir_code=B24DBF00) остались в /tmp/run/installed_plugins.xml (grep -c kb_probe6 = 4) и в меню «Приложения»; исчезли они только после am force-stop com.dunehd.app.
    • fw-tv188b-261021-0117-r25.c205 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 (collect5) после rm -rf каталогов зондов kb_probe5* из /data/data/com.dunehd.app/flashdata/plugins и перечитывания по IP Control (cmd=main_screen + cmd=ir_code&ir_code=B24DBF00) в /tmp/run/installed_plugins.xml не было ни одной строки с kb_probe5 (grep -c = 0).

    ↩

  110. fw-tv188b-260827-0003-r24--php-framework.c199 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginControlsFolderView с ключами (5): defs, actions, timer, initial_sel_ndx, params ↩

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

  112. 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)». ↩

  113. 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-код вызова не доработал. ↩

  114. doc-sdk-plugins.c102 · doc · any-documented; прошивка — · Для чистых FlashLite/HTML-плагинов вместо 'php' можно указать тип 'plain' — тогда PHP-программа и параметр program не нужны ↩

  115. fw-tv188b-261021-0117-r25--php-framework.c055 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Форма KB11 reg использует те же имена view_kind=view_regular, data и initial_range, что AbstractRegularScreen r25, но в отличие от его ответа не задаёт archive и folder_type. ↩

  116. fw-tv188b-261021-0117-r25--php-framework.c056 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · KB11 reg задаёт только num_cols=1/num_rows=5 в view_params и icon_path в base_view_item_params; экран SetupFoldersScreen r25 дополнительно задаёт геометрию подписи, not_loaded_view_item_params и async_icon_loading=false. ↩

  117. fw-tv188b-261021-0117-r25--plugin-loader.c037 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 ZIP dune_plugin_kb_probe5_plat.zip без dune_plugin.sign и dune_plugin_signer_id.txt установлен штатно в /flashdata/plugins/kb_probe5_plat (в логе; фактически /data/data/com.dunehd.app/flashdata/plugins/kb_probe5_plat) и зарегистрирован как Plugin 'kb_probe5_plat' of type 'plain'. ↩

  118. fw-tv188b-261021-0117-r25--php-framework.c057 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Ошибка открытия KB11 reg в запросе 11 могла быть связана с неполной формой ответа зонда: отличия folder_type и параметров вида от встроенного регулярного экрана не исключены; дефект прошивки этим прогоном не установлен. ↩

  119. fw-tv188b-261021-0117-r25--plugin-loader.c039 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 отсутствие dune_plugin.sign и dune_plugin_signer_id.txt не помешало штатной установке и регистрации kb_probe5_plat; это не доказывает, что подпись не проверяется у других плагинов, и не задаёт политику кастомных прошивок. ↩

  120. doc-sdk-plugins.c035 · doc, disputed · any-documented; прошивка — · Параметры отображения точки входа: icon_url, icon_margins и icon_fit_scale_factor (120606+), badge_icon_url (120901+), override_default_badge (141005_b9+) — аналоги свойств ViewItemParams ↩

  121. 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 ↩

  122. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c016 · inference, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Тайм-аут операции (operation_timeout; по SDK по умолчанию 10 с, потиповой N может задать своё значение) отсчитывает оболочка: по истечении она отменяет операцию у себя и сообщает «Operation time exceeded», но PHP-вызов в php_server не прерывается — его результат приходит позже и отбрасывается («Received result for cancelled operation»). ↩

  123. fw-tv188b-261021-0117-r25--gui-resources.c025 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · gui_skin:// разрешается относительно каталога текущего скина из /tmp/dune_skin_dir.txt; значение настройки gui_skin вида alt: выбирает альтернативный скин, extra: — внешний (extra) скин; при отсутствии скина или недопустимом значении — откат на default. ↩

  124. fw-tv188b-260827-0003-r24--php-framework.c293 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Оболочка (libduneshell.so) вызывает плагин через PHP-выражение DunePluginFw::$instance->call_plugin(...), то есть через экземпляр, который регистрирует default_dune_plugin_fw.php плагина ↩

  125. fw-tv188b-260827-0003-r24--php-framework.c308 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · php_server, вероятно, исполняет вызов плагина как PHP-код «$in = <<<EOL …EOL; $out = <выражение>($in);», где выражение (например DunePluginFw::$instance->call_plugin) приходит от оболочки в CallPacket ↩

  126. fw-tv188b-260827-0003-r24--plugin-loader--manifest.c003 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Неизвестные дочерние элементы манифеста (по крайней мере в resources, permissions и там, где выводится «unexpected element»), а также повторные resource type и permission name, вероятно, не делают манифест недействительным: парсер пишет предупреждение и пропускает элемент; для entry_point/popup_menu/menu_items в сообщении нет «ignored», и что происходит там, не установлено ↩

  127. fw-tv188b-260827-0003-r24--plugin-loader--manifest.c055 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Оболочка r24, вероятно, поддерживает типы плагинов php и plain: plain-плагин загружается, но вызовы операций плагина для него отклоняются («not supported for plain plugin type»); это согласуется с SDK о типе plain (doc-sdk-plugins.c102), но не с фразой SDK «поддерживается только php» (doc-sdk-plugins.c030, внутреннее противоречие документа) ↩

  128. fw-tv188b-260827-0003-r24--plugin-loader.c102 · inference, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Изменение файла программы плагина (main.php из params/program; второго аргумента php_server) по времени модификации, вероятно, подхватывается без перезагрузки оболочки — при следующем вызове PHP-сервер плагина перезапускается. ↩