聊聊真實的 Android TV 開發技術棧

承香墨影發表於2019-04-28

智慧電視越來越普及了,華為說四月釋出智慧電視跳票了,一加也說今後要佈局智慧電視,在智慧電視方向,小米已經算是先驅了。但是還有不少開發把智慧電視簡單的理解成手機螢幕的放大,其實這兩者並不一樣。

一、序

你慢慢會發現,身邊所有的電視都變成了智慧電視。這是很容易接受的事實,智慧電視更便宜。

價格是不容忽視的敏感點,顧客會天然的選擇物美價廉的智慧電視。這看似不符合邏輯,為什麼選擇落後的技術,不允許聯網的傳統電視反而更貴呢?

廠商靠硬體的利潤是固定的,當小米釋出“年輕人的第一臺電視”之後,通過搭建並自營廣告、付費內容分發等服務手段,將使用者資料緊握在自己手中並實現貨幣化。以服務的收入來補貼硬體的成本,極大的壓低了智慧電視的售價。

這很容易理解吧,之前都是單純的製造商,賣出一臺電視賺一臺電視的錢,撇開需要提供的質保服務之外,這就是一錘子買賣。而當電視可以聯網之後,就可以延伸出更多可能,你每一步操作都有廣告的體驗、推薦給你的電視 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 是以就近原則來計算方向操作時,下一個獲取焦點的控制元件,但是有時候還是需要我們通過程式碼去控制它的定址效果。

聊聊真實的 Android TV 開發技術棧

電視開發還有很多 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,在其中對大部分協議做了支援。

ConnectSDK 是一個全平臺的 SDK,接入也有明確的文件和示例,這裡就不詳細講解了。

官網:connectsdk.com/

Github:github.com/connectsdk

投屏的功能,在大部分主流的視訊 App,都是整合了投屏的功能。還有一些比較小眾的 App,例如快點投屏,可以將一些視訊網站上的內容,投到智慧電視上觀看。

投屏在智慧電視的技術棧中,必定是需要點亮的。

2.7 本地服務

還是為了解決電視上操作困難的問題,例如最簡單的一個需求,想要把下載好的藍光高清的電影,Copy 到電視上觀看,操作難度都都不小。

所以不少 App 都通過搭建本地服務的方式,方便使用者在電視和其他裝置之間傳輸檔案。

在 Android 上,開啟一個 HTTP 服務的方法,有很多開源專案可供選擇。

這裡推薦 nanohttpd,只需一個檔案就可以在 Android 上實現一個本地的 HTTP 伺服器。並且使用的人很多,上傳檔案、webserver 等已經被實現了,開箱即用。

Github:github.com/NanoHttpd/n…

三、小結時刻

我想看完本文,你對 Android 智慧電視開發應該有了一個基本的瞭解,不會再將它瞭解成一個更大屏的手機了。

就像前文提到的,智慧電視註定是會被普及的,我最近看到頭條這樣做短視訊的公司,都已經開設了 Android TV 的產品崗位,我想今後 TV 開發相關的崗位會越來越多。

你還知道有什麼關於智慧電視的技術點,歡迎在留言區討論。


公眾號後臺回覆成長『成長』,將會得到我準備的學習資料,也能回覆『加群』,一起學習進步;你還能回覆『提問』,向我發起提問。

相關文章