Blog
Cómo quité el bloatware de un Android TV de 1 GB con ADB, sin root
Debloat de Android TV con ADB sin root: mi lista de paquetes GHIA/KTC, comandos para desactivar apps y restaurar el launcher, y resultados en una TV de 1 GB.

El televisor de mi recámara es un GHIA con Android TV 14 y 1 GB de RAM. Presionar Inicio era lento y el launcher original llenaba la pantalla con un anuncio patrocinado, recomendaciones y aplicaciones que no utilizaba. Quería una pantalla de inicio más ligera y tranquila, sin hacer root ni aplicar un cambio irreversible.
Usé ADB por Wi-Fi para respaldar su estado, desactivar paquetes seleccionados, instalar un launcher de 4.7 MB y verificar cada cambio. En este televisor concreto, el tamaño proporcional medido (PSS) de la pantalla de inicio bajó de 107 MB a 39 MB: una reducción del 63%. Los anuncios y el componente de reconocimiento automático de contenido (ACR) desaparecieron de la experiencia de inicio, mientras HDMI, Chromecast y los servicios esenciales de Android siguieron funcionando.
Respuesta breve: es posible quitar el bloatware de muchos dispositivos Android TV sin root mediante el comando
pm disable-userde ADB. Primero crea un respaldo, identifica cada paquete de tu modelo y desactiva en lugar de desinstalar. Los nombres y el comportamiento cambian según el fabricante: no pegues en tu televisor una lista genérica de bloatware.
Dirigí el trabajo con Claude dentro de OpenCode y partí del repositorio de código abierto tv-home. El patrón útil no fue «dejar que la IA hiciera cualquier cosa», sino planear → preguntar → actuar → verificar, con pasos pequeños, reversibles y acompañados de evidencia.
Resultados principales
| Medición | Antes | Después |
|---|---|---|
| Memoria de la pantalla de inicio (PSS) | 107 MB | 39 MB (−63%) |
| Pantalla de inicio | Anuncio patrocinado y filas promocionales | Reloj, fondo y aplicaciones elegidas |
| Paquete de ACR/rastreo de contenido | Habilitado | Deshabilitado |
| Aplicaciones visibles en el launcher | 16 | 3 en el dock y 3 en la cuadrícula |
| Navegador | Navegador preinstalado y lento | TV Bro, compilación de 6.8 MB |
| Ruta de recuperación | Sin documentar | Script generado desde el respaldo con --dry-run |
Estas cifras describen un televisor GHIA/KTC bajo mis condiciones de prueba; no son un benchmark para todos los equipos Android TV o Google TV.
Antes de comenzar: riesgos y requisitos
ADB, o Android Debug Bridge, es el protocolo para desarrolladores de Google que permite abrir una terminal, transferir archivos e instalar aplicaciones en Android. Tiene suficiente poder para dejar un televisor sin una pantalla de Inicio funcional si desactivas el paquete equivocado.
Hazlo únicamente en un equipo propio o que administres. Antes de cambiar algo:
- Activa el modo para desarrolladores: Configuración → Preferencias del dispositivo → Acerca de → presiona OK siete veces sobre “Compilación”.
- Activa Depuración por USB en Opciones para desarrolladores. En este modelo, el fabricante también expuso ADB en la red local mediante el puerto 5555; otros equipos pueden requerir el flujo de vinculación de Depuración inalámbrica.
- Mantén el televisor y la computadora en una red de confianza.
- Registra el launcher original, los paquetes habilitados y la configuración del sistema.
- Confirma la identidad del fabricante antes de enviar cualquier comando que modifique el equipo.
Mi Fire TV Stick estaba conectado al mismo televisor y a la misma red, así que el último punto era importante. Le marqué al agente un límite explícito:
Modifica únicamente el televisor. No toques ningún otro dispositivo, incluido el Fire TV.
El punto de partida y las herramientas
El launcher original mostraba una promoción de Prime Video, filas de «TV en vivo gratis» y contenido en tendencia. Todo consumía memoria escasa en un sistema con apenas 913 MB de RAM utilizable.
El proyecto tv-home, inspirado en tv-vibehack, ya incluía gran parte de las herramientas:
| Ruta | Función |
|---|---|
tools/tv.py |
Pequeño cliente ADB en Python puro para comandos, capturas y carga de APK por fragmentos |
tools/find-tv.sh |
Escanea la subred local en busca de servicios ADB y Cast |
tools/disable.sh y restore.sh |
Aplica o revierte una lista documentada de paquetes |
launcher/ |
Launcher minimalista al estilo Apple TV hecho con las API del framework de Android |
El launcher no usa AndroidX ni Gradle y no solicita permiso de red. Eso mantuvo pequeños tanto el APK como su consumo durante la ejecución.
1. Encontrar y verificar el Android TV correcto
ADB por red utiliza una conexión TCP autenticada con un par de claves RSA. La primera conexión muestra en el televisor el mensaje ¿Permitir depuración por USB?. La documentación de ADB de Google explica el flujo oficial de conexión y autorización.
El repositorio también admite adb-shell, una implementación del protocolo ADB en Python:
from adb_shell.adb_device import AdbDeviceTcp
from adb_shell.auth.sign_pythonrsa import PythonRSASigner
device = AdbDeviceTcp("192.168.x.y", 5555, default_transport_timeout_s=120)
device.connect(rsa_keys=[PythonRSASigner(public_key, private_key)])
print(device.shell("getprop ro.product.model"))
No confié en «el primer host con el puerto 5555 abierto». El descubrimiento de solo lectura cruzó tres señales:
- mDNS anunciaba el nombre amigable del televisor.
- El puerto 5555 aceptaba una conexión ADB.
- El endpoint
eureka_infode Cast en el puerto 8008 devolvía el nombre y la compilación esperados.
Después de fijar esa IP para toda la sesión, consulté las propiedades de Android y detuve el proceso a menos que coincidieran con el equipo esperado:
ro.product.manufacturer = KTC
ro.product.brand = GHIA
ro.product.device = stanford
ro.build.version.release = 14
El cliente de Python agotó inicialmente el tiempo de autorización. Me conecté una vez con el binario adb de Google, acepté el mensaje y reutilicé esa clave ya autorizada con el cliente de Python. Era menos elegante, pero más seguro que cambiar repetidamente la configuración de autenticación.
2. Crear un respaldo antes de desactivar paquetes
El primer script nuevo fue tools/backup.sh. Solo lee datos del televisor y guarda en la computadora una instantánea con fecha y hora:
tv 'pm list packages -f --show-versioncode' > packages-all.txt
tv 'pm list packages -e' > packages-enabled.txt
tv 'pm list packages -d' > packages-disabled.txt
tv 'cmd package resolve-activity --brief \
-a android.intent.action.MAIN \
-c android.intent.category.HOME' > home-activity.txt
tv 'settings list global' > settings-global.txt
tv 'settings list secure' > settings-secure.txt
tv 'settings list system' > settings-system.txt
tv 'dumpsys meminfo <paquete-del-launcher>' > meminfo-home.txt
tv --shot screen.png
Dos archivos evitaron errores sutiles al restaurar:
packages-disabled.txtregistró lo que la fábrica ya había deshabilitado. La restauración no debía activar software que estaba apagado antes de comenzar.home-activity.txtguardó el componente real del launcher. Este televisor usaba Android TV clásico (com.google.android.tvlauncher/.MainActivity), no el launcher de Google TV que suponía el script original.
A partir de la instantánea, el agente generó restore-from-backup.sh. Compara el estado inicial con el actual, vuelve a habilitar solo los paquetes originalmente activos, restaura la actividad Home original y admite --dry-run para revisar cada comando antes de ejecutarlo.
3. Desactivar paquetes, no desinstalarlos
Android ofrece dos operaciones que suelen usarse para quitar bloatware, pero no se recuperan de la misma forma:
| Comando | Efecto para el usuario 0 | Recuperación |
|---|---|---|
pm uninstall --user 0 <paquete> |
Quita la app para ese usuario y puede borrar sus datos | A veces recuperable con cmd package install-existing |
pm disable-user --user 0 <paquete> |
Conserva la app instalada, pero impide que se ejecute o aparezca | Reversible con pm enable <paquete> |
Usé únicamente disable-user. Así obtenía una ruta de regreso clara y evitaba afirmar que un APK del sistema había desaparecido de la partición de solo lectura.
Lista de paquetes para debloat de Android TV: qué desactivé y conservé
El agente agrupó los 141 paquetes y me consultó cualquier elemento que pudiera formar parte de mi uso normal. Los nombres siguientes pertenecen a este firmware KTC/GHIA; no son una lista universal:
| Paquete | Función en este GHIA/KTC | Mi decisión y sus límites |
|---|---|---|
tv.anoki.acr.anokiacroptin |
Componente de ACR/reconocimiento de contenido | Lo desactivé en este televisor; verifica el paquete exacto en tu firmware. |
android.autoinstalls.config.ktc.pai |
Configuración del fabricante para instalar apps promocionadas | Lo desactivé después de revisar las apps instaladas. |
com.mediatek.android.leanbacklauncher.partnercustomizer |
Personalizaciones de socios y filas promocionales | Lo desactivé; comprueba después el comportamiento de tu launcher original. |
com.google.android.tvrecommendations |
Filas de recomendaciones del launcher original | Lo desactivé; elimina una función que quizá quieras conservar. |
fusion.android.tv.demo |
Modo de demostración para tiendas | Lo desactivé en mi televisor de uso doméstico. |
com.google.android.tvlauncher |
Pantalla de Inicio original de Android TV | Lo desactivé solo después de instalar y probar su reemplazo. |
com.google.android.tungsten.setupwraith |
Aplicación de configuración de Google y otro candidato a Home | Lo desactivé para resolver un conflicto de Inicio en esta TV ya configurada; no es una recomendación general de limpieza. |
com.mediatek.wwtv.tvcenter |
TV en vivo y entradas HDMI | Lo conservé habilitado: controla funciones esenciales de entrada en este modelo. |
No existe una lista universal de paquetes seguros para desactivar. Estas decisiones describen un televisor; no son una prueba de compatibilidad con Chromecast, Nvidia Shield ni todos los Android TV box. Guarda el estado original de los paquetes para poder revertir cada cambio.
Comandos ADB para inspeccionar, desactivar y restaurar un paquete
Los comandos siguientes usan adb de Google desde la computadora, en lugar del helper tv del repositorio. Sustituye TV_SERIAL por el identificador exacto que muestra adb devices para el televisor que verificaste. Con ADB por red suele ser una dirección IP y un puerto. Detente si el equipo aparece desconectado o sin autorización.
Comienza con una inspección de solo lectura y guarda las listas de paquetes habilitados y deshabilitados del usuario principal:
adb devices
adb -s TV_SERIAL shell getprop ro.product.model
adb -s TV_SERIAL shell pm list packages --user 0 -e > packages-enabled.txt
adb -s TV_SERIAL shell pm list packages --user 0 -d > packages-disabled.txt
adb -s TV_SERIAL shell dumpsys package tv.anoki.acr.anokiacroptin
Usa una carpeta de respaldo nueva en cada sesión para no sobrescribir una instantánea anterior. El par siguiente es un ejemplo para el paquete ACR que identifiqué en mi TV, no una orden para ejecutar en cualquier modelo. Ejecuta el primero solo después de verificar el paquete y decidir desactivarlo; el segundo revierte esa decisión si estaba habilitado originalmente:
adb -s TV_SERIAL shell pm disable-user --user 0 tv.anoki.acr.anokiacroptin
adb -s TV_SERIAL shell pm enable --user 0 tv.anoki.acr.anokiacroptin
Después de cada cambio, prueba Inicio, el control remoto, las entradas, la transmisión y tus apps habituales. Si falla una función, vuelve a habilitar el último paquete modificado. Estas listas registran el estado; no son un respaldo completo de los datos de las apps ni del firmware.
Conservé Chromecast, pero desactivé las apps de streaming duplicadas en mi Fire TV Stick, la aplicación de canales con publicidad, el reproductor multimedia que no usaba y el navegador original. Lo reemplacé por TV Bro, un navegador de código abierto diseñado para control remoto. Antes de instalarlo comparé el SHA-256 del APK con el publicado en la versión de GitHub.
No toqué Play Store, Google Play Services, Configuración, el teclado, TalkBack, el servicio del control remoto ni Assistant. Sobre todo, conservé com.mediatek.wwtv.tvcenter, la aplicación del fabricante que controla la TV en vivo y las entradas HDMI en este equipo.
La lista vivía en un archivo de texto con un motivo junto a cada línea. Envié una sola operación por invocación porque, durante las pruebas, las cadenas de comandos del gestor de paquetes se habían detenido antes de tiempo sin mostrar un error claro.
4. Reemplazar la pantalla de Inicio de forma segura
Al presionar Inicio, Android envía un intent con ACTION_MAIN y CATEGORY_HOME. Las aplicaciones que declaran ese intent son candidatas a launcher; Android las resuelve según su prioridad y la actividad preferida por el usuario.
La secuencia prevista era:
pm install -r tvhome.apk
cmd package set-home-activity --user 0 com.mihir.tvhome/.MainActivity
pm disable-user --user 0 com.google.android.tvlauncher
El script original desactivaba el launcher de fábrica sin comprobar primero que la instalación hubiera funcionado. Eso podía dejar al televisor únicamente con el FallbackHome mínimo de Android. Cambié el flujo para no tocar el launcher original si pm install no devolvía Success:
echo "$output" | grep -q '^Success' || {
echo "Install failed; stock launcher left untouched."
exit 1
}
Este firmware tenía otro candidato: com.google.android.tungsten.setupwraith, la aplicación de configuración de Google. Al deshabilitar el launcher original, SetupWraith podía apropiarse de Inicio con mayor prioridad que el launcher de terceros. También lo desactivé y lo incorporé a la restauración.
La comprobación definitiva se realizó desde otra aplicación. Abrí YouTube, presioné Inicio e inspeccioné topResumedActivity para confirmar que Android volvía a com.mihir.tvhome/.MainActivity.
Cómo quitar un launcher personalizado de Android TV con ADB
Restaura una pantalla de Inicio original que funcione antes de desactivar el launcher personalizado. Este ejemplo corresponde a mi GHIA/KTC, cuyo respaldo registró com.google.android.tvlauncher/.MainActivity. Sustituye el paquete y el componente por los de tu propio home-activity.txt; Google TV utiliza otros componentes.
Primero vuelve a habilitar el launcher original si tu respaldo indica que estaba activo:
adb -s TV_SERIAL shell pm enable --user 0 com.google.android.tvlauncher
Si también desactivaste SetupWraith durante este experimento y estaba habilitado en el respaldo original, restáuralo por separado:
adb -s TV_SERIAL shell pm enable --user 0 com.google.android.tungsten.setupwraith
Selecciona el componente Home original y ábrelo:
adb -s TV_SERIAL shell cmd package set-home-activity --user 0 com.google.android.tvlauncher/.MainActivity
adb -s TV_SERIAL shell am start --user 0 -n com.google.android.tvlauncher/.MainActivity
Abre otra app, presiona Inicio y confirma que aparece el launcher de fábrica. Detente si falla un comando o Inicio no funciona. Solo después de esa comprobación, desactiva el launcher personalizado de este experimento:
adb -s TV_SERIAL shell pm disable-user --user 0 com.mihir.tvhome
El APK y sus datos permanecen instalados para poder recuperarlos. Esto no desinstala la app. Mantén ADB disponible hasta volver a verificar el control, las entradas HDMI e Inicio.
5. Compilar un launcher de 4.7 MB sin Gradle
El launcher es una sola Activity de Android construida con vistas del framework como FrameLayout, LinearLayout y un ScrollView personalizado. Incluye:
- 12 fondos de naturaleza incluidos localmente y decodificados fuera del hilo principal como bitmaps
RGB_565; - una transición cada diez minutos;
- enlaces de foco deterministas para cada mosaico y el control direccional;
- un menú de entradas basado en
TvInputManagery entradas passthrough; - recursos localizados en inglés y español;
- ningún permiso de red.
La documentación del TV Input Framework describe las API de plataforma usadas para descubrir entradas. En este equipo, el launcher encontró Composite, Fire TV Stick, HDMI 1, HDMI 2 y TV en vivo.
El dock se configura con los nombres de paquetes Android en un archivo de recursos:
<string-array name="dock_apps">
<item>com.google.android.youtube.tv</item>
<item>ch.protonvpn.android</item>
<item>com.phlox.tvwebbrowser</item>
</string-array>
<string name="live_tv_package">com.mediatek.wwtv.tvcenter</string>
En lugar de Gradle, el script llama directamente a las herramientas del SDK de Android:
aapt2 compile --dir res -o res.zip
aapt2 link -o base.apk -I android.jar --manifest AndroidManifest.xml \
--java gen -A assets --min-sdk-version 30 --target-sdk-version 34 res.zip
javac --release 11 -classpath android.jar -d classes $(find src gen -name '*.java')
d8 --min-api 30 --lib android.jar --output dex classes/**/*.class
zip -u unsigned.apk classes.dex
zipalign -f 4 unsigned.apk aligned.apk
apksigner sign --ks debug.keystore --out tvhome.apk aligned.apk
El flujo es recursos → R.java generado → bytecode de la JVM → DEX → alineación del ZIP → firma. El APK final pesaba 4.7 MB, principalmente por los fondos.
Problemas que encontré y cómo los resolví
Play Protect bloqueó la primera compilación
La primera instalación parecía congelada. Una captura reveló un mensaje de Play Protect indicando que la app se había creado para una versión antigua de Android. El launcher apuntaba a la API 30; cambiar targetSdkVersion a 34 resolvió el bloqueo en este televisor.
Fue una observación sobre este equipo y su política de Play Protect, no una regla general de Android 14. La restricción documentada de la plataforma bloquea nuevas instalaciones dirigidas a una API inferior a 23, mientras los productos de seguridad y fabricantes pueden aplicar verificaciones adicionales. Consulta el cambio de nivel mínimo de API en Android 14 de Google.
Apuntar a versiones recientes también expuso un requisito de compatibilidad: los receptores registrados durante la ejecución deben declarar si se exportan. Registré explícitamente los receptores de eventos del sistema en versiones recientes:
if (Build.VERSION.SDK_INT >= 33) {
registerReceiver(receiver, filter, Context.RECEIVER_EXPORTED);
} else {
registerReceiver(receiver, filter);
}
Google documenta estas banderas en su guía de receptores registrados mediante contexto.
Una aplicación del fabricante volvió a activarse
Después de que el Fire TV cambiara la entrada del televisor, el paquete de canales con publicidad apareció explícitamente habilitado. Algún proceso del fabricante había cambiado su estado. Lo desactivé otra vez y documenté el comando de recuperación, en lugar de introducir un servicio permanente que lo vigilara.
La interfaz estaba escrita directamente en inglés
Moví todo el texto visible a res/values/strings.xml y añadí res/values-es/strings.xml. Android ahora elige «GOOD AFTERNOON» o «BUENAS TARDES», además de etiquetas localizadas y el marcador a. m./p. m. correspondiente a la configuración regional.
Lo que reveló la prueba de HDMI-CEC
También investigué por qué el control del Fire TV podía encender el televisor y seleccionar su entrada, pero no cambiar el volumen. HDMI-CEC es el bus de control transportado por el cable HDMI. Android muestra su estado e historial mediante dumpsys hdmi_control; Android Open Source Project documenta el subsistema en su guía de HDMI-CEC.
El historial mostró mensajes <Image View On> y <Active Source> enviados por el Fire TV, lo que confirmó que el encendido y el cambio de entrada funcionaban. Sin embargo, durante una prueba de 30 segundos con los botones de volumen no cambió el historial CEC ni aparecieron eventos de entrada sin procesar en el televisor.
La conclusión defendible se limitó a este conjunto: la combinación configurada de Fire TV y televisor no enviaba el volumen como CEC ni como un código infrarrojo reconocido. El control propio de la TV utilizaba Bluetooth Low Energy y la configuración infrarroja del fabricante requería root para poder leerla. Comparé la configuración CEC con el respaldo y era idéntica, así que la limpieza no había causado esa limitación.
Lo que hizo bien el agente de IA y dónde intervine
El agente fue especialmente útil para leer salidas desconocidas del sistema, comparar estados de paquetes e identificar suposiciones peligrosas. Detectó el script que podía desactivar Inicio después de una instalación fallida, la restauración que habría encendido apps deshabilitadas de fábrica y el riesgo de conectarse al dispositivo ADB equivocado.
Yo seguí a cargo de las decisiones que dependían del contexto:
- qué aplicaciones y funciones del televisor utilizo realmente;
- aceptar la autorización RSA;
- presionar botones y observar el equipo físico;
- decidir qué paquetes se podían desactivar;
- definir límites como «no toques el Fire TV».
Esa división del trabajo fue importante. Un agente de IA puede revisar evidencia y automatizar tareas repetitivas, pero no puede deducir qué dispositivo o función del hogar es prescindible. Cada cambio de estado necesitó una explicación, mi aprobación y una verificación.
Apliqué el mismo principio cuando liberé más de 12 GB en Hotmail clasificando unos 70 mil correos con Jev: el modelo proponía decisiones, pero nada se borraba hasta que yo lo revisaba.
Preguntas frecuentes
¿Se puede quitar el bloatware de Android TV sin root?
Sí. En muchos dispositivos Android TV puedes desactivar apps para el usuario principal con ADB y pm disable-user --user 0. El APK del sistema no se elimina y normalmente puedes revertirlo con pm enable. La disponibilidad de ADB por red y los nombres de paquetes dependen del fabricante y del firmware.
¿Es más seguro pm disable-user que desinstalar una aplicación?
Es más fácil de revertir porque conserva el paquete y sus datos. No está libre de riesgos: deshabilitar el launcher, Configuración, el servicio del control o un paquete de entradas del fabricante puede romper funciones esenciales. Necesitas un respaldo y una ruta de restauración específicos para tu modelo.
¿Estos nombres de paquetes funcionan en cualquier Android TV?
No. Proceden de un televisor GHIA fabricado por KTC sobre una plataforma MediaTek. Google TV, Nvidia Shield, Chromecast y las imágenes de otros fabricantes usan componentes distintos. Examina tu propia lista y verifica cada paquete antes de cambiarlo.
¿Cómo restauro el launcher original?
Vuelve a habilitar solo los paquetes que desactivaste durante este experimento y que estaban activos en el respaldo, y restaura el componente Home original con cmd package set-home-activity. La sección de recuperación anterior muestra los comandos para este GHIA/KTC. Desactiva el launcher personalizado únicamente después de confirmar que Inicio funciona con el original.
¿Puedo desactivar com.mediatek.wwtv.tvcenter?
Lo conservé habilitado. En este GHIA/KTC, com.mediatek.wwtv.tvcenter controla la TV en vivo y las entradas HDMI. Trátalo como un componente esencial del fabricante salvo que tengas evidencia específica de tu modelo y una ruta de recuperación probada.
¿Qué es anokiacroptin en Android TV?
En mi televisor el paquete completo es tv.anoki.acr.anokiacroptin, un componente de reconocimiento automático de contenido. Lo desactivé para quitar ese rastreo. El nombre corto por sí solo no identifica una app en otro firmware; examina el paquete completo instalado antes de modificarlo.
¿Debo desactivar com.google.android.tungsten.setupwraith?
No como una limpieza rutinaria. Es la aplicación de configuración de Google. En este televisor ya configurado competía por Inicio después de desactivar el launcher original. Lo desactivé para resolver ese conflicto concreto y registré cómo restaurarlo. Otros equipos pueden necesitarlo para su configuración o recuperación.
¿Dónde están los scripts de debloat de Android TV en GitHub?
Las herramientas de partida están en el repositorio original tv-home en GitHub, incluidos sus scripts de gestión de paquetes. El flujo de restauración desde el respaldo descrito aquí es una adaptación específica de GHIA; no supongas que los scripts originales lo reproducen. Contrasta cada script con tu firmware antes de ejecutarlo.
¿También funciona en Fire TV, Samsung Tizen o LG webOS?
No. Este procedimiento se dirige a dispositivos Android TV y Google TV con acceso ADB autorizado. Fire OS deriva de Android, pero tiene paquetes y políticas diferentes; Tizen y webOS son sistemas operativos completamente distintos.
La lección principal
El launcher terminó siendo más pequeño y tranquilo, pero el resultado más reutilizable fue el proceso: identificar el equipo exacto, capturar su estado inicial, hacer un cambio reversible y comprobar después tanto el resultado visible como el del sistema.
Si quieres reproducir el experimento, comienza con tv-home, lee la documentación de ADB y trata cualquier lista de paquetes como específica de un dispositivo. Los comandos son la parte sencilla; saber qué no debes cambiar es lo que permite recuperar el televisor.
Mi trabajo en desarrollo web
Este experimento es un proyecto personal. Profesionalmente trabajo como desarrollador Shopify y Liquid en México y construyo sitios WordPress y plugins WooCommerce a medida. Mis casos de estudio de desarrollo web documentan los proyectos de clientes, lo que construí y cómo lo probé.
Cargando visitas de la entrada…
Las visitas de la entrada no están disponibles por ahora.