# 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): ```sh 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()`): ```js $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 ```sh ps | grep hisenseUI | grep -v grep # PID ermitteln kill nohup /3rd/opera4x/hisenseUI/start-UI.sh >/tmp/hisenseUI.log 2>&1 & ``` - `start-UI.sh` **exec**t `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 ```js 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 ```json {"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): ```sh 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,,:=`; Verbs u. a.: - `start`, `stop`, `pause`, `resume`, `URL`, `backgm`, `foregm`, `shutdown`, `suspend`, `wakeup` - `:am,am,:shutdowned=…`, `:am,am,:stoped_all=…` - `:am,,:started=…` etc. (Status-Reports) - **Kein `exec`/`args` über AM**; nur die konfigurierten `exec`/`args` aus `am_config`. - **JS:** `HiBrowser.System.startApp(":am,,:start=")` im Web-Browser; `Hisense_StartApp(…)` in der UI (Signatur/Verhalten `UNVERIFIED`; im UI-JS/DevTools testen). - **Beispiele:** ```js 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): ```sh . ./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 ```sh # UI-Prozess ps | grep hisenseUI | grep -v grep kill 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//cmdline`, `/proc//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`.