聊聊真实的 Android TV 开发技术栈

厂商靠硬件的利润是固定的,当小米发布“年轻人的第一台电视”之后,通过搭建并自营广告、付费内容分发等服务手段,将用户数据紧握在自己手中并实现货币化。以服务的收入来补贴硬件的成本,极大的压低了智能电视的售价。

这很容易理解吧,之前都是单纯的制造商,卖出一台电视赚一台电视的钱,撇开需要提供的质保服务之外,这就是一锤子买卖。而当电视可以联网之后,就可以延伸出更多可能,你每一步操作都有广告的体验、推荐给你的电视 App、你在电视上看的付费视频,这些都是服务的费用,在你电视的使用寿命一直到终结,厂商都可以从你那里获得价值。

**电视厂商已经开始从制造商转变成服务商了。**智能电视是大势所趋,回头是不可能回头的,可能今后会有厂商继续生产小众的传统电视,但也只是小众。

再说回到技术上,对于智能电视的系统,得益于 Android 的开放,市面上占有率最大的就是 Android 系统,其它 Apple TV、Chromecast 都是比较小众的。另外三星之类的厂商,也从去年开始将新款电视的系统,选定为 Android。

在智能电视领域,Android 才是主流。

不少人对 Android TV 的技术印象,还停留在移动开发上,但其实它们并不一样。

二、技术与 Android TV

只要是个 Android 开发,就可以很容易的上手 Android TV 的项目,这一点毋庸置疑。

但是又不那么完全一样,不能简单的把 TV 开发理解成更大屏的手机去做,这其中还是有一些细节需要打磨的。

本文我就换一个角度,来分析 Android TV 开发所涉及到的一些技术点。

2.1 设计风格不同

电视最直观的感受就是大屏,但是不能仅仅把它当成放大版的手机,这是有根本区别的。

在做电视 UI 设计的时候,要考虑到这个设计在两三米开外,还能不能看见,电视和手机的视距是不一样的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在做设计的时候,就讲究大块、留白、滚动、焦点效果等等,了解其中的差异即可。

2.2 API 的差异

都是 Android 系统,在手机上能用的那一套 API,在智能电视上都可以用到。智能电视用到的 API,算是移动开发的一个补充。

举个最简单的例子,在手机上操作,点击一个内容只有两态,普通态和按下态,而在电视上是有三态的,无焦点态、获取焦点态和按下态,这就需要在移动开发中根本不会用到的 android:focusableInTouchMode 属性来支持。

另外还有一些对焦点的处理,例如焦点动画、焦点记录、焦点寻址等,虽然 Android 是以就近原则来计算方向操作时,下一个获取焦点的控件,但是有时候还是需要我们通过代码去控制它的寻址效果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

电视开发还有很多 API 上的区别,这里就不一一举例了,其实很多效果都可以参照 Leanback 的实现,这个后文会介绍。

2.3 涉及的工具

在电视开发中,也有一些工具可以提高我们开发的效率。

虽说智能电视本质还是 Android 设备,但是大部分电视和智能盒子在出厂时,已经关闭了调试口,如果和厂商合作或者在论坛搜寻,有一些特定的设备,经过特殊的设置是允许开启 ADB 调试的。开启调试后,我们就可以通过 adb connect 进行连接,之后的调试就和普通的手机开发没有区别了。参考:《常用 ADB 命令

电视调试有时候确实很麻烦,如果不是和特定硬件强相关的需求,我们可以直接使用普通手机进行开发调试。

电视和手机的交互方式是不同的,手机通过触摸屏幕,而电视只能通过遥控器按键操控。那么为了在手机上模拟电视遥控器的操作,这里推荐一个 Chrome 插件:ChromeADB

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

只需要保证开发设备和调试设备,ADB 连接通畅,通过 ChromeADB,实现一些遥控器的简单上下左右的操作。

2.4 Google 的 Leanback 项目

Leanback 是 Google 真的 TV 开源的一款 UI 框架,可以使用 Leanback 快速实现 UI 效果,Leanback 主要都是围绕 Fragment 展开的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在国内的 TV App 项目中,基本上都不会使用 Leanback 推荐的效果,就像 Google 的 Material Design 设计,所有设计都在转发文章,但是就是不用,不过这并不妨碍我们研究它的实现。

Leanback 内提供的 RecyclerView 把一些很头疼的焦点记忆、焦点项目放大、滚动时焦点块居中等问题都封装好了,简单到可以拿来即用。

Leanback 最大的问题是它是一个 v17 的项目,也就是 minSdkVersion 为 17,而在国内的环境下,TCL、联想都还在出厂 4.2 以下的电视和盒子。也就是说对于一个商业项目,你想完全依赖 Leanback 的官方指导来开发 App,将会有一部分设备的市场被放弃掉。

但是这并不是无法解决的硬伤,我印象中只是某些数据刷新的 notifyDataXxx() 方法,对 API Level 有要求。所以只需要将这部分逻辑自己来实现,就可以将 Leanback 用在 V14 的设备上。

具体实现我就不放代码了,在 Github 上搜索 “V14 Leanback” 关键字,就能够有所收获。

Leanback-GoogleSample Github:github.com/googlesampl…

2.5 音视频

智能电视虽然可以安装一些 App,可最终还是要回归本质,看电视。大部分电视 App,都是围绕着音视频方向,做内容分发。

你能想到的主流视频 App,都存在电视版 App,做电视开发无可避免的会遇到音视频方向的问题。

有关音视频方向,简单点呢找个 Github 上的开源库封装一下也能用,但是不了解细节出了问题也很难排查。想要向这个方向研究,推荐一本前爱奇艺音视频方向专家何俊林的书《Android 音视频开发》。

如果让我针对智能电视的音视频,只提一个建议,那肯定是慎用硬解,慎用硬解,慎用硬解。

这很好理解,现在一台智能电视比很多手机都便宜,最大的成本占比在屏幕上,可想而知它的其他硬件,还不如小米几百块的手机。

当你使用硬解的时候,在一些低端设备上的表现就不可控了,会碰到非常恶心的黑屏、马赛克、花屏等问题。所以如果你的经验没那么丰富,推荐直接使用软解。

2.6 投屏协议

电视的真实需求,还是看电视,任何强操作的需求,在电视上都是伪需求。

智能电视联网后,我们就不必将看电视这个动作局限在直播中。要想将手机上的内容投到电视上播放,这就涉及到投屏的协议。

市面上存在很多投屏的协议,但凡对投屏有点想法的都会定制一套投屏的协议。主流的只有两个 Google 的 DLNA 和 Apple 的 AirPlay,这已经是属于现在智能电视出厂时的标配。

就像微信对手机的关系一样,某个手机要是微信退出到后台就收不到消息了,用户只会说这个手机有问题而不会说微信有问题。这两个协议对智能电视也是一样。

但是有归有,好不好用就是另外的说法了。所有的投屏协议,都是存在两端,客户端和接收端,智能电视在出厂时,集成的都是接收端的协议,如果遇上不好用的情况,可以尝试安装“乐播投屏 App”来解决。

大多数情况下,我们更多的是和协议的客户端在打交道,这里推荐一个开源项目 ConnectSDK,在其中对大部分协议做了支持。

学习宝典

对我们开发者来说,一定要打好基础,随时准备战斗。不论寒冬是否到来,都要把自己的技术做精做深。虽然目前移动端的招聘量确实变少了,但中高端的职位还是很多的,这说明行业只是变得成熟规范起来了。竞争越激烈,产品质量与留存就变得更加重要,我们进入了技术赋能业务的时代。

不论遇到什么困难,都不应该成为我们放弃的理由!

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习,对此我针对Android程序员,我这边给大家整理了一套学习宝典!包括不限于高级UI、性能优化、移动架构师、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!

【Android核心高级技术PDF文档,BAT大厂面试真题解析】

【算法合集】

【延伸Android必备知识点】

【Android部分高级架构视频学习资源】
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

【Android部分高级架构视频学习资源】
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

  • 12
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值