把老电脑刷成Android TV

目标

目标就是将家里之前剩下的老笔记本电脑系统换成Android box。替代已有的小米盒子。

要求尽可能不损失使用体验,必须能够直接观看YouTube,必须能够直接观看Netflix,并且还要支持无线投屏,网速要尽可能的快并且稳定。

方案

在网上主要看到两个方案,一个是刷成Android x86。另外一个是刷成Android tv x86。注意这两个是不太一样的系统,虽然底层应该都算是Android,但是安卓的tv相比原生的安卓的是有一些改变的,更适合在电视上使用,但是初期的调研发现有些人说安卓的tv的兼容性不太好,装上之后可能会有很多东西用不了,或者根本开不开机。

于是最开始选定的是Android x86的方案,并且发现在网上实际上已经拥有很多啊,Android86的系统或者皮肤,比如说国内有比较著名的remix os,还有phoenix os。

但是remix os据我所知已经停止更新了Linux os,据我所知有很多的广告。并且据说安卓版本都比较旧,我还是希望能使一个比较新一些的安卓版本,至少在刚开始做这件事情的时候,我是这么想的,当然后来限于条件限制,呃,也是实际需求,并不需要那么新的系统,所以最终的成果是用Android7.1 tv.

这里还是尽可能的,把所有的步骤相关的信息都记录下来,以便以后方便查看。

我的笔记本是之前退役下来的,宏基s3啊,是I5的处理器,忘记是第几代了,大概是12/13年买的,有4个g的内存500g的硬盘。原本应该有20个g或者18个g的ssd,但是之前似乎发现不是特别好用。可靠性很是问题。

Android X86 9.0 rc-2

Android-x86

最终选择尝试的是这个最原生版的安卓9.0系统。

这套系统装下来之后的可用性还是很高的,系统原声带了两个桌面,一个是熟悉的平板的桌面浪launcher,一个是算是他自己为这种x86类笔记本平台开发的这种task bar的那种launcher,它会在导航条的上面有一个类似任务栏的东西。

需要注意的是装好之后,我们很多时候需要打开native bridge,也就是相当于arm instruction set和x86 instruction site之间的一个translator,这个大概是通过一个叫libhoudini的library,而这个library我们是需要自己从网上去下载去,啊,并放在合理的位置来来让它支持这个功能的,它里面内部在设置里面有一个啊兼容性选项,那里面原本有一个选项,一旦打开之后应该就可以支持,但是打开之后它会自动从网上下载,但是这个链接已经是不可用的状态了,或者是在网上有人说的wget这个命令,它并不支持从HTTPs下载。而谷歌已经把所有的short link都换成了https的协议。这个就导致我们可以在下载项目里面发现一直有一个东西在下载,但是一直下载不下来,然后这个项目选项打开了之后,并没有产生实际的作用。

为什么这个native bridge特别重要呢?因为我们需要在这个安卓tv盒子上面运行netflix,而这个东西如果运行不了的话,netflix就会退出无限退出。

另外一个问题是hdmI的外接输出,这个在这个系统上是原生就支持的,但是它会使用跟系统同样的分辨率,也就是说我笔记本原声的分辨率是1366,然后我把它通过hdmI接到我们家的电视是一个1920的电视,它的显示分辨率依旧是1366,并且它会显示很大的这种黑边,它并不会给它延伸到1920。

除此之外这个系统本身就可用性比较强了,它原声已经自带了chrome的浏览器,并且它在接hdmI的时候,声音就已经自动的传出去了,就是并不需要我在这边再做什么改动。

但是作为tv盒子来讲,有一些问题是原生的安卓比较难以避免的,甚至我预计如果我不用这个最原生的系统的话,用用,比如大家经常提到的prime os,还有phoenix os以及remix os的话,估计也是会遇到同样的问题。其实就是导航栏和通知栏它默认不会隐藏的这个问题,并且在安卓9.0的这个系统上,我并没有找到,像以前可以让他在不用的时候隐藏的这个选项,然后我试用了很多的APP来实现这个功能。但是效果都不尽如人意。

并且sideload的netflix APP,它在显示的时候并不能全屏,原因不知道为什么,即使我把notification bar和navigation bar都去掉了,还是不可以。

最终由于这个原因,我们选择还是去试一试android tv x86,因为其他的基于Android x86的系统,恐怕还会有同样的问题。

Android TV X86 7.1

Android TV 7.1 Nougat For PC | Android x86

以上这个链接应该就是目前唯一可用的安卓镜像,但是其他版本的镜像恐怕都下载不到了,所以就用这个最新的。

安装下载的步骤都是跟Android的x86是完全一样的。

这个安装后在我的电脑上也是一次性启动成功,但是它里面自带的一个file manager,也就是在主界面上一开始唯一能看到的那个APP,它是打不开的。然后在主界面可以看到有一个设置,这个设置相当于是Android tv的设置,它跟Android本身的那个设置还是不太一样的,这个我们后面会说,这个设置里面可以看到有一个应用程序,在应用程序里面,系统自带了一个叫files的一个文件管理器,并不是file manager。用这个系统自带的files,我们是可以读取USBU盘中的数据的,也就是说用这个方法去安装最开始的一些个APP,比如说apitoide tv。

有了apitoide tv之后,我们就可以开始在这个应用商店里面下载我们需要的东西,比如说一些其他的启动器,这个时候我们就会发现这个系统里面实际上还是有安卓的本身的那个设置的,而这个设置打开之后,选择里面任何一项都会导致直接退出。

也就是说对于安卓的tv来讲,我们应该只用tv主界面能看到的那个设置,其他的安卓的设置都是不可以用的。

这里产生的一个后果就是我们没有办法进到啊,原生设定里面的选项去打开native bridge。至于其他的功能,在Android tv主界面的这个设置里面,我们是可以找到我们所需要大多数或者几乎是所有的功能的。

那么还有一个问题就是hdmI这个接上hdmI之后它的显示是没进行自动的适配的,也就是说跟android x86是一样的画面,并且他的hdmI也是没有传输声音的。

于是到现在为止,我们有如下几个问题。

  1. HDMI Display Resolution
  2. HDMI Audio
  3. Native Bridge
  4. Netflix

HDMI Display

这个是Android x86和Android TV x86都共有的问题。解决方法是,在启动的时候,在Grub选项,按e,进入编辑界面,在启动的命令行后面添加

video=LVDS-1:d

参考这个视频

In short:

ls /sys/class/drm

I got:

  • card0-HDMI-A-1
  • card0-VGA-1
  • card0-LVDS-1

这就说明,我应该在grub命令后面添加的是LVDS-1:d而有些电脑可能需要添加的就是eDP-1:d

这个可能和接口有关?可能HDMI都是LVDS-1:d ?

这样做之后再启动,就只会在电视上进行显示,笔记本电脑本身的显示器就不会再显示任何东西了。对于电视盒子来讲,这个也算是非常合理的行为。

实际上应该有一个方法可以把这个固化到Grub的默认选项里面,我没有做这个事情,所以如果不小心关机了,还需要再做一次这个操作。

不过因为这个是笔记本改的,尽管电池已经严重损耗,但是毕竟可以支撑个5分钟,所以日常拔电源什么的不会有影响。

HDMI Audio

How to fix HDMI audio in Android-x86 if it doesn’t work out of the box

HDMI Audio

Quota from the second link (original post is in Spanish)

open command center with alt + F1 look at your controllers with the command alsa_aplay -l bind the controller that has the hdmi port to the one in use in my case it would look like this: ln -sf pcmC0D3p /dev/snd/pcmC0D0p To close the command center use the command alt + F7

步骤就是

  1. ALT + F1 to open the terminal
  2. ls -l /dev/snd
    1. This will show a list of all the sound(?) devices, pay attention to the pcmCDp ones.
    2. C[*] the * is the card number
    3. D[*] the * is the device number, under that card
  3. alsa_aplay -l
    1. This will tell us the cards and devices, on my device, it shows: card 0, device 3, is the HDMI sound device.
    2. It also shows the current used one is card 0, device 0 (I’m not sure about this, but at least the first one should be the one it is currently using)
    3. Then for me, this works: mv /dev/snd/pcmC0D0p /dev/snd/pcmC0D0p.original ln -sf /dev/snd/pcmC0D3p /dev/snd/pcmC0D0p
    4. Don’t forget to pkill audioserverafter all the above.

Then we got audio from the TV.

第一个链接相当于把ln -sf放到了init.sh里面,应该是说每次开机都会自动执行。我没有做这个事情,所以如果意外关机,还需要再手动做一次。(Update: 后来我还是把这个东西加在里面了)

/system/etc/init.sh

Add these lines in the “function init_hal_audio()” section, right below “esac”:

mv /dev/snd/pcmC0D0p /dev/snd/pcmC0D0p.original
ln -sf /dev/snd/pcmC0D3p /dev/snd/pcmC0D0p

第二个链接里面并没有说pkill audioserver的事情,这个是我在其他地方看到的。

Native Bridge

这个跟据不同的Android版本,应该是要选择不同的library

For Android TV x86 (version 7.1)

How to install libhoudini on a custom Android x86 rig

Houdini的下载链接,注意这里没有9.0版本,就是Android x86非TV版所需要的houdini

Rprop/libhoudini

对于7.1的TV版而言,下载

  • 7_x → 放到/system/etc/houdini.sys
  • 7_y → 放到/system/etc/houdini64.sys

之后运行 /system/bin/enable_native_bridge, 应该是不需要加Arguments的。印象中我试过 /system/bin/enable_native_bridge 64,但是似乎没用。

💡 如果遇到类似loop0, loop1 Busy之类的问题,就用 umount <path> 来把loop0, loop1 上面挂载点东西卸掉。

之后需要打开系统的native bridge选项,这个在TV版里面是没有的,需要通过命令行来打开。

参考文章

如何打开Android X86对houdini的支持_移动开发_Roland_Sun的专栏-CSDN博客

setprop persist.sys.nativebride 1   

这之后就算是有native bridge了,除了解决Netflix的问题,有一些小游戏也是可以玩的了。

Android x86 9.0 rc-2

其实原理是相同的,但是具体操作上面可以有不一样的选择。

首先,之前的github的链接没有9.0的houdini的链接。

参考链接:

fdddm’s comment from discussion “How do I install Houdini.sfs on my Android 9 system, need this because apps are not working/crashing.”

此时我们需要9_y的sys文件:

http://dl.android-x86.org/houdini.php?v=9_x

http://dl.android-x86.org/houdini.php?v=9_y

http://dl.android-x86.org/houdini.php?v=9_z

💡 之前在一个地方看到的说法: x代表32 bit y 和 z 都是64 bit的 但是 z 是给AArch 用的,所以大概率一般用不上。 此处我们需要的是y

我们只需要下载这个文件,然后放到/storage/emulated/0/Download/ 下面就可以了,名称改为houdini9_y.sys

💡 就是预先把应该下载的东西下载好,系统设置里面的x86兼容性项目,一旦打开,就应该是要下载这个东西,但是不知道什么原因,下载总是失败的,所以我们预先下载好,然后打开这个设置之后稍等,就可以有native bridge了。 实际上这个也是用到了/system/bin/enable_native_bridge这个script,但是这次的script和之前不同。官方似乎也是不建议直接运行这个script。

Netflix

如果我们直接下载最新的net flicks,或者从apitoide tv上面下载net flicks的话,它会显示这个APP并不兼容这个运行平台。相当于就是说他检测到了这个东西是x86平台而不是arm平台。然后通过在网上的搜索,发现在历史上有一个版本是可以在这种情况下使用的,虽说这个版本也不是给x86平台设计的,但是它在有native bridge的情况是可以运行的。

4.16.1 build 15145

Netflix 4.16.1 build 15145 APK Download by Netflix, Inc. – APKMirror

必须使用这个版本,并且不能升级,一旦升级就会导致netflix不可以运行。

注意,即使是这个版本,在native bridge没有完整支持的情况下,也是会直接退出的,它会显示程序已停止响应以停止运行。

最后

使用Android TV x86的一些小问题:

  • 通过USB 3.0转接的网线
    • 在Android x86 9.0 rc-2上面速度可到1Gbps,但是在Android TV x86上面只能达到70M bps。虽然作为1080p电视盒子是够用的。但是这个速度实际比5G的wifi还要慢(实测 WAN WIFI有300M bps左右)。

关于几个常用APP的测试,都是通过Apitode TV市场获得的:

  • Youtube TV
    • 使用良好,似乎cast功能(就是手机绑定Youtube TV)的功能也是良好的。
  • SteamLink
    • 崩溃退出
  • AirScreen
    • 使用良好
  • 华文电视
    • 使用良好

最后的最后

  • 这个方案现在已经放弃了,x86的Android TV能做的事情太有限了,很多APP都没有x86 Android的版本,或者即使有,稳定性也有问题。不过作为一次折腾,还有有些意义的,算是尝试了一下x86版本的Android。