“Pero es imposible correr apps sin los servicios de Google” — la mentira más repetida del Android. Esto es exactamente lo que hice, pieza por pieza, en un Moto G4 (Android 7.0, root con Magisk). Verificado con reboots, no teoría.


TL;DR en 30 segundos

Pieza Qué es
Magisk module “microg-hide-gms” Borra systemless la Play Store, Google Play Services, Google Framework y toda la basura Google del /system — sin tocar la partición real
microG Probado y descartado: sin firma de Google real, las apps lo bloquean peor que a nada (WhatsApp y DeepSeek) — ver Fase 4. El que queda es FakeStore
FakeStore Un muñeco de 717KB con nombre com.android.vending que solo responde verificaciones de licencias. No es la Play Store. No tiene tienda. No actualiza nada.
Aurora Store Cliente anónimo de la Play Store (sin cuenta Google) — de ahí salen las apps
F-Droid + APKs manuales Apps open-source y directos de GitHub

Resultado verificado tras reboots:

$ pm list packages | grep -E 'vending|gms|gsf'
package:com.android.vending        # SOLO FakeStore (717KB — no hay tienda)
package:com.motorola.pgmsystem2    # Motorola, coincide el nombre, no es Google
# Play Store, GMS y GSF: NO EXISTEN como paquete
$ pm list packages | grep dimowner
package:com.dimowner.audiorecorder   # pero las apps sí funcionan

El problema original

Un Moto G4 con Android 7.0 (2016) que:

  1. La Play Store se auto-actualizaba sola y dejaba de funcionar (Google abandonó el soporte para Android 7 hace años — las versiones nuevas de GMS crashean en loop).
  2. GMS comía batería en segundo plano con su crash-loop: “Servicios de Google Play continúa fallando” cada 2 minutos.
  3. El teléfono estaba lleno de apps Google que no se pueden deshabilitar (pm disable dura hasta que Google vuelve a activarlas).
  4. “Fabric data reset” no sirve de nada: al arrancar, Play Store se auto-reinstala y se auto-actualiza en minutos. Circle of death.

La solución real no era limpiar el teléfono. Era cortarle el cordón umbilical a Google.


Fase 1: La base (ya existente)

  • Root con Magisk (vía MagiskHide/zygisk no importa aquí — lo que importa es que su funciona).
  • ADB permanente por WiFi en el puerto 5555 (configurado a nivel de propiedad del sistema, sobrevive reboots):
    adb connect 192.168.0.65:5555
    
  • Backup previo en /mnt/linux2/backup-moto-g4/ (sdcard completo + listas de apps y módulos).

Fase 2: El reset — pero de verdad este vez

Reset de fábrica normal (Settings → Backup & reset). Pero el reset borra todo: la app de Magisk, el ADB WiFi, todo.

Fase 2.5: EL PASO 1 — resucitar el control raíz (Magisk + Termux)

Verificado con escaneo de puertos (nmap -p- 192.168.0.65): el celular estaba en la red con cero puertos abiertos. Un ladrillo elegante. Sin cable USB a mano, la única salida era 100% desde el celular:

  1. En el navegador del celular, bajá e instalá el Magisk Manager: https://topjohnwu.github.io/Magisk/ (permite “fuentes desconocidas” cuando lo pida). La clave: el root no murió con el reset — el binario de Magisk vive en la boot image; solo desapareció la app que aprueba los pedidos su. Instalás la app y el sistema vuelve a poder preguntar “¿otorgar root?”.

  2. Bajá Termux desde F-Droid (el de Play Store está muerto): https://f-droid.org/packages/com.termux/

    Truco real usado: como el celular no llegaba bien a GitHub/F-Droid, los APKs se sirvieron desde el PC en la misma red con python3 -m http.server 8888 --directory /tmp/opencode/apks y desde el navegador del celular se abrió http://<IP-del-PC>:8888/ — HTTP plano, cero JS, el navegador de 2016 lo traga entero.

  3. Abrí Termux y ejecutá:

    pkg install android-tools
    su
    setprop service.adb.tcp.port 5555
    stop adbd
    start adbd
    
  4. Cuando Termux lo pida, otorgá el permiso root desde Magisk Manager.

  5. Desde el PC: adb connect 192.168.0.65:5555 — control total recuperado. De ahí en adelante lo hice todo yo por WiFi.

setprop service.adb.tcp.port 5555 + reiniciar adbd = ADB por WiFi sin cable, sin Developer options, sin nada más que root. Después quedó permanente (persist.adb.tcp.port=5555, sobrevive reboots — verificado).

Y rápido, antes de que la Play Store de fábrica se auto-actualice de nuevo (el ciclo empezó desde cero con el reset), vino lo importante:

Fase 3: El asesino — módulo Magisk systemless

Por qué NO sirve pm disable:

Investigado en XDA/Reddit: los servicios de Google reactivan sus apps hermanas automáticamente. Gmail deshabilitado → GMS lo re-habilita al rato. Es un sistema inmune.

Por qué NO se puede borrar de /system:

/system es read-only (eCryptfs en Android 7). Borrar de verdad requiere remontar rw = perder OTA = riesgo de brick.

Lo que sí funciona: whiteouts de Magisk. El módulo crea archivos vacíos .replace que Magisk “monta por encima” del sistema real. El sistema ve directorios vacíos — la app no existe, pero /system intacto y el cambio es 100% reversible (borrar el módulo = Google vuelve).

/data/adb/modules/microg-hide-gms/
├── system/priv-app/GmsCore/.replace          # Google Play Services
├── system/priv-app/Phonesky/.replace         # ← LA PLAY STORE
├── system/priv-app/GoogleServicesFramework/.replace  # GSF
├── system/app/Music2/.replace                # Play Música
├── system/app/Hangouts/.replace
├── system/app/Videos/.replace                # Play Películas
├── system/app/Gmail2/.replace
└── system/app/CalendarGoogle/.replace        # Calendario Google

Instalado, reboot, y verificado:

$ pm list packages | grep -E 'vending|gms|music|talk|videos|gmail'
package:com.motorola.pgmsystem2   # coincide 'gms', es Motorola
(solo eso y TalkBack AOSP, que después salió en la limpieza final — cero GMS/Play)

Play Store desaparecida para siempre. Sin paquete = sin auto-updates = sin la causa raíz del lag.

Truco extra: el registro fantasma

Al instalar microG apareció:

INSTALL_FAILED_UPDATE_INCOMPATIBLE:
Package com.google.android.gms signatures do not match the previously installed version

El package manager recuerda la firma de Google aunque el APK ya no exista. Solución: cirugía directa en /data/system/packages.xml (con backup + validación XML):

# eliminar los bloques <package> y <updated-package> de com.google.android.gms
pat = re.compile(r'<package name="com\.google\.android\.gms"[^>]*>.*?</package>', re.S)
xml_nuevo = pat.sub('', xml_viejo)
ET.fromstring(xml_nuevo)  # validar que el XML no quedó roto

Push de vuelta, chown system:system; chmod 660, reboot. Registro limpio.

(Lo mismo para GSF — com.google.android.gsf era dueño de permisos GOOGLE_AUTH.* que microG necesita declarar → INSTALL_FAILED_DUPLICATE_PERMISSION. Mismo tratamiento: whiteout + reboot.)

Fase 4: microG — la idea perfecta que no sobrevivió al check de firma

microG es el reemplazo open-source de Google Play Services: check-in de dispositivo, framework de auth, API GmsCore, cero auto-updates, cero drain de batería. Suena perfecto. Lo instalé (v0.3.17 — la última release, verificada)… y apareció la trampa:

W GooglePlayServicesUtil: com.deepseek.chat requires Google Play services, but their signature is invalid.
W PlayServicesImpl: Connection result: SERVICE_INVALID

Las apps no preguntan “¿existe Google Play Services?” — preguntan "¿está firmado por Google?". microG viene firmado por la llave de microG, así que la respuesta es SERVICE_INVALID, y ahí cada app reacciona peor que si no hubiera nada:

App Con microG (firma inválida) Sin microG (servicios ausentes)
WhatsApp ❌ Bloqueo duro: “WhatsApp no se ejecuta sin los servicios de Google Play” ✅ Modo Huawei: ofrece omitir la copia de Google Drive y sigue — 80 contactos cargados, verificado
DeepSeek ❌ Botón “Continue with Google” → “login failed” ✅ Login directo con correo y contraseña — verificado

Paradoja: microG empeoraba las cosas. Sin él, las apps ven SERVICE_MISSING (tolerable — así corren los Huawei sin Play Store); con él, ven SERVICE_INVALID (bloqueo). Al día siguiente del install ya estaba desinstalado:

$ pm uninstall com.google.android.gms
Success

Queda FakeStore como único acompañante: a las apps solo les importa que com.android.vending responda el servicio de licencias, y eso no depende de la firma de Google (Fase 5).

Si algún día una app exige firma de Google de verdad, la solución conocida es signature spoofing (Xposed + FakeSignature, o ROMs como LOS4microG). En un ROM stock sin eso: menos es más.

Fase 5: FakeStore — el doble que engaña a las apps

Muchas apps (DeepSeek incluida) exigen encontrar com.android.vending instalado — no para comprar nada, sino porque llaman al servicio de licencias (ILicensingService) al arrancar. Sin eso:

“Something went wrong. Check that Google Play is enabled on your device…”

La solución de microG: FakeStore — un APK de 717KB que:

  • ✅ Se llama com.android.vending (las apps lo encuentran)
  • ✅ Implementa el servicio de licencias (responde “licencia OK”)
  • ❌ NO tiene tienda. NO descarga. NO actualiza. NO notifica. NO se auto-actualiza.

Es un muñeco con credenciales falsas, no la Play Store. Google ni se entera.

El misterio del permiso que no se concedía

Tras instalar FakeStore, DeepSeek seguía fallando. El logcat mostraba:

W ActivityManager: Permission Denial: Accessing service
ComponentInfo{com.android.vending/...LicensingService}
requires com.android.vending.CHECK_LICENSE

Análisis:

  1. FakeStore declara el permiso CHECK_LICENSE con protectionLevel=normal (auto-concedible) ✓
  2. DeepSeek lo pidió en su manifiesto ✓
  3. Pero no lo tenía concedido — porque se instaló antes de que el permiso existiera, y Android 7 no recalcula permisos normales pedidos en el limbo, ni siquiera al reiniciar.
  4. pm grant no sirve: “Permission is not a changeable permission type” (los normales no son runtime-grantables).

Solución: reinstalar DeepSeek. En una instalación en frío, el pass de concesión corre con el permiso ya definido → granted=true:

com.android.vending.CHECK_LICENSE: granted=true
$ am start -n com.deepseek.chat/.MainActivity
# PANTALLA: com.deepseek.chat.MainActivity
# "Continue with Google | Continue with Password | Sign up"  ← LOGIN REAL

DeepSeek funcionando con FakeStore. El “Something went wrong” era solo eso: un permiso.

Fase 6: ¿De dónde salen las apps sin Play Store?

App Origen
WhatsApp, Telegram, MercadoPago Aurora Store — cliente anónimo de la Play Store. Usa tokens de cuenta descartables de Google, sin registrar tu dispositivo, sin cuenta propia. Misma APK que la Play, cero intermediario tuyo
DeepSeek Aurora Store (APKs split armeabi_v7a — el G4 es 32-bit)
SimplyTranslate, Jellyfin, PipePipe, LibreraPDF, K-9 F-Droid (índice local, verifico minSdk antes de bajar — Android 7 = API 24)
Audio Recorder (botón rojo, M4A) GitHub Releases directo (Dimowner v0.9.99 = última con minSdk 23)
FakeStore GitHub microg/GmsCore releases (microG v0.3.17 probado y descartado — ver Fase 4)

El teléfono actualiza apps cuando TÚ quieres, con un toque en Aurora/F-Droid. Nunca solo. Nunca de noche. Nunca “porque Google decidió”.

Fase 7: Los detallitos que no se ven

  • ADB WiFi permanente (persist.adb.tcp.port=5555): sobrevive reboots, no necesito cables.
  • Home screen automatizado: los iconos no se pueden clonar con broadcasts en el launcher de Google; hice drag sintético vía sendevent en /dev/input/event2 (long-press 0.8s → 10 micro-movimientos → release). 12 iconos colocados en la cuadrícula exacta.
  • Wallpaper: el crop de Google crashea sin GMS → escritura directa del archivo /data/system/users/0/wallpaper + ajuste de wallpaper_info.xml + reboot. Dark cyberpunk activo y verificado por md5.
  • App de bloqueo: “Lock” (F-Droid) activada como device admin vía dpm set-active-admin sin tocar Settings. Probada: mWakefulness=Dozing ✓.

Estado final verificado (post-reboot)

QUITADO para siempre:     Play Store, GMS, GSF, Google Login Service,
                          Play Música, Play Películas, Hangouts, Gmail,
                          Calendario Google (whiteouts, verificados post-reboot)
LIMPIEZA FINAL:           16 apps Google muertas sin GMS: YouTube, Drive,
                          Maps, Fotos, Cloud Print, backup/sync de Google,
                          TalkBack, TTS, 5 teclados y launcher duplicado
QUEDA:                    FakeStore (solo licencias) + infraestructura AOSP
                          (webview, teclado activo, reloj, calculadora) y
                          GEL como launcher — el último Google con pie en casa
APPS INSTALADAS:          WhatsApp, Telegram, DeepSeek, MercadoPago, Aurora,
                          SimplyTranslate, Jellyfin, PipePipe, LibreraPDF,
                          K-9 Mail, Grabador de Audio, Lock
HOME SCREEN:              12 iconos + widget, todo en su celda
WALLPAPER:                dark cyberpunk 1080×1920 (root-written, md5 idéntico post-reboot)

El teléfono más lento de 2016 con el sistema más limpio que puede tener en 2026. Google lo pierde, tú lo ganas.


Actualizado: los dos casos temidos llegaron de verdad y se resolvieron. WhatsApp exigía firma de Google y bloqueaba con microG instalado — quitándolo, corre en modo “sin Google Play” (80 contactos verificados). DeepSeek exige la licencia de Play → FakeStore la responde; su login se hace con correo y contraseña, sin Google de por medio. Sigue en pie un solo pendiente gordo: si alguna app exige firma de Google real (error SERVICE_INVALID), toca signature spoofing (Xposed FakeSignature en Android 7) o directamente no usar esa app. Y el último paso de des-Googling posible: reemplazar el launcher GEL por uno de F-Droid para poder matar también googlequicksearchbox.