# TCL tcl_mt5879_cn(国行,雷鸟系统) - Android 11(SDK 30),build RQ3A.210705.001,MediaTek MT5879,32 位 ARM,约 4 GB 内存。 - 1920×1080,**240dpi**(1280×720dp)。Aerial 的画布缩放会让它和小米显示得一模一样。 - 原桌面:`com.tcl.cyberui/.MainActivity`(唯一的 HOME 候选)。 - 安装的 flavor:`guard`。 ## 安装限制:系统校验链 `adb install` 总是返回 `INSTALL_FAILED_VERIFICATION_FAILURE`。系统必经的校验器是 TCL 改过的 `com.android.packageinstaller/.verifier.VerifierReciver`,策略链(`InstallStrategyManager`,配置由云端下发,见 `InstallConfigManager.registerOnlineConfig`): | 策略 | 作用 | |---|---| | `PmStrategy` | 通过安装标志识别 ADB / pm 安装,**一律拒绝** | | `LauncherStrategy` | APK 声明了 MAIN + HOME,签名就必须和 `com.tcl.cyberui` 或平台签名一致,否则拒绝 | | `ThridStrategy` | 只放行由系统应用或 `com.android.packageinstaller` 发起的「显式安装」 | | `BlackStrategy` / `OverDueStrategy` / `SafeStrategy` | 黑名单 / 过期 / 放行 | 还试过但不行的办法: - `pm install -i <各种 installer>`:同样被拒。 - 从 shell 调起 `InstallStart`:报错 `uid 2000 needs to declare REQUEST_INSTALL_PACKAGES`,然后直接关闭。 - TCL 应用商店 `com.tcl.appmarket2` 的 `android.intent.action.APPSTORE_INSTALL_APK` 广播(`ThirdAppManagerReceiver`):只按包名从商店升级,`Fileurl` 以 `apk` 结尾的直接忽略,装不了本地文件。 - 媒体中心 `com.tcl.ui_mediaCenter`(系统 App,自己的文件浏览里能装 APK,见 `PackageInstallUtils`):可以从 adb 直接打开某个目录(`-n com.tcl.ui_mediaCenter/.main.FileListActivity --es extra_title Download --es extra_device_path /storage/emulated/0 --es extra_path /storage/emulated/0/Download --ei extra_device_type 3 --ei extra_media_file_type 64`),但内置存储的目录一直卡在加载,只对 U 盘有效。 - 安全卫士 `com.tcl.guard` 能装 U 盘里的 APK(户主确认过),没有找到能传本地路径的入口。 能过校验的关键是「由 App 把 APK 交给系统安装界面」:当贝不是系统 App 也能装成功,说明 `ThridStrategy` 只拦 adb / pm 直接安装。 **可行的安装方法一:多屏互动推送**(`tools/install.sh` 默认走这条;协议实现在 `tools/tcast-push.py`) TCL 手机 App 有一个「把手机里的 APK 推到电视」的功能。电视端由多屏互动 `com.tcl.MultiScreenInteraction_TV`(系统 uid 1000)接收,下载后用 `PackageInstaller` session 静默安装,能通过 TCL 的安装校验。2026-10-20 在这台电视上实测,1.6 升到 1.7 成功。 - 协议(从多屏互动 5.30 反编译得到,类 `bf.d`、`com.tcl.tcast.wrapper.data.l`、`ManageAppCmd`;字符串用 `ea.b.a(base64, key)` 做 XOR 混淆): - TCP 端口 6553。每条消息是「4 字节大端长度 + UTF-8 文本」,字段之间用 `>>` 分隔。 - 握手:第一条消息发 `159>>1>>0`,表示不加密。电视会回 `253>>1>>0`,以及一条 `159>>…` 设备信息。 - 心跳:发 `150>>`,电视回 `150>>YES`。会话安静太久会被电视断开。 - 安装指令:`223>>INSTALL>>包名>>名字>>下载地址>>2>>versionCode>>大小MB>>>>>>>>apkPathMd5`。来源填 `2`(本地)并带上 `apkPathMd5`,就会跳过商店查询,也跳过版本和签名检查,直接在电视右上角弹「多屏互动:正在发起应用推送,同意后将接收应用并进行安装 [拒绝] [同意]」。 - 回复:`223>>INSTALL>>…>>confirm_pending|denied`;同意之后会连续收到 `223>>PROGRESS>>包名>>名字>>阶段>>百分比>>…`,阶段 1 是下载中,3 是安装中,5 是装好了,2 是失败。 - 下载地址用的是 `adb reverse tcp:8765 tcp:8765` 加上 Mac 本机 `127.0.0.1` 的 HTTP 服务,电视下载的是 `http://127.0.0.1:8765/Aerial.apk`,所以不需要在局域网上开端口。 - 用遥控器操作时:提示框出现后焦点在「拒绝」上,要先按「右」再按 OK。 - 同一个 versionCode 也可以覆盖安装。 **方法二:当贝**(多屏互动不在或 6553 端口不通时,`install.sh` 会自动回退到这条) 1. `adb push app-guard-release.apk /sdcard/Download/Aerial.apk`,然后触发媒体扫描(`content call --uri content://media --method scan_volume --arg external_primary`)。 2. 打开当贝市场的安装包管理:`am start -n com.dangbeimarket/.ui.apkmanager.ApkManagerActivity`。 3. 选中 Aerial →「安装应用」→(首次安装会提示「应用未被认证」,选「继续」)→ 系统安装器的「安装」。升级时只有最后一步。 4. 用遥控器操作时:列表第一个通常是别的 APK,按「右」到 Aerial;在系统安装器里按 4 次「下」再按「右」,焦点才会到「安装」。 5. **versionCode 必须比已装的大**,否则当贝会把它从列表里隐藏。 6. 每一步都先截图确认焦点再按 OK。当贝左侧有「批量删除」和「一键清空」,列表还没加载出来时焦点会停在那里。 ## 打开 ADB 设置 → 关于 → 本机信息,在这个页面依次按「上、下、左、右」(`DeviceInfoItemModel.HIDE_KEY_LIST = {19, 20, 21, 22}`,两次按键间隔要小于 1 秒),页面会刷新出隐藏的「商场」和「更多」分组,「更多」里有「ADB」开关。2026-10-20 在这台电视上实测有效。注意刷新后焦点会落在「商场模式」开关上,不要直接按确认。 ## 开机自启:TCL 的自启动管理 - 冷启动后,第三方 App 的服务绑定、广播接收和进程启动,都要经过 `TclAppBootManagerImpl`(在 `/apex/com.tcl.tcore/javalib/tcl-service.jar` 里,由 `ActiveServices` 调用 `getTclAppBootManagerInjector().canBindServiceGo`)。默认会拒绝,日志里是 `ActivityManager: forbid bind service app.orchard.tv/...HomeGuardService`,所以开机后停在 TCL 桌面。 - 放行条件是两个 TCL 自定义的 AppOps:`APP_AUTO_START`(op 100,系统拉起)和 `APP_ASSOC_START`(op 101,其他 App 关联拉起)。默认分别是 `ignore` 和 `default`。`install.sh` 用 `appops set app.orchard.tv APP_AUTO_START allow`(以及 `APP_ASSOC_START`)放行,`restore.sh` 会改回 `default`。 - 2026-10-20 实测:放行后 `adb reboot`,开机约 0.5 秒通知监听就被绑定,Aerial 被拉起,守护服务接管桌面。 - 试过但没用的办法:`settings put system boot_app_mode boot_launcher` 加上 `boot_app_componentname app.orchard.tv/.MainActivity`(TCL「开机进入」的设置,由 `com.tcl.ttvs` 的 MMMService 管理),重启后还是进 TCL 桌面,已改回空值。 - TCL 开机时有可能把 `screensaver_components` 写回「艺术画报」(实测出现过一次)。所以 `install.sh` 接管屏保时,会通过 ConfigReceiver 发送 `own_screensaver=true`,之后 Aerial 每次启动都会检查,被改回去就再改成 Aerial(`GuardSetup.keepScreensaver`)。 ## HOME 与守护 - 和小米一样,靠桌面守护接管。待机唤醒后会自动回到 Aerial(实测)。 - **升级 App 后,守护服务处于「已启用但没绑定」状态**。`GuardSetup.rebindIfStalled` 会先移除、1.5 秒后再加回,触发重新绑定(两次写入挨得太近会被系统合并,不起作用)。 - TCL 自己有两个无障碍服务(`com.tcl.walleve`,「小T助手」),改 `enabled_accessibility_services` 时一定要保留。 - 待机时网络 ADB 会断,但 adbd 不会被关;唤醒后能直接重连。 ## 设置入口 - `android.settings.SETTINGS` 没有任何 Activity 响应。`com.tcl.settings/.ui.MainActivity` 用 `ACTION_MAIN` 打开时,会在左侧弹出 TCL 完整的设置面板(图像、声音、网络……)。 - `android.settings.WIFI_SETTINGS` 由同一个 Activity 响应,会弹出左侧的「无线网络」面板。两个面板都是悬浮窗口,Aerial 仍然是 resumed Activity。 - 1.7 之前,控制中心的「设置」和「网络」在 TCL 上都打不开:`firstResolvable` 用的是 `Intent.resolveActivity()`,它碰到带明确 component 的 Intent 时不做检查,直接返回这个 component,结果选中了不存在的小米组件。 ## 音量与亮度 - 音量:App 调用 `adjustStreamVolume` 只会改 Android 记录的数值(`system volume_music_speaker`),不会写入功放。真正写硬件的是 SystemUI 里的 `tsdkNative.setVolumeForDevice`,而它只在显示音量条时才执行。所以 Aerial 在 TCL 上调音量要带 `AudioManager.FLAG_SHOW_UI`(会同时弹出 TCL 的音量条)。 - 亮度:标准的 `screen_brightness` 被忽略,背光走 TCL 私有的 `tvos.tv.picture.TPictureManager` / `com.tcl.tv.pq.TvBacklightManager`。控制中心的「亮度」改为打开 TCL 的侧边设置面板:`startService(Intent("com.tcl.settings.SHOW_WINDOW").setPackage("com.tcl.settings"))`,打开后默认就在「图像」页,第一项是亮度。 ## 屏保 - 使用 Android 标准 Dream,空闲 `screen_off_timeout`(120000 = 2 分钟)后启动。原组件是 `com.tcl.appreciate.art/.service.screensaver.ScreenSaverBootService`(「艺术画报」,带 VIP 会员推销)。 - `install.sh` 会把 `secure screensaver_components` 换成 `app.orchard.tv/app.orchard.tv.dream.AerialDream`;`restore.sh` 会换回 `screensaver_default_component`。 - 手动测试:`adb shell am start -n com.android.systemui/.Somnambulator`。 - **截图截不到视频画面**(视频走独立的硬件图层,截出来是黑的),但字幕和时钟能截到。地名字幕出现,说明视频已经在渲染。 ## 其他 - `/sdcard` 截图在 shell 下可以正常写入。 - TCL 的 `com.tcl.guard`(安全卫士)是大部分 App 的 installerPackageName,其中的 `PackageInstallerService` 是 Binder 接口,shell 用不了。 - `persist.tcl.installapk.enable=1` 和 `package_verifier_enable=0` 这些属性对上面的校验链都没有影响。