Rafael Mardojai CM

Anarchist. Web dev. Programmer. Open Source enthusiast.

Android TV en Raspberry Pi 4

TL;DR: Aunque funciona bien, encontraremos problemas con las aplicaciones que requieren Widevine (DRM) de nivel L1. Esto afecta especialmente a Netflix y Prime Video.

Recientemente me puse a buscar alternativas para devolverle la vida a un televisor LG con WebOS 4 que ya no recibe mayores actualizaciones y solo tiene acceso a Youtube y Netflix. Obviamente una de las opciones sería adquirir un Chromecast con Google TV, pero como ya poseo un una Raspberry Pi 400 a la que no le doy tanto uso, quería ver que alternativas tenia con ella.

En esta búsqueda descubrí que gracias a Konsta tenemos builds de Android Open Source Project (AOSP), LineageOS y LineageOS Android TV conpatibles con RPI4. Android TV me llamó la atención en especial, ya que justamente quiero algo para una TV 😅. Si se desea se puede instalar el Android normal que nos dará una experiencia de tableta, útil si queremos un sistema que podamos controlar fácilmente con ratón y teclado.

A continuación contaré los pasos que seguí, y mi experiencia usando Android TV en mi Raspberry Pi 400. En mi caso escogí instalar Lineage 18.1 (Android 11), a pesar de que es una build que ya no recibe actualizaciones, es la única que funciona para algunos de mis requerimientos. Lo escribo como una guía para que pueda ser replicado fácilmente por cualquier interesado.

Instalando y configurando LineageOS Android TV

La instalación inicial es bastante sencilla, en mi caso bajar lineage-18.1-xxxxxxxx-UNOFFICIAL-KonstaKANG-rpi4-atv.zip desde la página oficial de la build (otras builds de otros sabores de Android y versiones más recientes se encuentran listados aquí) y escribirla en mi tarjeta micro SD de 32GB usando Raspberry Pi Imager.

Ahora podremos arrancar la SD en nuestra Raspberry, y seguir al asistente de configuración inicial. Aquí no recomiendo configurar mucho ya que pronto restableceremos a fabrica el sistema. Una vez terminado tendremos acceso a nuestro Android TV.

Preferentemente usaremos la flechas del teclado y Enter para navegar en el sistema, ya que está enfocado a su uso con controles remotos y a veces el ratón no se va a comportar como esperamos. El sistema también nos deja usar otras teclas como F1 para ir al inicio, F2 para volver atrás, F5 como “power” (bloquear, apagar) y F11 con F12 para subir y bajar el volumen.

En este momento nos encontraremos con los primeros “problemas”, pero son de fácil solución. Primero, la imagen que acabamos de instalar en nuestro SD es de 7GB, lo que quiere decir que el sistema no va a aprovechar los 32GB que tiene el SD. La solución para este problema, junto con la de otros, se encuentra en la FAQ de la página de donde bajamos la imagen. Aunque podemos agrandar la partición de data manualmente, el autor de esta build nos provee un paquete que podemos flashear en nuestro dispositivo usando Team Win Recovery Project (TWRP), una utilidad que nos permite instalar sistemas o paquetes en dispositivos Android, y que ya viene incluida en la imagen que escribimos al SD.

Antes de continuar veamos el segundo problema; las aplicaciones. ¿Cómo instalamos apps en nuestro sistema?, ¿dónde está Google Play?. Podríamos buscar “apks” por Internet e instalarlos manualmente, como tendremos que hacer más adelante con algunas, pero no es ideal ni seguro. La solución de este problema también se encuentra en la FAQ, debemos bajar el paquete de Open GApps para ARM64, Android 11 y en su variante tvstock.

Una vez tengamos nuestros paquetes para arreglar los problemas mencionados, lineage-18.1-rpi-resize.zip y open_gapps-arm64-11.0-tvstock-xxxxxxxx.zip, los copiaremos a una USB que llevaremos a nuestra Raspberry. Para instalarlos debemos abrir TWRP, al cual podemos acceder reiniciando el dispositivo en modo de recuperación. En el caso de Android TV hay una opción en “Ajustes”“Sistema”“Buttons”“Advanced reboot”, al activar esta opción, cuando vayamos a “Ajustes”“Sistema”“Reiniciar”, veremos la opción "Recovery", que nos reiniciará el sistema en TWRP.

Inicio de TWRP.

Cuando cargue TWRP, iremos a “Install” donde seleccionaremos nuestro USB en “Select Storage”, seleccionamos el archivo lineage-18.1-rpi-resize.zip y confirmamos arrastrando donde dice “Swipe to confirm Flash”. Una vez termine, volveremos atrás y repetiremos el proceso con open_gapps-arm64-11.0-tvstock-xxxxxxxx.zip. Después volveremos al inicio de TWRP, seleccionamos “Wipe” y confirmamos arrastrando en “Swipe to factory reset”, esto va a restablecer el sistema como si recién lo hubiéramos instalado. Finalmente volvemos al inicio de TWRP nuevamente y en “Reboot” seleccionamos “System”.

Ahora el dispositivo se reiniciará y volveremos a ver el asistente de configuración. Ahora tendremos acceso a Google Play y el sistema esta aprovechando nuestro micro SD en su totalidad.

Servicios de “Streaming”

Ahora tenemos acceso a Google Play, pero nos encontramos con un problema; no todas los servicios de streaming están disponibles para instalar.

Hay algunos servicios como HBO Max que funcionan bien. Otros como Paramount+ o Crunchyroll se encuentran disponibles en Google Play pero no tengo cuentas para probar que funcionen.

La raíz del problema se encuentra en el soporte para DRM, y no tiene soluciones muy satisfactorias. Aunque el Android que hemos instalado viene con Widevine, por lo que tenemos soporte para DRM, se trata de Widevine L3, el nivel más básico, las apps diseñadas para televisores de Netflix y Prime Video requieren Widevine L1, el cual necesita certificación y soporte en el hardware, algo imposible de conseguir en nuestro Raspberry. Otro ofensor es Disney+, que tampoco esta disponible en Google Play, pero no tengo cuenta, así que no he podido probar ninguna posible solución.

La solución más fácil es bajar las apks de estas aplicaciones en sus de versiones para Android “normal” desde sitios como APKMirror o APKPure (aquí hago descargo de responsabilidad 😅), copiarlas a un USB e instalarlas desde el explorador de archivos. Esto funciona porque las versiones para celulares y tabletas solo requieren Widevine L3, aunque no nos darán las altas resoluciones que se pueden esperar en ciertos televisores. La limitación de este método es que estas versiones no están diseñadas para ser navegadas con un control remoto, por lo que necesitaremos usar un ratón.

Si usamos este método querremos también instalar la aplicación para Android TV “Sideload Launcher”, las apps de celulares/tabletas no se listaran en el inicio de Android TV, y este lanzador nos permitirá acceder a ellas de una forma más fácil.

Ahora voy a listar las soluciones que aplique para cada servicio, Netflix y Prime Video.

Netflix

Para Netflix me encontré con este apk para Android TV, modificado para ejecutarse en dispositivos con L3 DRM sin certificar como el nuestro. El único problema es que da errores de conexión con Android 12 o mayores, por esta razón es que estoy instalando Android 11 😢. La versión de Netflix no es la más nueva pero funciona bien.

Prime Video

Con Amazon lamentablemente no tuve otra opción que instalar el apk de celulares/tabletas.

HDMI-CEC

HDMI-CEC es un protocolo que permite que dos dispositivos conectados por HDMI puedan ser controlados por el control remoto del otro.

Ya que para este experimento no he conseguido ningún control remoto USB o Bluetooth que pueda usar con la Raspberry, me interesa poder controlarla con el remoto de la TV. Las televisiones LG implementan esta tecnología con le nombre de “Simplink”.

En mi TV la función viene desactivada por defecto, por lo que la tuve que activar en las preferencias. El Android que hemos instalado viene con soporte para HDMI-CEC, pero al tener la Raspberry Pi 4 dos puertos HDMI, las preferencias (“Ajustes”“Sistema”“Raspberry Pi settings”) nos dejan seleccionar cual puerto usar como CEC, por defecto es el puerto “0”, en RPI4 es el puerto de la izquierda si vemos los puertos de frente.

Puertos HDMI de Raspberry Pi 4/400 y su numeración.

Ahora para hacer una vinculación correcta debemos apagar la Raspberry, desconectar el HDMI de la TV y apagar la TV. Con todo desconectado y apagado, los encenderemos y conectaremos en el siguiente orden; primero prendemos la TV, después conectaremos el HDMI de la Raspberry a la TV y por ultimo encendemos la Raspberry. Igual es recomendable averiguar como funciona HDMI-CEC en tu modelo de televisor.

En “Ajustes”“Sistema”“Entradas” tenemos acceso a preferencias relacionadas con HDMI-CEC.

Conclusiones

Si te gusta ser un guerrillero funciona bastante bien, de lo contrario es mejor comprar un Chromecast u otro Android TV certificado si quieres evitar los dolores de cabeza.

Conseguí hacer funcionar Netflix que era lo que más me interesaba. Youtube, y el sistema en general, van muy fluido, y eso ya lo hace una gran mejora sobre el sistema del televisor que tengo. Otro beneficio es que ahora puedo conectar mi USB y reproducir vídeos codificados en VP9 sin problemas. Así que en mi caso estoy bastante satisfecho y lo continuaré usando.

Cabe mencionar que que la Raspberry Pi 4 no esta diseñada para ejecutar Android, por lo tanto siempre habrán algunas limitaciones, por ejemplo no hay soporte de codificación ni decodificación de vídeo por hardware, por lo que puede que algunos vídeos de Youtube no corran bien en 1080p.

Igualmente también instalé Lineage 20 (Android 13) en su versión para tabletas, y funciona decentemente como un sistema de escritorio, vale la pena probarlo.