4.2 KiB
4.2 KiB
Phase 7D – Philips/TPVision OTA component map
Proven update path
USB `/upgrades/autorun*.upg`
-> org.droidtv.settings AutoRunUpgrade / SilentUpgradeService (UID1000)
-> product/version filter (`TPM191E_R`, current SW version)
-> ZIP parse
├─ payload.bin
├─ payload_properties.txt
└─ META-INF/updateinfo/upg.xml
-> android.os.UpdateEngine.applyPayload(URL, offset, size, properties)
-> root update_engine daemon
-> inactive A/B partitions
-> boot-control / update_verifier after reboot
This graph is reconstructed from the installed Settings DEX, init/fstab files, live services and bugreport logs. No update was initiated.
Components
| Component | Evidence / path | Role | Confidence |
|---|---|---|---|
org.droidtv.settings |
/system/priv-app/settings/settings.apk |
Software-update UI and OEM orchestration | confirmed |
SilentUpgradeService |
Settings manifest/DEX/logs | watches USB/staging; registers mounted-volume receiver | confirmed |
AutoRunUpgrade |
Settings DEX code_off=0x3b6ba0 |
scans /upgrades, pattern [aA]utorun.*.upg, product/version checks |
confirmed |
UpdateParser.parse(File) |
Settings DEX code_off=0x3c01ec |
opens .upg with ZipFile; locates payload and properties; computes payload offset/size |
confirmed |
UpdateUtils.installUpdate |
Settings DEX code_off=0x3c71e4 |
binds Android UpdateEngine, calls applyPayload |
confirmed |
UpdateUtils.getUpgXml |
Settings DEX code_off=0x3c2e88 |
extracts META-INF/updateinfo/upg.xml to staging |
confirmed |
android.os.UpdateEngineService |
live service list | Binder API for payload update | confirmed |
/system/bin/update_engine |
init/process evidence | root A/B payload writer/verifier | confirmed |
update_verifier |
init/fstab inventory | verifies post-boot slot and marks successful through boot control | confirmed architecture |
android.hardware.boot@1.0 |
vendor init/HAL inventory | A/B slot state/control | confirmed service definition; status query failed |
/data/ota_package |
/dev/mmcblk0p32, label upgrade, ~1,352 MiB |
update staging/history (last_install, upg.xml, payload metadata) |
confirmed; shell contents inaccessible |
/data/vendor/user_setting/rw/upgrade |
DEX strings / prior private-state report | OEM upgrade state/history | confirmed path reference |
org.droidtv.oad |
/system/priv-app/oad/oad.apk |
broadcast/OAD TV firmware feed integration, writes autorun.upg staging |
confirmed; not the primary USB parser |
com.easy.oad |
/system/app/btota/btota.apk |
Bluetooth/remote-device OTA | confirmed distinct role |
org.droidtv.usbbreakin |
/system/app/USBService/USBService.apk |
USB service/trigger surface | confirmed installed; exact firmware-writer role not proven |
uncrypt, BCB services |
/system/etc/init/uncrypt.rc |
setup/clear bootloader-control-block paths used by Android recovery flows | confirmed definitions; not invoked |
| RecoverySystem/system_update services | live service list | Android framework recovery/update coordination | confirmed present |
Metadata and state names found
The installed update code references /data/ota_package/build.prop,
installstatus, last_install, version/history files,
persist.odm.tpv.sys.upg_filename, persist.odm.tpv.sys.upg_source,
reboot-ab-update and native slot APIs. Logs show the Settings service starting
and observing USB mounts; they do not show a staged current update.
What was not proven
- No official
.upgfile is present locally, so outer-container signature, exact payload metadata and Philips private key identities remain unknown. - No call to
RecoverySystem.verifyPackagewas found on the current Settings A/B path. This does not prove the outer ZIP is unsigned; it proves only that the inspected path hands the inner payload/properties to UpdateEngine. - Factory/emergency USB modes, key combinations and recovery ADB were not found in local resources.
upgrade_loader,upgrade.pkg, Android non-A/Bupdate.zipand sideload are not established as valid paths for this build.
Android's A/B OTA model writes the inactive slot and uses boot-control rollback: https://source.android.com/docs/core/ota/ab.