折腾了一整天,我逆向了创维电视的信号源切换逻辑

硬核精选 折腾了一整天,我逆向了创维电视的信号源切换逻辑

2026-02-21 23:30:08 49点赞 153收藏 51评论

我有一个毛病,看见能自动化的事情就手痒。

家里电视接了三个 HDMI 设备,PS5 在 HDMI1,XBOX 在 HDMI2,HDMI3 接专门打游戏的台式机。每次切换都得翻遥控器,用了半年,忍了半年。今天终于坐不住了,打算写个脚本,一行命令切换信号源,以后再做进 Home Assistant。

这件事我预期两小时搞定。

然后就耗了一整天。

折腾了一整天,我逆向了创维电视的信号源切换逻辑

先说 ADB 是什么

怕有人不了解,简单说一句:ADB 是安卓官方的调试工具,可以通过网络或 USB 连接安卓设备,发命令、装 APK、查日志。大多数安卓电视都支持,开启方式一般是:设置 → 关于 → 版本号 连点七下开开发者模式,再把网络调试打开。以下以我自己的电视(创维酷开)为例:

连接:

adb connect 192.168.0.109:5555 # connected to 192.168.0.109:5555

这步很顺,两分钟搞定。然后开始踩坑。

折腾了一整天,我逆向了创维电视的信号源切换逻辑

第一坑:标准 keycode 全部无效

安卓系统定义了一套标准的电视输入 keycode,HDMI1 对应 243,HDMI2 是 244,HDMI3 是 245:

adb shell input keyevent 243 adb shell input keyevent 244 adb shell input keyevent 245

电视是一动不动。

我以为是 keycode 数值问题,去查了 KeyEvent 的完整列表,KEYCODE_TV_INPUT_HDMI_1 到 KEYCODE_TV_INPUT_HDMI_4 的值分别是 243-246,没错。但就是没用。

后来才明白:这套标准是谷歌定的,各厂商爱实现不实现,创维根本没接这个。


第二坑:广播发出去石沉大海

换思路,翻了一下 dumpsys package com.skyworth.tv,看到一堆 intent action,其中有个 com.skyworth.broadcast.source.select 看着很有希望。

然后试:

adb shell am broadcast -a com.skyworth.broadcast.source.select --es source_type HDMI2 # Broadcast completed: result=0

result=0 是默认返回值,意思是没有任何接收者处理这个广播。

我又试了几种参数格式:--es source HDMI2、--ei source_type 2、加包名指定接收者……全是 result=0。这个广播常量虽然存在于代码里,但根本没有注册静态接收器来处理它,纯粹是个内部定义的符号。

这时候我意识到,靠猜是走不通的,必须去看代码。


开始逆向:把 APK 拉下来

创维电视的 TV UI 程序包是 com.skyworth.tv,APK 路径在系统分区:

adb pull //system/ccos/app/SkyTVUI/SkyTVUI.apk ./ # 16.7 MB/s (16485269 bytes in 0.940s)

拉下来,建虚拟环境,装 androguard:

python -m venv .venv .venv/Scripts/pip install androguard

androguard 可以把 dex 字节码反编译成可读的伪 Java 代码,用过 jadx 的应该很熟悉这类工具。开始分析。


找到 intent 入口

APK 里代码有混淆,类名都是单字母或短字母组合,但方法逻辑保留着。我先找 SkyTVMainActivity,它是电视 UI 的主 Activity,所有信号源相关操作都应该从这里进来。

onCreate 和 onNewIntent 都调用了同一个私有方法 h(Intent),h 里的核心是:

this.f = new StartHelper(); this.f.D(p3); // 解析 intent this.f.I(p3); // 处理启动类型

所以真正干活的是 StartHelper 这个类。


StartHelper:四层解析链

StartHelper.D() 里构造了一个包含四个函数的数组,依次尝试解析 intent,第一个非 null 的结果就是最终的信号源:

折腾了一整天,我逆向了创维电视的信号源切换逻辑

逐个看:

解析器1:parseIfSourceExits

private SkyTVSource C(Intent p4) { if (!TextUtils.equals(p4.getStringExtra("startType"), "switchSource")) { return null; } SkyTVSource v = new SkyTVSource(); v.sourceName = p4.getStringExtra("sourceName"); v.sourceIndex = p4.getIntExtra("sourceIndex", -1); return v; }

这个是最直接的:startType = "switchSource" 触发,然后读 sourceName 和 sourceIndex。

解析器2:parseIfChannelInfoExits 读 channelId 或 channelName,用于频道切换,和信号源无关,跳过。

解析器3:parseIfBundleSourceChannelExits 读名为 source_channel 的 Bundle extra,里面包 sourceName、sourceIndex、displayname、signal 等。

解析器4:parseIfBundleSourceExits 读名为 source 的 Bundle extra,同样是一个 Bundle,包 name、index、displayname 等。


为什么之前的命令成功了又没成功

这里有个很微妙的点,值得单独说。

最初我发了 --es source HDMI1,切到了 PS5 那个口。当时以为命令有效,于是继续试 --es source HDMI2,结果又切回了 HDMI1,以为是参数格式不对。

实际上发生了什么:

  • --es source HDMI1 里,source 是一个字符串 extra

  • 但解析器4的 parseIfBundleSourceExits 读的是 p5.getBundleExtra("source"),是 Bundle,不是 String

  • 四个解析器全部返回 null,SkyTVSource 为空

  • Activity 收到 intent 但没有解析到有效信号源,于是沿用了上次记忆的信号源——恰好是 HDMI1

后来发 --es source HDMI2 时,Activity 已经在前台运行,intent 通过 onNewIntent 送进来,同样没命中任何解析器,同样沿用上次的 HDMI1。

所以那次成功是个假成功,撞上了巧合。

折腾了一整天,我逆向了创维电视的信号源切换逻辑

sourceName 和 sourceIndex 的值

弄清楚解析链之后,还需要确认两个值。

sourceName 不是 HDMI1、HDMI2 这种,而是信号源类型。通过 androguard 提取 SkyTVSource 类的静态字段:

折腾了一整天,我逆向了创维电视的信号源切换逻辑

区分具体哪个 HDMI 口靠 sourceIndex,从 0 开始,HDMI1 = 0,HDMI2 = 1,HDMI3 = 2。


最终命令

# HDMI1 adb shell am start -n com.skyworth.tv/.activity.SkyTVMainActivity --es startType switchSource --es sourceName HDMI --ei sourceIndex 0 # HDMI2 adb shell am start -n com.skyworth.tv/.activity.SkyTVMainActivity --es startType switchSource --es sourceName HDMI --ei sourceIndex 1 # HDMI3 adb shell am start -n com.skyworth.tv/.activity.SkyTVMainActivity --es startType switchSource --es sourceName HDMI --ei sourceIndex 2

发出去,立刻切换。三个口全部验证通过。

总结

如果你的电视也是创维/酷开系,这套命令大概率直接能用,底层都是同一套 SkyTVUI。

如果是其他品牌,方法论是一样的:

  1. adb pull 把 TV UI 的 APK 拉下来

  2. 用 androguard 或 jadx 反编译

  3. 找主 Activity 的 onNewIntent / onCreate

  4. 顺着 intent 解析链找信号源参数

本质上这类国产电视大多是安卓套壳,intent 机制是通用的,厂商只是在上面包了一层私有协议。知道怎么找,就不难。就算有哪里不懂的问题发给 GPT 处理,效率比以前高多了。

展开 收起
51评论

  • 精彩
  • 最新
  • 没明白这是做什么用,但是感觉很牛X的样子。我的ps5有个设置,电视关机的时候,直接开ps5,电视可以自动开机并进入ps5的信号源,电视关机,ps5自动进入待机。switch没这个功能。但是不管是ps5还是switch,在电视开着的情况下,打开就会自动切换到对应机器的信号源。而且后打开的设备,切换优先,比如正玩着ps5,switch插底座上,就会自动切换到switch,反之亦然。

    校验提示文案

    提交
    sony电视哈,我的和你一样

    校验提示文案

    提交
    电视不小心按到HDMI游戏机接口就会把PS5启动,PS5打开那电视机是一定会跟着开机。

    校验提示文案

    提交
    收起所有回复
  • 买了创维和酷开,都不好用了,而且切换hdmi,广告还是强制的。另外装app来得麻烦。建议未买的别买创维了。换了雷鸟之后感觉还不错

    校验提示文案

    提交
    没广告吧,我没遇到过这种广告

    校验提示文案

    提交
    有的,包有的。酷开那台。以前也没有,后来有了。

    校验提示文案

    提交
    还有11条回复
    收起所有回复
  • 牛人,小白不敢搞,家里是tcl电视

    校验提示文案

    提交
    方法都一样的,就是几个adb命令,对电视没影响

    校验提示文案

    提交
    收起所有回复
  • Cec自动切换都没有吗

    校验提示文案

    提交
    cec有bug,经常起不来。电脑不支持 [喜极而泣]

    校验提示文案

    提交
    看照片里没有电脑 主机和电视盒应该都支持的

    校验提示文案

    提交
    收起所有回复
  • 大佬怎么设置小米电视开机直接接hdmi的?

    校验提示文案

    提交
    忘了 [大囧]

    校验提示文案

    提交
    收起所有回复
  • 我感觉电视厂家太保守了。公司24年需要上58台电视,要求是来电能自动开机。找了小米,创维,海信,TCL,只有TCL给了进工厂模式的方式,其他家都不肯给。最后以及以后都买的是TCL

    校验提示文案

    提交
    我就是创维的,只能说你没找对人,很简单的

    校验提示文案

    提交
    找了地区代理,也打了厂家客服电话,可能数量太少,人家没有重视,这不今年又要上一批了,依然优先tcl

    校验提示文案

    提交
    还有1条回复
    收起所有回复
  • 6年前的酷开,没你说的广告,不过系统确实不好用。

    校验提示文案

    提交
    酷开切换HDMI确实麻烦,我家那电视,每次要切换到到另外一个HDMI接口再切回来,才能找到信号

    校验提示文案

    提交
    收起所有回复
  • 不懂就问,这么设置之后是有什么效果?不需要遥控器了吗?那怎么切换呢

    校验提示文案

    提交
    联动自动化切换

    校验提示文案

    提交
    收起所有回复
  • 大神一个

    校验提示文案

    提交
  • 大佬,家里是酷开电视,有没有办法关闭系统自带的安装apk的屏蔽,每次app更新都需要adb远程安装

    校验提示文案

    提交
  • 电视不是很简单吗?哪个接口有信号显示哪个接口数据

    校验提示文案

    提交
  • 买电视别联网,加个Apple TV

    校验提示文案

    提交
    好用吗,需要另外收费还是折腾吗

    校验提示文案

    提交
    要翻墙。又要合买会员

    校验提示文案

    提交
    收起所有回复
  • 看门狗开关!!!哈哈哈哈,太有趣

    校验提示文案

    提交
  • 家里有台康佳55寸,每次都要设置信源接口,开机就是电视系统信号源,我都搞不懂了,每次开机进盒子都要设置hdmi,这么简单都不搞

    校验提示文案

    提交
    康佳需要先启动电视的安卓桌面,然后再切换到指定应用或输出,设置中可以设置启动选项,但实际都是要先启动桌面,等的时间一点不会少

    校验提示文案

    提交
    家里有台康佳42的,没你说的这个毛病啊,但是好像要电脑先于电视开,以前的VGA囗才能识别到显卡的信号,如果电视先开要碰运气,运气不好的话随便怎么折腾都不行必须两个都关机重新再开一下,后来换hdmi囗好像就没这事了(时间太长了具体细节有点记不清)

    校验提示文案

    提交
    收起所有回复
  • 技术大佬,这才是zdm应该有的文章

    校验提示文案

    提交
  • 安卓有什么可玩可逆向的呢?

    校验提示文案

    提交
  • 感谢提供思路,太牛了

    校验提示文案

    提交
  • 只在国内卖的厂商肯定不搭理谷歌标准

    校验提示文案

    提交
  • [高兴] 一个kvm可以解决

    校验提示文案

    提交
  • 创维的广告你就别想了 没有广告还有十多秒的蓝屏 还不如看会儿广告呢 你可以设置成开机进入hdmi模式 在遥控器上设置便捷键

    校验提示文案

    提交
    广告可以联系客服远程关掉…

    校验提示文案

    提交
    收起所有回复
提示信息

取消
确认
评论举报

相关文章推荐

更多精彩文章
更多精彩文章
京东京享红包
距结束::
领京东现金红包 天天领3次 最高26888元
红包按钮
最新文章 热门文章
153
扫一下,分享更方便,购买更轻松