Files
hisense-root/modding/03-ui.md
T
2026-10-27 15:56:27 +01:00

19 KiB
Raw Blame History

03 — UI: hisenseUI, Web-Browser, Launcher, AM, Daten

Status: UI-Start, Pfade, Prozesse, App-/Launcher-Daten und AM-Konfiguration CONFIRMED (live/static). Template-/API-Details und die aktive Skin-Auswahl teils UNVERIFIED.


1. Zwei Browser, zwei Welten

TV-UI Web-Browser
Prozess hisenseUI (z. B. PID 589) hisense_browser (z. B. PID 1320)
Start /3rd/opera4x/hisenseUI/start-UI.sh (autorun Zeile 168) /3rd/opera4x/browser/run-Browser.sh (AM-App opera4x)
Renderer GLES (--hw-gles, Mali) DirectFB (--hw-dfb)
Seite /3rd_rw/UI/index.html beliebige Web-URL; unsere Recon-Seite
JS-Plugins /3rd/UI_jsplugins /3rd/opera4x/opera_dir/jsplugins
DevTools 9223 (wenn enable_developer_tools) 9224 (wenn enable_developer_tools)
Zweck TV-Home/Settings/Launcher Internet/TV-Browser/Web-Apps
User root root

Wichtig: Das TV-UI ist nicht der „TV Browser“-Tile. Der Tile startet opera4x/hisense_browser (Web-Browser). Das System-UI ist hisenseUI und läuft separat.


2. TV-UI: Start und Seite

2.1 Startskript

/3rd/opera4x/hisenseUI/start-UI.sh (ro; Aufruf aus /basic/autorun.sh Zeile 168):

set -e
cd /3rd/opera4x/hisenseUI
. ./opera_env.sh
export MEMORY_LIMIT=$(( 500*1024*1024 ))
STARTPAGE=/3rd_rw/UI/index.html
# optional: "disk" -> /3rd_rw/UI/index.html; "url" -> http://172.16.12.134/modernTV/UI/hisenseUI/index.html
export LD_PRELOAD="/3rd/opera4x/lib/libcurl.so.4.4.0"
cmd="./bin/hisenseUI"
cmd+=" --hw-gles"
cmd+=" --js-flags=\"--expose-gc\""
cmd+=" --jsplugins-dir=/3rd/UI_jsplugins"
cmd+=" --enable-gpu-rasterization --force-gpu-rasterization"
cmd+=" --force-gpu-mem-available-mb=512 --disable-software-rasterizer"
cmd+=" --disable-web-security"
cmd+=" --http-cache-size=30"
cmd+=" -u ${STARTPAGE}"
# wenn /3rd_rw/appdata/enable_developer_tools: --remote-debugging-port=9223
exec $cmd
  • Seite: /3rd_rw/UI/index.html (rw).
  • --disable-web-security: lokale Files/Cross-Origin erlaubt; die UI kann file:////3rd_rw lesen.
  • --jsplugins-dir=/3rd/UI_jsplugins: TV-APIs der UI.
  • GLES/Mali: ins_arm_mali_mod.sh, OPERA_EGL_SCREEN_SIZE=1920x1080; UI-CSS nutzt 1280×720.
  • DevTools 9223 nur mit /3rd_rw/appdata/enable_developer_tools (existiert).
  • MEMORY_LIMIT 500 MB; --expose-gc; GPU-Rasterisierung.

2.2 UI-Seite /3rd_rw/UI/index.html

Die Seite ist eine PIXI-basierte Web-UI (loadModel()):

$LAB.script("pub/PubDefine.js").wait()
    .script("model/model.js")
    .script("lib/pixi.js")
    .script("lib/tweenjs-0.6.2.combined.js")
    .script("sdk/MessagePool.js")
    .script("sdk/UI.js")
    .script("lib/jquery-1.8.2.js")
    .script("sdk/Const.js")
    .script("sdk/Debug.js")
    .script("sdk/Util.js")
    .script("pub/PubFunc.js")
    .script("lib/launcherDataInterface.js")
    .script("lib/parseXML.js")
    .script("lib/inputsInterface.js")
    .script("pub/HisProductConfig.js")
    .script("sdk/Logreport.js")
    .script("pub/persianCalendarTime.js")
  • UI/-Unterordner: assets/, data/, keyboard/, language/, lib/, model/, module/, pub/, sdk/, templates/, tools/.
  • pub/HisProductConfig.js (Dump): acrflag=false, ciplus_certification=false, pvr_enable=true.
  • model/model.js/sdk/UI.js: UI-Framework; TVAPI/model/guijs stehen der UI-Seite zur Verfügung.
  • lib/launcherDataInterface.js (139 KB, ldi.js): lädt Launcher-/Kategorie-/App-Daten; zentrale Stelle für App-Tiles.
  • templates//module/: UI-Templates/Module (Settings, Launcher, etc.).
  • UI_jsplugins (ro, /3rd/UI_jsplugins): libhisensejs, libmodeljs, libutiljs, libimejs, libdtv, libmmp, libsql, libpwjs, libmtkrpcwrapper, libchanneldump, libdmp-adapter, libavsmusic, … — die Hisense_*/TVAPI-Funktionen.

2.3 UI-Prozess prüfen / neu starten

ps | grep hisenseUI | grep -v grep
# PID ermitteln
kill <PID>
nohup /3rd/opera4x/hisenseUI/start-UI.sh >/tmp/hisenseUI.log 2>&1 &
  • start-UI.sh exect hisenseUI; nach kill startet das Skript einen neuen UI-Prozess.
  • Achtung: Bei kaputter UI/index.html wird der Bildschirm schwarz. SSH/Root-Loop als Rettungsweg; Backup der index.html zurückkopieren, UI neu starten.
  • DevTools 9223 (wenn enable_developer_tools): http://192.168.188.94:9223/ vom Host (Chrome/Chromium). Dort kannst du die UI-Seite inspizieren/JS ausführen.

3. Launcher-/App-Daten (das eigentliche „Wo ist das UI?“)

Die UI liest die App-/Kategorie-Daten über lib/launcherDataInterface.js (ldi.js) aus /3rd_rw/appdata/launcher/ (Bridge-Root /3rd_rw/appdata):

/3rd_rw/appdata/launcher/
  preset.txt                 # 26 vorinstallierte App-Tiles (Cache/Liste)
  Appinfo.json               # vom Nutzer installierte Web-Apps (unser VidaaRecon)
  deletedPresetApp.txt       # JSON-Array der ausgeblendeten Tiles
  rememberEditApp.json       # Launcher-Edit-State
  settingappinfo.txt         # Setting-/App-Info
  data/
    CategoryIndex.xml        # Kategorien (aktiv, wenn serviceUpdate zum Land passt)
    CategoryList_*.xml
    Category_1001_*.xml      # App-Tiles (35 KB)
    Category_57_*.xml        # App-Tiles (35 KB)
    PicInfo.xml              # Bilder/Assets
    serviceUpdate.xml        # Land/Timestamp der Store-/Kategorie-Daten
    SwitchFeatureList.xml
  res/                       # Tile-Icons (PNG/JPG)
  cache/index.json           # Icon-Cache
  firstNotification.txt, lanCode.txt, NotifySwitchStatus.txt

Zusätzlich:

/3rd_rw/launcher/            # Alt-/Asset-Skin (html/js/css/img/data); Datenpfad appdata/launcher
/3rd_rw/UI/data/             # Default-/Fallback-Launcher-Daten (wenn Store-Land/Timestamp nicht passt)
/3rd_rw/launcher/data/templateConfig.xml  # Template-Konfiguration (Alt-/UI-Templates)
/3rd_rw/VIDAAU2Launcher/     # VIDAA-U2-Tile-Launcher (Alternativ-Skin; Aktivierung UNVERIFIED)

3.1 ldi.js: aktive Datenquelle

var mainJSON;
var defaultData = (serviceCountryCode != currentCountryCode) || getAlwaysDefaultDataStatus() || serviceUpdate.timeStamp == 0;
var launcherPath = defaultData ? "UI/data/" : "launcher/data/";
if (defaultData) mainJSON = loadLauncherDefaultData(launcherPath, currentCountryCode);
else mainJSON = readXMLDOM(launcherPath + "CategoryIndex.xml", 1);
...
  • Land/Sprache: user_db.db → tvapi.str.basic.settings.tvset.location = DEU, tvapi.i32.language.osd = 16, Brand his, Region 7.
  • Aktiver Pfad: launcher/data/ (/3rd_rw/appdata/launcher/data), sofern serviceUpdate.xml zum Land DEU passt und Timestamp ≠ 0; sonst UI/data/-Default.
  • Quelle: CategoryIndex.xml/CategoryList_*.xml/Category_*.xml/PicInfo.xml.
  • preset.txt: wird aus den Kategorie-/App-Daten + deletedPresetApp.txt erzeugt (allAppsWriteToFileForUse); ist ein Cache.
  • deletedPresetApp.txt: persistente Hide-Liste (JSON-Array von URLs/IDs); die UI/der Launcher filtert damit.
  • Appinfo.json: User-Web-Apps (pushFavoriteApps), z. B. unser VidaaRecon.

3.2 Die 26 Preset-Tiles (Stand live)

Aus preset.txt (Reihenfolge/Inhalt live):

App StartCommand / URL Typ
Netflix netflix native (AM)
Prime Video amazon native (AM)
Disney+ https://cd-dmgz.bamgrid.com/bbd/hisense_tv/index.html Web
maxdome http://8577004de253-ott-tv.maxdome.de Web
YouTube youtube native/Web (AM)
Rakuten TV https://prod-hisense-ui40-app.rakuten.tv/ Web
rlaxxTV https://tvapp.rlaxxtv.com/r/no-animations/720/?customer=Hisense Web
Chili https://hisense.chili.com Web
UEFA.TV https://smarttv.uefa.tv Web
RTL TVNOW https://app.hisense.rtl-smart.tv/ Web
Kidoodle.TV https://ctv-vewd.kidoodle.tv Web
AccuWeather accuweather native/Web
YuppTV http://www.yupptv.com/hisense/index.html Web
Plex http://plex.tv/web/tv/hisense?mixedContent=1 Web
Videociety https://smarttv3.videociety.de Web
App Store http://2897431816.fxm3751860294.com/?category=apps Store/Foxxum
Movies ...?category=movies Store
Catch up TV ...?category=catchup Store
News ...?category=news Store
Music ...?category=music Store
Sports ...?category=sport Store
Search ...?category=search Store
Game Center http://apps.tvgam.es/tv_games/hisense_portal/production/portal/index.html Web
TV Browser browser native (Web-Browser)
VIDAA tv vidaa-plus native/Store
VidaaRecon http://192.168.188.150:9000/recon.html User/Web (UrlType 36)
  • UrlType 37 = Start Web App; 36 = User-/Recon-App (unser Eintrag).
  • PreInstall:true bei den Presets; unser VidaaRecon ist in preset.txt gelandet (Launcher-Cache), Appinfo.json hat den User-Eintrag.
  • StoreType: 0/foxxum; die Store-Apps sind Foxxum-URLs.
  • Icons: res/167593027...png; Image/IconURL/Thumb/Icon_96; Fallback useDefaultImg.

3.3 Appinfo.json (User-Apps) — unser Beispiel

{"AppInfo":[
  {"AppId":"VidaaRecondebug",
   "Thumb":"http://192.168.188.150:9000/icon.png",
   "Icon_96":"http://192.168.188.150:9000/icon.png",
   "Image":"http://192.168.188.150:9000/icon.png",
   "URL":"http://192.168.188.150:9000/recon.html",
   "AppName":"VidaaRecon",
   "Title":"VidaaRecon",
   "IconURL":"http://192.168.188.150:9000/icon.png",
   "StartCommand":"http://192.168.188.150:9000/recon.html",
   "InstallTime":"2026-10-25",
   "RunTimes":0,
   "StoreType":"foxxum",
   "PreInstall":false}
]}
  • Die UI/der Launcher liest AppInfo und fügt die Apps als User-Apps hinzu (canRemove=true; appUrlType=START_WEBAPP).
  • Der StartCommand/URL kann http://… oder file:///3rd_rw/… sein; der Web-Browser (hisense_browser) öffnet ihn (nicht die UI).
  • Icon: HTTP/file://; lokal in res//cache; useDefaultImg als Fallback.

3.4 deletedPresetApp.txt (Hide-Liste)

  • JSON-Array von URLs/StartCommands/IDs.
  • Der Launcher/ldi.js filtert die Kategorien/preset-Liste damit.
  • Stand 2026-10-26: Die alten Probe-Einträge (data:, javascript:, 127.0.0.1;cd…) wurden beim Cleanup entfernt; die Datei ist jetzt []. Die 26 Presets sind sichtbar. Zum Ausblenden die gewünschten URLs/IDs eintragen (siehe 05-bloat.md).
  • Die Datei ist rw (/3rd_rw/appdata/launcher/deletedPresetApp.txt); per SSH/File.write änderbar.

4. LauncherService

/3rd/launcherservice/startLS.sh (aus delayrun.sh nach 15 s):

export LD_LIBRARY_PATH=/lib:/basic:/basic/lib:/3rd/lib:/3rd/hicjson/lib/:/3rd/hisdk2.0/lib:/3rd/hisdk/lib:/3rd/loglevel/lib:/3rd/his_runlog/lib:/3rd/launcherservice/lib
/3rd/launcherservice/bin/LauncherService &
  • Rolle: liefert/aktualisiert Launcher-/Kategorie-/App-Daten und Auth für die UI; verwaltet /tmp/launcher/….
  • Strings (Auszug):
    • /3rd_rw/appdata/launcher/data/CategoryIndex.xml, PicInfo.xml, serviceUpdate.xml
    • /3rd_rw/appdata/launcher/res, cache
    • /tmp/launcher/{CategoryIndexNew.xml,PicInfo.xml,launcher_recv_socket,launcher_send_socket,launcherServiceAuth.xml}
    • /cgi-bin/launcher_index.fcgi?action=GetChannelFilePath|GetEULAFilePath|GetSwitchFlag
    • updateFile4weblauncher, LauncherInit, Launcher_SendMsgToLauncher
  • Hisense_GetLauncherServiceAuth (JS) liest /tmp/launcherServiceAuth.xml (Launcher-Auth-Token).
  • Store/Foxxum: die Kategorie-/App-Daten kommen aus den Store-/Foxxum-Daten; serviceUpdate.xml (Land/Timestamp) entscheidet, ob launcher/data oder UI/data genutzt wird.

Für Modding: preset/Appinfo/deleted sind die lokalen, einfachen Hebel. Die Category*.xml/PicInfo/serviceUpdate sind die Store-/Launcher-Quelle; Änderungen daran nur mit Backup (der Service kann sie überschreiben).


5. AM (app_man) und :am

  • Start: /basic/app_man -c /basic/am_config -s /basic/am_start.ini -input_fifo & (autorun Zeile 177).
  • Boot-Apps: dtv_app_mtk (/basic/dtv_svc), netflix, dialserver, samba_relay_agent, browser_base, securetime (aus am_start.ini).
  • On-demand/Apps: opera4x (run-Browser.sh), opera_browser, youtube, cobalt, amazon_ignition, factory_lite, huluplus, hotlist, generic_osd, vudu, diskcache, youtube_kids/youtube_tv, …
  • Protokoll: :am,<app>,:<verb>=<val>; Verbs u. a.:
    • start, stop, pause, resume, URL, backgm, foregm, shutdown, suspend, wakeup
    • :am,am,:shutdowned=…, :am,am,:stoped_all=…
    • :am,<app>,<sub>:started=… etc. (Status-Reports)
  • Kein exec/args über AM; nur die konfigurierten exec/args aus am_config.
  • JS: HiBrowser.System.startApp(":am,<app>,:start=<val>") im Web-Browser; Hisense_StartApp(…) in der UI (Signatur/Verhalten UNVERIFIED; im UI-JS/DevTools testen).
  • Beispiele:
    HiBrowser.System.startApp(":am,opera4x,:start=opera4x");
    HiBrowser.System.startApp(":am,netflix,:start=netflix");
    HiBrowser.System.startApp(":am,opera4x,:URL=http://192.168.188.150:9000/recon.html");
    HiBrowser.System.startApp(":am,opera4x,:stop=opera4x");
    
    (Die exakte start-Semantik je App ist UNVERIFIED; :URL/:stop sind aus den app_man-Strings belegt.)

6. Web-Browser (hisense_browser, opera4x)

/3rd/opera4x/browser/run-Browser.sh (ro):

. ./opera_env.sh
export LD_PRELOAD=/3rd/opera4x/lib/libcurl.so.4.4.0
cmd="./bin/hisense_browser"
cmd+=" --hw-dfb --dfb-memory-limit-mb=128"
cmd+=" --disable-imestart-on-enter-key"
cmd+=" --with-feature:tvsdk-netview=on"
cmd+=" --with-feature:adaptive-streaming-secure-path-drm=on"
cmd+=" --ait=data/mit.sec"
cmd+=" --allow-running-insecure-content"
cmd+=" --enable-spatial-navigation"
cmd+=" --allow-file-access-from-files"
cmd+=" --http-cache-size=30"
# --disable-single-window-browsing (Modell)
# --remote-debugging-port=9224, wenn /3rd_rw/appdata/enable_developer_tools
exec $cmd "$@"
  • Profil: /3rd_rw/opera4x/opera_home_browser/ (opera.json, browser.db, cookies, Local Storage, web_ui, widevine, …).
  • opera.json: userjs.path=/3rd/opera4x/opera_dir/userjs_browser (ro); spatial_navigation_enabled=true; transparent=true; Font Tiresias; http_accept_language=de, en.
  • browser.db: SQLite (Opera Speed Dial/History); nicht die TV-UI-App-Liste.
  • user_db.db: TV-Settings (Sprache, Land, Brand, Region); nicht die App-Liste.
  • JS-APIs: /3rd/opera4x/opera_dir/jsplugins (libhspdk-jsx, libhspdk-linux, libhisensejs, libmodeljs, …) → HiBrowser (File, System, loadLibrary, Cache, JsonWrite, …), Hisense_*.
  • Unlock: --allow-file-access-from-files, --allow-running-insecure-content, --disable-web-security? (das UI nutzt --disable-web-security; der Web-Browser nicht, aber --allow-file-access-from-files).
  • DevTools 9224 mit enable_developer_tools; von dort kann die Seite/JS inspiziert werden.
  • Unser Recon: http://192.168.188.150:9000/recon.html; HiBrowser.File.download/write, HiBrowser.System.startApp, HiBrowser.loadLibrary.

Root-Kontext: hisense_browser ist UID/GID 0, CapEff voll, Single-Process, kein Seccomp. Die HiBrowser.File-APIs sind root-equivalent (Whitelist: /3rd_rw/appdata, /dev/shm/shm_tmp, /3rd/launcher/data; USB-Symlink-Bypass).


7. Aktive UI vs. Alt-/Alternativ-Skins

Pfad Rolle Status
/3rd_rw/UI/index.html + /3rd/opera4x/hisenseUI aktive TV-UI (PIXI, GLES) aktiv (Startskript)
/3rd_rw/appdata/launcher aktive Launcher-/App-Daten aktiv (ldi.js launcher/data)
/3rd_rw/UI/data Default-/Fallback-Daten Fallback, wenn Store-Land/Timestamp nicht passt
/3rd_rw/launcher Alt-/Asset-Skin (HTML/JS/CSS/IMG; data/templateConfig.xml) Alt/Asset; nicht der UI-Start
/3rd_rw/VIDAAU2Launcher VIDAA-U2-Tile-Launcher Alternativ; Aktivierung auf diesem Modell UNVERIFIED
/3rd/UI_jsplugins UI-TV-APIs aktiv
/3rd/opera4x/opera_dir/jsplugins Web-Browser-JS-APIs aktiv (für hisense_browser)

Wichtig: Wenn du „die UI ändern“ willst, ist der aktive Einstieg /3rd_rw/UI/index.html und die Launcher-Daten in /3rd_rw/appdata/launcher. Die launcher-/VIDAAU2Launcher-HTML/JS sind Alt-/Alternativ-Skins; Änderungen dort wirken nur, wenn die UI sie tatsächlich lädt (UNVERIFIED).


8. UI-Restart / DevTools / Tests

# UI-Prozess
ps | grep hisenseUI | grep -v grep
kill <PID>
nohup /3rd/opera4x/hisenseUI/start-UI.sh >/tmp/hisenseUI.log 2>&1 &

# Web-Browser via AM
# :am,opera4x,:stop / :start (oder TV-Browser-Tile)
  • UI DevTools 9223: http://192.168.188.94:9223/ (Host-Chrome). Dort document, TVAPI, model, guijs, Hisense_* prüfen.
  • Web-Browser DevTools 9224: http://192.168.188.94:9224/; dort HiBrowser, File, System, Hisense_* prüfen.
  • UI-Test: Nach Änderung der UI/index.html/JS/CSS UI neu starten; bei schwarzem Bildschirm SSH/Root-Loop + Backup.
  • Launcher-Test: Appinfo.json/deletedPresetApp.txt ändern; UI/Launcher neu starten; Tiles prüfen.
  • App-Tile-Test: Appinfo.json ergänzen; UI neu starten; App öffnen; Web-Browser/Recon.
  • UI-Dateien hochladen: nach optionalem SFTP-Install (../root/scripts/host/install_sftp.sh) mit sftp root@192.168.188.94 (put -r/get); sonst per SSH/tar oder File.download. Backup vorher.

9. Evidence

  • Prozesse: ps, /proc/<pid>/cmdline, /proc/<pid>/environ (hisenseUI PID 589; hisense_browser PID 1320).
  • Startskripte: /3rd/opera4x/hisenseUI/start-UI.sh, /3rd/opera4x/browser/run-Browser.sh, /3rd/launcherservice/startLS.sh.
  • UI-Seite: /3rd_rw/UI/index.html; UI/pub/HisProductConfig.js; UI/lib/launcherDataInterface.js (ldi.js); UI/data/; UI/templates/.
  • Launcher: /3rd_rw/appdata/launcher/{preset.txt,Appinfo.json,deletedPresetApp.txt,data/*,res/*,cache/*}; /3rd_rw/launcher/data/templateConfig.xml; /3rd_rw/VIDAAU2Launcher/html/*.
  • AM: /basic/am_config, /basic/am_start.ini, app_man-Strings (:am,…).
  • LauncherService: /3rd/launcherservice/bin/LauncherService-Strings.
  • Browser: /3rd_rw/opera4x/opera_home_browser/opera.json, browser.db; run-Browser.sh; enable_developer_tools.
  • Settings: /3rd_rw/user_db.db (DEU, Brand his, Region 7).

10. Unknowns

  • Aktive UI-Template-/Skin-Auswahl (UI/templates vs. launcher/VIDAAU2Launcher); VIDAAU2Launcher auf diesem Modell aktiv? UNVERIFIED.
  • Exakte Hisense_*-Signaturen/Semantik (UI-APIs) und guijs/TVAPI/model-Interna.
  • LauncherService-Datenquelle/Update (Store/Foxxum/FCGI) und ob preset.txt bei jedem Start aus Category*.xml neu geschrieben wird.
  • app_man/AM-Interna, coexist_set/backgm/keymap, exakte :am-Semantik je App.
  • Ob die UI die launcher-HTML/JS überhaupt lädt (Alt-Skin) oder nur die Daten (launcher/data); die aktive Seite ist /3rd_rw/UI.
  • Ob eigene UI/index.html-Pages die TVAPI/model-Globals brauchen oder ob Hisense_*/guijs direkt nutzbar sind (im UI-DevTools testen).
  • Bloat-/Deaktivierungsfolgen (siehe 05): ms_service, swrc, runlog, Seriallog, HamService, securetime, netflix, browser_base, app_man, dtv_svc.