我要看电视 - 将树莓派 5 打造成 Android TV 电视盒子折腾记(1)

在上一篇文章 《我要看电视 - 投影仪和电视盒子选型》中,提到了用树莓派 5 来作为电视盒子,需要刷 Android TV 系统,本文将详细介绍折腾经历。
在这之前我并没有接触过树莓派,Android 系统倒是曾经刷过机,但也了解不深。文中如有不正确的地方,欢迎指正。

准备工作

要想折腾树莓派,还是需要一点点设备,我使用到的设备清单如下:

  1. 一台 Mac 笔记本电脑:用来下载镜像、烧录景象、远程连接电视盒子等。其他操作系统的电脑均可。
  2. 一个 32G SD 卡:用来作为树莓派的存储系统 RAM。
  3. 一个 SD 读卡器:用来读取 SD 卡,供电脑烧录系统使用。
  4. 一个 U 盘:该 U 盘并非树莓派的 SD 卡,而是作为树莓派的额外存储,用来向树莓派中复制文件。
  5. 一台显示器:用来显示树莓派的内容,也可以是电视或者投影仪等设备。
  6. 一个 USB 键盘:用来连接树莓派进行操作。
  7. 一个 USB 鼠标:用来连接树莓派进行操作。
  8. 一个蓝牙遥控器:用来连接树莓派的 Android TV 系统。我直接使用了家里办宽带送的移动电视盒子的遥控器。
  9. 一根 HDMI 数据线:其中一头为 Micro HDMI,用来连接树莓派,另外一头为标准 HDMI 口,用来连接显示器。

另外:

  1. 网络需要能够访问 Google 等网站。

寻找 Android TV 系统

找到树莓派对应的 Android TV 镜像是非常重要的前提,找到合适的 ROM 永远是 Android 系统刷机中非常重要的一环,一般每个设备总有那么几个大神在提供各类 ROM。
查找一个设备的资源最快的方式就是去 github.com 上查找 awesome,树莓派的项目地址为:awesome-raspberry-pi。在 OS Images 章节中包含了支持树莓派的多种 OS,单纯搜索 Android TV 并不能找到对应的 OS,但实际上 KonstaKANG 对应就是 Android 镜像,这是文档不好的地方,并没有将简介写清楚。
image.png

KonstaKANG 并非一个系统,而是一个网站,包含了多种设备的 OS 镜像。对应的 Raspberry 5 的页面包含了 AOSP 和 LineageOS 两种 OS 镜像,AOSP 和 LineageOS 均为 android 的发型版。但只提供了 LineageOS 20 一个 Android TV 的版本,剩下的两个为 Android 版本。Android TV 和 Android 并非同一个系统,Android TV 是针对电视使用的系统,而 Android 是针对智能手机和平板使用的系统,用户体验上还是有较大区别。
image.png
因此,LineageOS 20 Android TV (Android 13) 即变为了目前唯一一个可以在树莓派 5 上使用 Android TV 系统,除此之外,别无他选。无论该系统是否完善,这就是目前的唯一选择了。在文章中介绍了非常多的系统方面的支持,建议精读一遍,包括文章后面的评论。
文中的两个镜像,一个是原始镜像,另外一个是 ota 补丁包,两个均需要安装。
image.png

用到的文件

由于在国内下载非常不稳定,通常需要魔法下载,我将需要用到的文件上传到云盘供下载使用。我对部分软件的用途一知半解,但我知道安装了应该没有坏处,选择全部安装。

刷 LineageOS 到树莓派

树莓派官方提供了镜像烧录工具 Imager,支持 Windows、Ubuntu、Mac,刷机非常方便。image.png
将树莓派的 SD 插入到电脑,在 Raspberry Pi Device 中选择 RASPBERRY PI 5,在请选择需要写入的操作系统中使用 Use custom 选项选择已经下载好的文件 lineage-20.0-20240112-UNOFFICIAL-KonstaKANG-rpi5-atv.zip,选择对应的 SD 卡,再点击 Next 即可开始将镜像写入到SD 卡中。
值得一提的是,对于树莓派其他的系统,都不需要事先下载,选择系统后,该工具可以自动下载最新版本,这个功能还是非常值得👍。

LineageOS 初步体验及初步设置

在将系统刷入 SD 卡后,即可将 SD 卡放到树莓派 5 中,在树莓派中连接好键盘和鼠标。
下面步骤中可能会用到键盘的一些快捷键:F1 = Home, F2 = Back, F3 = Multi-tasking, F4 = Menu, F5 = Power, F11 = Volume down, and F12 = Volume up
开机后即可看到 LineageOS 的开机动画。
image.png

接下来就会看到查找蓝牙设备的界面,这里可以选择等待一会后自动跳过。
image.png

接下来就来到了 Welcome 的界面,点击 Start
image.png

接下来会进入到选择语言、连接 WIFI 等操作,完成后即可进入到操作系统界面。操作系统界面可谓简洁到不能再精简,只有一个文件的应用。左上角的语音和搜索功能均不能使用。
image.png

但设置功能作为 Android 系统的核心,这部分功能一点都不会少。在设置中连接 Wifi 后发现会持续断开,不知道是否为系统的问题。

打开 Recovery 模式:设置 -> 系统 -> Buttons,打开右侧的 Advanced restart。
image.png

打开开发者模式:设置 -> 系统 -> 关于 -> Android TV 操作系统版本,连续点击键盘的回车键,会提示开发者模式已打开。
image.png

打开 Rooted debug:设置 -> 系统 -> 开发者选项 -> 打开 USB 调试Rooted debuggingADB over network 三个选项。

打开树莓派的 SSH 服务:设置 -> 系统 -> Raspberry Pi Settings 中将 SSH 服务打开。
image.png

刷入 ota 包

接下来选择刷入 OTA 包 lineage-20.0-20240112-UNOFFICIAL-KonstaKANG-rpi5-atv-ota.zip,ota 包不会用到树莓派镜像烧录器,而是要通过Android Recovery 模式刷入。需要事先准备好 OTA 包,并将其复制到 U 盘中,并将 U 盘插入到树莓派中。

在 Android 系统设置 -> 系统 -> 重新启动中选择 Recovery,此时系统会重启进入到 Recovery 模式。
image.png

点击 Install,并选择右下角的 Select Storage 按钮,选择 USB 存储,即刚插入的 U 盘。
image.png

在 U 盘中选择要刷入的 ota 补丁,取消 Zip signature verification
image.png

Swipe to confirm Flash处向右滑动鼠标,即可进入到安装 ota 补丁的界面。ota 补丁安装完成后,即可自动重启进入到 Android TV 系统中。重新进入系统后,发现系统的界面没有任何变化,不知道该 ota 补丁的具体影响功能。
image.png

系统存储空间设置

在默认的情况下,打开设置 -> 存储空间,可以看到内部共享存储空间仅为 4.7 GB,这里的存储空间为 /data 目录挂载的设备,并没有将 U 盘的空间全部使用起来,U 盘剩余的磁盘空间处于未分配状态。
image.png

这里使用 lineage-20.0-rpi-resize.zip 工具来修改存储空间,按照刷入 ota 包相同的方式,进入 Recovery 模式下刷入该包,重新进入系统后即发现存储空间已经变大。
image.png

安装 adb 工具

前置条件:开发者选项中的 ADB over network 必须为开启状态。

adb 命令需要安装到电脑上,在 mac 下使用 brew install android-platform-tools即可安装完成。

在 android tv 上查看当前的 ip 地址,我这里为 192.168.31.167。执行 adb connect 192.168.31.167 后即可获取到 USB 调试信息,并选中一律允许使用这台计算机进行调试处后点击允许。
image.png
此时在终端中即可显示出连接成功的信息:already connected to 192.168.31.167:5555

在安装完 adb 工具后,即可以通过 adb 命令来远程访问 Android TV 系统了。例如:

  • adb install 可以安装 apk 包。
  • adb shell settings list global 命令来查看 Android 系统的所有global 配置。
  • adb logcat 查看 android 的日志。

远程 ssh 连接

前置条件:

  1. ssh 连接需要首先在 Raspberry Pi Settings 中的 Remote access 中打开 SSH。
  2. adb connect 可以连接到 Android TV。

在开启 SSH 服务后,ssh 连接需要使用对应的私钥信息,而私钥信息需要通过 adb 命令获取。

1
2
3
4
5
6
7
8
9
adb connect 192.168.31.166
adb root
# 可查看 /data/ssh 目录下的 ssh 秘钥信息
adb shell ls /data/ssh
# 将秘钥信息放到本地
adb pull /data/ssh/ssh_host_ed25519_key ~/.ssh/android_tv.key
chmod 600 ~/.ssh/android_tv.key
# 成功 ssh 连接
ssh -i ~/.ssh/android_tv.key root@192.168.31.166

安装 Google Apps

注意:此处要求网络具备魔法,可以访问 Google

刷入 Google Apps 包

Google Apps 包为必须用到的包,通过 Recovery 模式刷入包 MindTheGapps-13.0.0-arm64-ATV-full-20240104_210039.zip。包安装完成后,重新进入系统发现界面发生了变化,多出了应用 Google Play Store,左上角的语音和搜索功能虽然不可以用,但是点击后提示信息已经发生了变化。

原来的文件应用在这里消失不见了,实际上在所有应用中还可以找到。

image.png
在系统中使用 Google 账号登录 Google Play Store,即使在可以访问 Google 的网络下,发现也一直会失败。

查询并注册 Android ID

因为该 Android TV 设备并不被信任,需要将 Android ID 在 Android 网站注册。如果不注册,那么 Google 账号登录不成功。
将树莓派的 SD 卡插入到笔记本,查看 SD 卡中的文件 gsf-android_id.txt,该文件对应的内容即为 Android ID。
还有另外一种办法可以获取到 Android ID,在笔记本上通过 adb 命令查询到当前设备的 Android ID。

1
2
3
4
5
6
7
adb root
# 找到 google service 的 sqlite3 数据库文件
adb shell 'find /data -name "gservices.db"'

# 通过数据库查询到 android id
# 其中 sqlite3 命令后的为上面步骤查询出的文件路径,如果查询出多个,可以任选一个
adb shell 'sqlite3 /data/data/com.google.android.gsf/databases/gservices.db "select * from main where name = \"android_id\";"'

将上述 Android ID 在网站进行注册,网址:https://www.google.com/android/uncertified/
image.png

使用 Google 账号登录

重新进入 Recovery 模式,点击 Wipe -> Factory reset,此时机器会进行重启。该操作会清空系统中的 /data/media 下的内容。(还不太清楚该步骤是否为必须操作)
image.png

机器重新后会重新进入一遍系统的初始化,但现在的初始化界面跟最初的 LineageOS 的初始化有所不同,进入到了 GMS 的开机引导,该步骤中必须要登录到 Google 账号,而且无法跳过。如果 Android ID 没有注册,此时登录 Google 账号一直会失败,导致无法进入到系统中。
image.png

登录完成后在首页可以看到了更多的一些信息:
image.png

通过 Recovery 刷入其他包

widevine 是在 Android 生态下跟数字版权相关的包,通过 Recovery 模式刷入包 lineage-20.0-rpi-widevine.zip。

通过 Recovery 模式刷入包 lineage-20.0-rpi-magisk-v25.2.zip,进入到 Android TV 系统后通过文件工具安装包 Magisk-v25.2.apk。

解决网络连接受限

如果本地的网络无法访问 Google,默认情况下,网络会提示网络连接受限,原因主要还是跟访问不了 Google 的域名有关,以至于 Android TV 系统不能识别出可以连接互联网。
image.png

网络连接受限状态的 WIFI,经测试机器重启后无法自动连接,需要每次都手工连接 WIFI。

执行如下的命令来系统进行设置:

1
2
3
4
5
6
7
8
9
10
adb connect 192.168.31.166

# 设置时间服务器
adb shell settings put global ntp_server ntp1.aliyun.com

# 该值默认为 0
adb shell settings put global captive_portal_detection_enabled 1

# 默认没有这两个值
adb shell settings put global captive_portal_https_url https://connect.rom.miui.com/generate_204

设置完成后重启系统,即可看到网络的连接受限已经消除,并且 WIFI 已经可以自动连接了。

常用 apk 软件安装

我这里使用了 https://kxsw.gitbook.io/tv/ 中的方法安装了 File Commands 和 Clash 软件。File Commands 可以用来管理本地的文件,甚至可以提供 HTTP Server,供远程来下载或者上传文件。
国内的常见应用在 Google Play Store 中并不存在,而且通过 Google Play Store 直接安装应用很可能会失败,跟使用的网络有很大关系。国内的应用我直接使用了当贝市场来安装电视应用即可。

其他问题

听不到声音

在播放视频时发现听不到声音,原因是因为默认情况下使用了 hdmi0 接口来输入声音,通过 hdmi1 只能输出视频信号,没有声音。将 hdmi 线切换到 hdmi0 口后并重启系统后,声音即正常。

后续

到目前为止,树莓派已经具备了完整的 Android TV 系统的功能,而且使用起来还比较稳定,这一点超出了我的预期,毕竟树莓派 5 比较新,该系统出来的时间比较短。
后面我计划使用新的文章来记录使用体验,以及新的折腾经历,比如:如何通过遥控器实现正常的开关机。
敬请期待。。。

资料