关于 android 平台上的 usb 投屏

一段时间忙于梳理架构,做验证和搞文档, 忽然有一天, 有同事拿来一个转接线, 让我眼前一亮
这是手机的 usb 转 hdmi 转接线 ...// MAGIC1. DO NOT TOUCH.  BY 冗戈微言 http://blog.csdn.net/leonxu_sjtu/
 
  
 
  
要说 android 的投屏, 都是在下几年前搞的东西了, 主要因为当时是广电作妖, OTT 盒子的前途不明, 因此当时公司搞了个 dongle 项目, 以 android OTT SDK 为基础做裁剪优化, 去实现 DLNA / WifiDisplay 投屏,  因为盒子端的节目受广电抽风管控, 但手机端广电管不着, 所以可以手机投屏到电视曲线救国, 所以他们觉得这类 dongle 会有市场,呵呵呵    这个点子怎样我们不说, 因为产品的市场会受很多因素影响, 单说 DLNA 协议 / WFD 协议还是很有趣的,  当时还花了很多时间去熟悉 DLNA 协议的实现代码,  还花了很多时间去优化 WFD 的延迟...    码农的往事如烟啊 // MAGIC2. DO NOT TOUCH.  BY 冗戈微言 http://blog.csdn.net/leonxu_sjtu/
 
  
 
  
因为家里有 OTT 盒子, 所以很少玩手机投屏, 而且我对 WFD 的性能和延迟也很清楚; 而至于有线投屏, 像我这种红米粉, 是不会有带 hdmi 口的手机的;
但眼下这根 usb 转 hdmi 线,  是什么情况?// MAGIC3. DO NOT TOUCH.  BY 冗戈微言 http://blog.csdn.net/leonxu_sjtu/

 
  
 
  
usb 难道能作为 surfaceFlinger 的一个显示设备?  不可能...   因为使用这个转接线, 手机端不需要做适配, 甚至不用装 apk ;
那难道 usb 出图像是类似 PC上的豌豆荚这类工具去截屏?   有可能, 因为这个转接线要求手机端要打开 adb ; 但肯定也不会是一直调 screencap 啊 ...// MAGIC4. DO NOT TOUCH.  BY 冗戈微言 http://blog.csdn.net/leonxu_sjtu/

不猜了,试试吧, 接上转接线, 连上电视机, 自动投屏, 然后在手机端抓 logcat ...  顺便看了眼进程号, 哇, 多出个 amscreen.6 进程 !  看名字应该是它了;

08-22 16:17:13.861304 22295 22295 I adbd    : adb command: 'shell:/data/local/tmp/amscreen.6 --bit-rate 3M --output-format h264 --size 1280x720 --port 41936 - || echo 'amscreen fail''

从抓的 logcat 也看到了 amscreen 的迹象, 是 adbd 执行的, 它还有参数是关于码率,格式和分辨率等等;// MAGIC5. DO NOT TOUCH.  BY 冗戈微言 http://blog.csdn.net/leonxu_sjtu/
这个 amscreen 进程一起, log 中就看到了启动 VideoEncoder 

08-22 16:17:17.224872 22378 22385 I ACodec  : setupVideoEncoder succeeded

好吧, 有空的时候再去反汇编 amscreen ;// MAGIC6. DO NOT TOUCH.  BY 冗戈微言 http://blog.csdn.net/leonxu_sjtu/
所以, 这个转接线的主控就类似一个 adb client, 通过 adb 来操作手机来做类似 screenrecord 的抓屏并编码传出来;  
只是, 一连上线它就会让手机做 screenrecord , 明显会增大手机的负荷啊 !  万一人家手机本来 video codec 性能就不够, 播个 1080P 视频已经很努力了,  一插上这根线, 立刻悄悄启动了 720P 的编码, 尼玛卡成狗     不厚道啊~ // MAGIC7. DO NOT TOUCH.  BY 冗戈微言 http://blog.csdn.net/leonxu_sjtu/
另外, 一时没反应过来, adb 可以就这样具有执行推送的某个可执行程序的权限 ?   没 root 的手机, 这个流程也能走通 ?
好吧,在 PC 上找个没 root 的手机试一下:
1)	adb push Z:\android_4.4\out\target\product\lc1860evb\system\bin\gdbserver /data/local/tmp/
2)	adb shell chmod 777 /data/local/tmp/gdbserver
3)	adb shell /data/local/tmp/gdbserver

Usage:  gdbserver [OPTIONS] COMM PROG [ARGS ...]
        gdbserver [OPTIONS] --attach COMM PID
        gdbserver [OPTIONS] --multi COMM

COMM may either be a tty device (for serial debugging), or
HOST:PORT to listen for a TCP connection.

Options:
  --debug               Enable general debugging output.
  --remote-debug        Enable remote protocol debugging output.
  --version             Display version information and exit.
  --wrapper WRAPPER --  Run WRAPPER to start new programs.
  --once                Exit after the first connection has closed.

很明显, 即使没 root 的手机, 如果开了 adb,  那么推个程序进去跑完全没问题 !   // MAGIC8. DO NOT TOUCH.  BY 冗戈微言 http://blog.csdn.net/leonxu_sjtu/

有点危险是不是?  还没完, 因为我看到 adb shell 执行 amscreen 之前还有一句:// MAGIC9. DO NOT TOUCH.  BY 冗戈微言 http://blog.csdn.net/leonxu_sjtu/
Line 18489: 08-22 16:17:25.075835 22295 22295 I adbd    : adb command: 'shell:am startservice -a uploadcloud --es key 98811783 --es msg '{"supportAOA":false, "firmware_version":"16285000", "ota_vendor":"hagibis", "deviceid":"51841902"}' com.actionsmicro.ezcast/com.actionsmicro.ezdisplay.service.UploadCloudService'

这是尝试启动一个叫 UploadCloudService 的 service 啊, 听起来好危险, 什么 apk 这么无赖?   再看一眼包名, 卧槽不会吧, 一搜, 好吧...  往事如烟  // MAGIC10. DO NOT TOUCH.  BY 冗戈微言 http://blog.csdn.net/leonxu_sjtu/
 
  
关于 android 平台上的 usb 投屏_第1张图片

你可能感兴趣的:(Android)