Быстрый старт: минимальный 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. Поэтому у «плагин не работает» много разных причин,
и каждая видна на своём шаге цепочки:
- При старте приложения оболочка читает
flashdata/pluginsиfirmware_ext/plugins(«Loading plugins from …») (устройство r25)19 и регистрирует плагин («Plugin '' of type '
' is registered») (устройство r25)20. Запись появляется в /tmp/run/installed_plugins.xml(устройство r25)22. - Без
icon_urlпункта в разделе «Приложения» нет (устройство r25)8, а уkb_probe5после добавленияicon_urlв точки входа в записи появилисьlaunch_capable 1иcategory applications(устройство r25)23. - При регистрации процесса PHP ещё нет:
php_serverзапускается при первом вызове плагина (устройство r25)21. php_serverподключает системные файлы и затем программу плагина, после чего пишет «[server] ready.» (устройство r25)24. К исполнениюmain.phpуже определеныDunePluginFw,DuneSystem,PLUGIN_OP_HANDLE_USER_INPUTиhd_print(устройство r25)25.- ENTER на пункте исполняет действие из
actionsточки входа (SDK)26: в зонде этоplugin_handle_user_input(устройство r25)27. Плагин получает JSON-контекст вcall_plugin($call_ctx_json)(устройство r25)28. - Плагин возвращает 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_urlplugin_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_actionsinstallпри таком развёртывании не выполняется (устройство 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.phpr24 у класса есть ещё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 |
-
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. ↩↩↩
-
- 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».
-
doc-sdk-plugins.c025 · doc · any-documented; прошивка — · dune_plugin.xml — единственный файл, обязательный для загрузки плагина; остальные файлы указываются в манифесте и могут называться как угодно ↩↩
-
doc-sdk-plugins.c030 · doc · any-documented; прошивка — · Раздел манифеста утверждает, что из типов движка (dune_plugin->type) поддерживается только 'php' с единственным обязательным параметром 'program' — путём к главному PHP-файлу ↩↩↩
-
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. ↩↩
-
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.
- 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 '
-
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.
-
doc-sdk-plugins.c026 · doc · any-documented; прошивка — · PHP-плагин обязан содержать PHP-программу с функцией hd_create_plugin(); путь к ней задаётся в dune_plugin.xml ↩↩↩↩
-
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.c328 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 строки hd_print() из кода плагина попадают в /tmp/run/<плагин>.log с префиксом «[pid] [t
-
- 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 = Ошибка приложения)»; на экране — «Ошибка приложения / Произошла ошибка. Приложение будет закрыто.».
-
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. ↩↩↩
-
fw-tv188b-261021-0117-r25.c304 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после touch main.php плагина kb_probe5 следующий вызов handle_user_input сначала перезапускает php_server: в shell.log того же процесса оболочки «[kb_probe5] [php] start_call(): PHP-script modification detected (1793009215). Restarting PHP-server-process...», «shutting down...», «stopped.», «server started; pid: 17676.», и вызов исполняет уже новый процесс 17676. ↩↩
-
fw-tv188b-261021-0117-r25.c306 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 правка файла lib/kbp5_lib.php, подключаемого из main.php через require_once, без изменения main.php не перезапустила php_server kb_probe5: следующий вызов исполнил тот же процесс 17362 (n=5) со старой версией функции (lib=v1), в shell.log между «start» и «result action» сообщений о перезапуске нет. ↩
-
fw-tv188b-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» нет. ↩↩
-
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 '
-
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). ↩↩
-
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. ↩↩↩
-
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.c314 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 к исполнению программы плагина (код верхнего уровня main.php) уже определены классы DunePluginFw и DuneSystem, константа PLUGIN_OP_HANDLE_USER_INPUT и функция hd_print. ↩↩↩
-
doc-sdk-plugins.c038 · doc · any-documented; прошивка — · actions точки входа — соответствие событие (клавиша) → GUI-действие при фокусе на точке входа; popup_menu добавляет пункты в контекстное меню точки входа ↩
-
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.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
-
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.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). ↩
-
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). ↩↩
-
doc-sdk-plugins.c060 · doc · any-documented; прошивка — · Плагин обрабатывает одновременно только один вызов: вызовы из Dune GUI всегда сериализуются ↩
-
fw-tv188b-260827-0003-r24--php-framework.c016 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Абстрактный класс DunePluginFw имеет статическое поле $instance (комментарий: должно содержать экземпляр DunePluginFw) и абстрактный метод call_plugin($call_ctx_json), возвращающий строку ↩
-
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'...» ↩
-
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 переданы скрипту.
- fw-tv188b-261021-0117-r25.c154 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 файл www/index.txt плагина отдаётся по http://
-
fw-tv188b-261021-0117-r25.c210 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 плагин, у которого name в dune_plugin.xml (kb_probe5_other) не равен имени каталога (kb_probe5_badname), не регистрируется: строки «Plugin … is registered» для него нет, в /tmp/run/installed_plugins.xml и /tmp/www/plugins его нет ни под тем, ни под другим именем. ↩
-
fw-tv188b-260827-0003-r24--plugin-loader--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 его нет ни под тем, ни под другим именем.
- 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 '
-
doc-sdk-plugins.c028 · doc · any-documented; прошивка — · dune_plugin->name — идентификатор плагина: непустой, только алфавитно-цифровые символы и '-', '.', '_', длина не более 64 ↩
-
doc-sdk-plugins.c101 · doc · any-documented; прошивка — · Картинки можно указывать как http://, plugin_archive://archive/path, plugin_file://path или gui_skin://path (ресурс стандартного скина прошивки) ↩↩
-
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. ↩
-
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.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 показал синюю квадратную иконку. ↩
-
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--libphp5.c002 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В зонде kb_probe5 на tv188b 261021_0117_r25 значение PHP_VERSION равно 5.3.6. ↩
-
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. ↩↩
-
- 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.
-
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'
-
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 перед этим.
- 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 '
-
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.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 нет. ↩
-
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 не понадобился. ↩
-
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. ↩
-
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 перед этим. ↩ -
fw-tv188b-261021-0117-r25.c082 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 global_action install не выполняется, если плагин положен в $FS_PREFIX/flashdata/plugins через adb push и приложение перезапущено: маркеров install от kb_probe5 и kb_probe6_sup нет, тогда как boot, boot_end и gui_start kb_probe5 выполнились. ↩↩
-
fw-tv188b-261021-0117-r25.c083 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 global_action update не выполняется, если version_index в dune_plugin.xml изменён на месте (1 → 2) и приложение перезапущено через am force-stop, хотя оболочка регистрирует плагин с version_index 2 и заново запускает movie_suppliers_update.sh. ↩
-
fw-tv188b-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.
- 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 (от
-
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). ↩
-
doc-sdk-plugins.c017 · doc · any-documented; прошивка — · Плагин устанавливается запуском файла dune_plugin*.zip с любого носителя (например, USB-флешки) и ставится во флеш-память устройства ↩
-
doc-sdk-plugins.c016 · doc · any-documented; прошивка — · Установщик плагина — ZIP-архив с файлом dune_plugin.xml на верхнем уровне и прочими файлами плагина ↩
-
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. ↩
-
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), без перезапуска приложения. ↩↩
-
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--. ↩
-
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». ↩↩
-
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. ↩↩↩
-
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). ↩
-
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 в каталоге плагина. ↩
-
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.
-
doc-sdk-plugins--gui-actions.c044 · doc · any-documented; прошивка — · PluginShowErrorAction в режиме воспроизведения показывает одну строку текста в центре экрана, а в меню Dune — диалог с заголовком и строками сообщения ↩
-
doc-sdk-plugins--gui-actions.c043 · doc · any-documented; прошивка — · Данные PluginShowErrorAction — класс PluginShowErrorActionData: fatal (Boolean), title (String), msg_lines (List
, необязательно) ↩ -
doc-sdk-plugins--gui-actions.c045 · doc · any-documented; прошивка — · При fatal == true PluginShowErrorAction планирует выход из плагина по фатальной ошибке: воспроизведение останавливается, браузер Dune переходит в верхнее меню ↩
-
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». ↩ -
doc-sdk-plugins--operations.c003 · doc · any-documented; прошивка — · get_folder_view() вызывается, когда GUI Dune исполняет действие PLUGIN_OPEN_FOLDER ↩
-
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 закрывает окно.
-
doc-sdk-plugins--operations.c023 · doc · any-documented; прошивка — · PluginControlsFolderView::initial_sel_ndx — индекс (с 0) контрола, получающего фокус первым; -1 означает контрол по умолчанию (первый) ↩
-
doc-sdk-plugins--operations.c020 · doc · any-documented; прошивка — · Класс PluginControlsFolderView имеет поля defs (Array
), initial_sel_ndx (int), params (PluginFolderViewParams) ↩↩ -
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 = Ошибка приложения)».
- 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 '
-
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. ↩
-
fw-tv188b-261021-0117-r25.c329 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 php_server при старте пишет «Starting logging to '/data/data/com.dunehd.app/tmp/run/<плагин>.log' (<= 3072000)»; в окружении php_server LOG_DIR=/tmp/run и LOG_MAX_FILE_SIZE=3072000. ↩
-
fw-tv188b-261021-0117-r25.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. ↩
-
doc-sdk-plugins.c139 · doc · sigma-smp86xx, sigma-smp87xx, android; прошивка — · Лог плагина — /tmp/run/
.log (Sigma: tail -F через telnet; Android: busybox tail -F через telnet/ADB) ↩ -
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). ↩
-
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, в разделе «Приложения» не появлялись.
-
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 перед этим.
-
doc-sdk-plugins.c061 · doc · any-documented; прошивка — · Глобальные переменные PHP обычно сохраняются между вызовами, но экземпляр движка может быть пересоздан в любой момент между вызовами — плагин не должен на них полагаться ↩
-
doc-sdk-plugins.c066 · doc · any-documented; прошивка — · data_dir_path (постоянные данные) недоступен на устройствах без System Storage и Flash Memory Storage — тогда ключ не задан ↩
-
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 переданы скрипту. ↩ -
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. ↩
-
fw-tv188b-260827-0003-r24--http-api.c008 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · CGI-скрипт плагина запускается run_plugin_cgi как shell-скрипт (sh), а не напрямую: PHP-обработчик плагин должен вызвать сам ↩
-
fw-tv188b-261021-0117-r25.c152 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 CGI плагина, запущенный httpd через run_plugin_cgi, работает под uid=0(root) gid=0(root) с SELinux-контекстом u:r:shell:s0. ↩
-
fw-tv188b-260827-0003-r24--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 в записях зондов нет.
-
fw-tv188b-261021-0117-r25.c220 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 оболочка регистрирует плагины типов php, plain и internal.internal (dune_internal): «Plugin '
-
- 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.
-
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)».
-
doc-sdk-plugins.c148 · doc · any-documented; прошивка — · Поля entry_point перечислены как возможные («may contain the following fields»); документ не называет ни одно из них обязательным. ↩↩
-
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 ↩↩↩
-
doc-sdk-plugins.c058 · doc · any-documented; прошивка — · Результат операции — PluginOutputData с полями has_data, data_type, data, plugin_cookies, is_error, error_action; при ошибке is_error = true и может быть задано error_action ↩
-
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() исполняется как следующее действие ↩
-
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.
-
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. ↩
-
fw-tv188b-261021-0117-r25.c240 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 PHP-скрипт CGI плагина (php-cgi через CGI-обёртку) работает с posix_getuid() = 0, а php_server того же плагина — с uid 1000. ↩
-
fw-tv188b-261021-0117-r25.c316 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 include_path в php_server = '.:<каталог плагина>:/data/data/com.dunehd.app/firmware_ext/php/include', каталог плагина — с префиксом $FS_PREFIX: …/flashdata/plugins/kb_probe5 и …/flashdata/plugins/dune-hd.tv у плагинов из flashdata, …/firmware_ext/plugins/shell_ext и …/firmware_ext/plugins/android_apps у встроенных; php_server пишет его в лог «[server] resetting include path to '…'». ↩
-
fw-tv188b-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'. ↩
-
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.c291 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 tmp_dir_path у kb_probe5 = '/data/data/com.dunehd.app/tmp/plugins/kb_probe5' — путь /tmp/plugins/kb_probe5 с префиксом FS_PREFIX=/data/data/com.dunehd.app; is_dir() для него true. ↩
-
fw-tv188b-261021-0117-r25.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. ↩
-
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. ↩↩
-
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 ↩
-
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))) ↩
-
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() ↩
-
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'. ↩
-
plg-gh-aspel-twitch-dune-plugin.c007 · code · unknown; прошивка — · В первой точке входа ENTER назначен на действие plugin_open_folder. ↩
-
plg-dc-screenshoter.c014 · code · unknown; прошивка — · В обеих точках входа клавиши key_enter и key_play вызывают действие plugin_handle_user_input с handler_id = entry ↩
-
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).
-
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 ↩
-
doc-sdk-plugins.c042 · doc · any-documented; прошивка — · По SDK тайм-аут операций плагина по умолчанию составляет 10 секунд; operation_timeout задаёт общий (
) и потиповой ( N ) тайм-аут. ↩ -
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-код вызова не доработал. ↩
-
doc-sdk-plugins.c102 · doc · any-documented; прошивка — · Для чистых FlashLite/HTML-плагинов вместо 'php' можно указать тип 'plain' — тогда PHP-программа и параметр program не нужны ↩
-
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. ↩
-
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. ↩
-
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'. ↩
-
fw-tv188b-261021-0117-r25--php-framework.c057 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Ошибка открытия KB11 reg в запросе 11 могла быть связана с неполной формой ответа зонда: отличия folder_type и параметров вида от встроенного регулярного экрана не исключены; дефект прошивки этим прогоном не установлен. ↩
-
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; это не доказывает, что подпись не проверяется у других плагинов, и не задаёт политику кастомных прошивок. ↩
-
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 ↩
-
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 ↩
-
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»). ↩ -
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. ↩ -
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 плагина ↩
-
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 ↩
-
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», и что происходит там, не установлено ↩
-
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, внутреннее противоречие документа) ↩
-
fw-tv188b-260827-0003-r24--plugin-loader.c102 · inference, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Изменение файла программы плагина (main.php из params/program; второго аргумента php_server) по времени модификации, вероятно, подхватывается без перезагрузки оболочки — при следующем вызове PHP-сервер плагина перезапускается. ↩