首页 > 代码库 > adb的那点小事——360电视助手实现研究
adb的那点小事——360电视助手实现研究
1. 前言
1.1. 行业背景简介
当下,智能家居与智能穿戴设备无疑是继智能手机后两个最热门的方向,而智能家居在占领用户“客厅”的行动中,电视无疑占据着一个十分重要的位置。最近两年,智能电视(包括盒子),发展的如火如荼,引发了一波电视换机潮。现在购买电视,不是智能电视,甚至都不好意思拿出来说。
然而,国内移动应用市场激战正酣的三巨头(百度、360、腾讯)在电视应用分发上都鲜有举动,市面上只有一些小公司在做,其中做的还算不错的有:奇珀市场、爱家电视应用市场。
直到在今年(2014年)4月360推出了“360电视助手”以及”360电视助手手机端”,电视市场逐渐开始改变。
1.2. 一次糟糕的个人体验
讲一个小故事:一张SD卡引发的血案。
背景:
在去年的时候,我购买了2台创维的Android智能电视和一台大麦盒子。拿到电视以后,我只有一个很简单的想法:我不想花钱看电视,我要在电视上面看优酷、看爱奇艺、看腾讯视频。现实情况是,电视厂商为了推广自己的付费视频,在电视机自带的电子市场中,根本没有这些应用。
看到这里有些朋友会说,你找张SD卡把应用拷贝进去,然后按照不就行了?没错!可是,我木有SD卡呀……于是开始了一段崎岖的折腾之路。
我的坎坷看片经历:
1、 打开电视浏览器搜索优酷下载,提示”没有SD卡下载不了”
2、 安装电视市场中的QQ,远程发生优酷到电视,提示”没有SD卡,无法接收”
3、 于是乎在绞尽脑汁之后,在QQ的”更多“里面我找到了”应用宝”,这里真要庆幸哥们是做开发的啊,否则估计打死都找不到这里。此过程完全通过鼠标进行,遥控器操作不了。
4、 在H5的应用宝中搜索”豌豆荚“,安装后,在里面搜索优酷,提示”没有SD卡下载不了”;果断卸载“豌豆荚”,安装“百度手机助手”,提示”没有SD卡下载不了”……到这里哥们已经接近崩溃了。
5、 最后在H5的应用宝中下载应用宝客户端,发现没有SD卡也可以下载(这里说一下应用宝在没有SD卡时会先下载到/data/目录)。于是乎感叹“应用宝真好!”。
6、 带着从绝望中刚恢复过来的喜悦,在应用宝中搜索优酷,下载安装完成、打开。尼玛,是横屏的有木有?!原来手机市场里面一般都只有手机和pad的应用,木有TV版本。不仅屏幕是横的,而且不支持遥控器。那到底要怎么办?我只想看个片而已呀,My God !!!
7、 幸亏哥们练过!我想到了没有SD卡,我可不可以挂载一张虚拟的SD卡到电视上?于是开始了新一轮验证。
8、 在应用宝中,下载“ES文件浏览器”,然后在个人电脑中注册申请“百度云”账号,在“ES文件浏览器”的设置中与百度云绑定,然后在“ES文件浏览器”中挂载虚拟存储。
9、 在电脑上搜索TV版的优酷、爱奇艺等,将这些APK拷贝到百度云里面去,然后在电视机上打开“ES文件浏览器”,找到挂载的虚拟存储位置,点击APK安装。终于安装成功了!当看到电视上出现优酷的画面是,哥们都要泪奔了,有木有……
整个过程下来,浪费了哥们大半个下午的时间。
也许有些人会说,怎么不通过电脑USB连接,然后安装。但是USB需要驱动呀…..而且对小白用户的话,是根本不可能通过USB安装应用的。
1.3. 360电视助手体验
前面说过,我购买了2台电视和一台盒子。在购买盒子的时候,我无意中发现了“360电视助手”,于是乎我在前面的体验一下子简单多了:扫描局域网、建立连接,然后在手机端选择自己喜欢的应用安装,发现盒子就已经给我安装好了,然后在手机上选择一个电影打开播放,此时电视也开始播放了…..
整个过程下来,不超过5分钟。
1.4. 360电视助手概览
首先看一下360电视助手TV端的界面:
下面是TV端首页截图:
下面是手机端的截图:
1.5. 360电视助手的创新点
那这款360电视助手与其他的手机助手或者电视应用市场相比有什么特别之处呢?
一般的电视电视版助手有两大功能:一是帮助用户下载和更新应用;二是做视频、软件、应用分发。360电视助手具有如下一些特点:
1、 在同一个局域网环境下,可以通过手机端直接安装TV端到电视上,而不需要拷贝到SD卡或者U盘上。
2、 在TV端安装后会作为Server与手机端进行局域网通信,手机端可以控制TV端进行应用安装、视频播放、甚至玩游戏等。
3、 TV端集成临时root能力,在通过手机端操作“安装到电视”时,电视上会静默安装好该应用。
4、 提供遥控器功能,可以通过手机遥控电视。
2. 技术实现分析
本文主要对360电视助手中的两个核心技术点进行分析研究:
A. 如何通过局域网(Wifi)环境,直接安装应用到电视端。
B. 在电视上安装电视助手(TV端)后,手机端如何与TV端进行局域网内通信。
2.1. 局域网应用安装
局域网内直接安装apk到TV端是通过我们万能的adb实现的。关于adb的用法这里就不具体介绍了,不熟悉的读者可以自行查阅Android官方文档,或者在cmd环境中执行“adb”命令查看。这里只介绍电视助手的原理。
电视助手的实现原理如下:
1. 首先确保电视端中“设置 ->开发者选项->开启开发者选项”处于开启状态,这个在很多电视中默认是开启的,并且在没有开启的电视中,360会引导用户开启。
2. 在手机端通过“ping”命令扫描探测局域网内可用的ip,下面是反编译之后的代码:
关于“ping”命令的用法如下:
3. 通过“cat /system/build.prop | grep \"product\"”命令获取TV端的产品名称,反编译代码如下:
4. 在获得到TV端的名称后,会提示是否要连接到TV端。此时,通过“adb connect <host>[:<port>]”命令连接电视,下面是反编译后的代码:
5. 在连接到TV端,通过下“cat/system/build.prop”命令获取TV端的相关信息,下面是反编译后的代码:
6. 在连接到TV端后,就可以通过“adb install –r ”命令进行局域网内远程安装了,反编译代码如下:
在执行“adb install”命令后,根据执行结果中是否包含“Success”判断是否安装成功,再不是“Success”的情况会返回具体的错误原因,可以进行解析。
7. 在执行结束,断开连接时,可以执行“adb disconnect”命令,反编译代码如下:
8. 在TV端安装后,手机端可以通过”am start“命令唤起TV端,反编译代码如下:
好了,到这里360电视助手客户端是如何在wifi环境下,直接安装到电视端的就都明白了。
2.2. 搭建局域网C/S通信
在电视中安装了TV端以后,TV端会作为一个Server与手机端(Client)形成一个C/S结构,接下来的事情就是Client与Server直接的网络通信了。
这里之所以采用C/S结构进行通信,个人觉得原因有两点:
A. adb connect建立的连接不稳定,随时可能会断开,而且也无法感知连接是否可用等连接状态。
B. 有些操作通过adb是完成不了的,必须通过C/S的方式,将”指令“发生到Server端(电视),在Server端执行完成后,再将结果返回到手机。举个简单的例子,比如说我想要获取电视上已安装应用列表等。
360电视助手中,C/S接口,用的是12333端口,也就是说TV端会以socket监听12333端口。这从手机端反编译的代码也可以看出:
在手机端将命令以http请求的方式发送到TV端。手机端与TV端的数据以jeson的形式进行传输,下面是反编译代码:
好了,到这里360电视助手是如何局域网下进行通信的,就清楚了。
在360电视助手中,除了上面介绍的局域网通信方式外,也有利用普通无线网络进行push的方式。先将手机端的操作指令发送的360的服务器,再从服务器push到目标端进行响应。这些不是本文想要分析的重点,不再分析。
adb的那点小事——360电视助手实现研究