Files
PixelIMS/README.md
T

109 lines
7.7 KiB
Markdown

# PixelIMS — VoLTE para Pixel con operadores no certificados
Fork de [vvb2060/Pixel IMS](https://github.com/vvb2060/Ims) (motor de bypass v3.1) con interfaz de [TurboIMS](https://github.com/Turbo1123/TurboIMS), **compilado, corregido y verificado en un Pixel 6 con la red de Altán Redes (MVNO NeWWW, México)**.
Habilita VoLTE, VoWiFi, 5G NR, VoNR, video llamadas, cross-SIM y servicios UT en Google Pixel (Tensor) cuando el operador no está en la lista certificada de Google — **sin root** (vía Shizuku).
## Estado verificado
- ✅ Compila desde fuente (ver [Construir desde fuente](#construir-desde-fuente))
- ✅ Instala y aplica la configuración en un **Pixel 6 (oriole) con Android 16, parche 2026-04-05**
- ✅ **VoLTE activo y funcionando** con NeWWW (Red Altán, MCC/MNC 334-140)
- ⚠️ Tras cada reinicio hay que re-aplicar (ver [Comportamiento tras reinicio](#comportamiento-tras-reinicio))
## Requisitos
- Google Pixel 6 o posterior (chip Tensor)
- Android 12+ (`minSdk 31`)
- [Shizuku](https://play.google.com/store/apps/details?id=moe.shizuku.privileged.api) 13.1.5+ (Play Store, gratis)
- Sin root, sin PC obligatorio (solo para la instalación inicial por adb o para arrancar Shizuku por cable)
## Instalación
1. **Instalar el APK** (ya compilado en `dist/PixelIMS-1.0.apk`):
```bash
adb install dist/PixelIMS-1.0.apk
```
2. **Instalar Shizuku** desde Play Store y arrancarlo:
- Sin PC: Developer options → *Depuración inalámbrica* → pairing desde Shizuku, o
- Por cable: `adb shell sh /sdcard/Android/data/moe.shizuku.privileged.api/start.sh`
3. **Abrir PixelIMS** → conceder permiso de Shizuku → esperar "✅ Ready".
4. **Pulsar "Apply to All SIMs"** → esperar el diálogo de éxito.
5. **Activar el toggle**: Ajustes → Red e internet → SIMs → NeWWW → **Llamadas 4G (VoLTE)** → ON.
6. **Verificar**: `*#*#4636#*#*` → ⋮ → Estado del servicio IMS → "Voice over LTE: Available".
> Nota: la app hace visibles y editables los toggles de VoLTE/VoWiFi en los ajustes del SIM, pero **no los enciende por sí sola** — el paso 5 es manual (y solo una vez).
## Comportamiento tras reinicio
- La app **se auto-aplica sola** cada vez que Shizuku entrega su binder (no hay que pulsar Apply de nuevo); los toggles quedan guardados.
- Pero **Shizuku no sobrevive al reinicio** sin root: la depuración inalámbrica se apaga. Rutina por reinicio (2 toques): activar depuración inalámbrica → abrir Shizuku y Start. La app hace el resto automáticamente.
- Si el dispositivo reporta "Persistent: Yes" en la app, la config sobrevive reinicios por sí sola (en builds recientes de Android 15/16 normalmente reporta "No").
- **100% automático solo con root (Magisk)**: Shizuku arranca por root al boot y la app se auto-aplica. Costo: desbloquear bootloader (borra datos), Play Integrity, OTA manuales.
## Construir desde fuente
El código original **no compila tal cual**: usa ~30 APIs ocultas de Android (`CarrierConfigManager.overrideConfig`, `IActivityManager`, `ITelephony`, `PermissionManager`, etc.) que no existen en el `android.jar` público. Tampoco el upstream (vvb2060/Ims v3.1) compila desde un clon limpio — requiere un `android.jar` completo no versionado en el repo.
### Correcciones aplicadas a este fork
1. `settings.gradle.kts` — eliminado el `versionCatalogs { create("libs") }` duplicado (Gradle auto-importa `gradle/libs.versions.toml` como `libs`).
2. `gradle.properties` — `android.useAndroidX=true` (Shizuku 13.1.5 arrastra `androidx.annotation` transitiva).
3. `MainActivity.java` — `Shizuku.onRequestPermissionsResult()` no existe en Shizuku 13.1.5; reemplazado por `addRequestPermissionResultListener` / `removeRequestPermissionResultListener`.
4. **APIs ocultas** — config migrada a AGP 9.2.0 (plugin `com.android.settings`, DSL en `settings.gradle.kts`) con `compileSdk = release(37)`, y un SDK local cuyo `android.jar` se reemplaza por el **framework completo de Robolectric** (`org.robolectric:android-all:17-robolectric-15733970`, SHA-256 `f6a41ad548bb45cccd3b1d4774cb50d57826dd319b6e5accd6b6269876e12d71`), que sí incluye las clases y métodos ocultos.
### Pasos reproducibles
```bash
# 1. Prerrequisitos: JDK 17+ y Gradle 9.4.1
# https://services.gradle.org/distributions/gradle-9.4.1-bin.zip
# 2. SDK Android (platform-tools, platform android-37.0, build-tools 37.0.0, licencias aceptadas)
# 3. Crear un SDK local con el android.jar completo:
mkdir -p local-sdk/platforms local-sdk/build-tools
cp -r $ANDROID_HOME/platforms/android-37.0 local-sdk/platforms/
curl -o android-all-37.jar \
https://repo1.maven.org/maven2/org/robolectric/android-all/17-robolectric-15733970/android-all-17-robolectric-15733970.jar
cp android-all-37.jar local-sdk/platforms/android-37.0/android.jar # ← reemplazo clave
ln -s $ANDROID_HOME/build-tools/37.0.0 local-sdk/build-tools/37.0.0
ln -s $ANDROID_HOME/licenses local-sdk/licenses
# y ajustar sdk.dir en local.properties
# 4. Compilar:
gradle assembleRelease
# APK en app/build/outputs/apk/release/app-release.apk (firmado con debug key)
```
¿Por qué un SDK local? `javac` prioriza el `android.jar` del SDK sobre cualquier jar del classpath, así que un módulo de stubs no puede añadir métodos ocultos a clases existentes — la única vía es sustituir el propio `android.jar` por uno completo (el de Robolectric contiene TODO el framework).
## Diagnóstico VoLTE en Pixel 6 + NeWWW (Altán 334-140)
El detalle completo de la investigación con evidencia de logcat/dumpsys está en **[docs/diagnostico-volte-newww.md](docs/diagnostico-volte-newww.md)**. Resumen de la cadena:
1. La config de operador se aplica con `persistent=true` y el aprovisionamiento IMS queda `PROVISIONING_VALUE_ENABLED`.
2. El APN `ims` ya viene provisionado en la SIM de NeWWW.
3. La red concede voz sobre LTE: `availableServices=[VOICE,SMS,VIDEO]`, `mVoiceRegState=IN_SERVICE`.
4. El toggle "Llamadas 4G" aparece en Ajustes → SIMs tras aplicar la config — hay que encenderlo.
5. El ImsService del módem Shannon (`com.shannon.imsservice`) corre con normalidad.
## VozApp (plan B oficial de Altán)
- **`com.altanredes.altanvoip`** — la app de llamadas VoIP del propio operador (Altán Redes) para equipos sin VoLTE nativo. **No está en Play Store**; se distribuye por los centros de ayuda de los MVNOs (BAIT, VIVA MX) y espejos de APK.
- Espejo verificado en esta investigación: APKCombo, `VozApp_2.1.0.apk`, SHA-256 `75dd0dde4f6184568ea2337c5cf397c6a1b0e28a65bf555588f401cdc4af24ed`, firmada por **Neusoft Mobile Solutions Oy** (plataforma "Silta").
- ⚠️ **Crash conocido en Android 16**: `ForegroundServiceStartNotAllowedException` en `com.unikie.vm.application.engine.services.AppStatusService` al arrancar un servicio en foreground desde segundo plano. Es un bug de la app (plataforma Unikie), no del teléfono.
- Con VoLTE nativo funcionando (el objetivo de este proyecto), VozApp queda solo como respaldo.
## Créditos y licencia
- [vvb2060/Ims](https://github.com/vvb2060/Ims) — motor de bypass v3.1 (Instrumentation trick, `canPersistent()`, `showVoLTE()`)
- [Turbo1123/TurboIMS](https://github.com/Turbo1123/TurboIMS) — UI, toggles por feature y por SIM
- [VinujaHerath/PixelIMS](https://github.com/VinujaHerath/PixelIMS) — fork base de este repo
- [RikkaApps/Shizuku](https://github.com/RikkaApps/Shizuku) y [LSPosed/LSPass](https://github.com/LSPosed/LSPass)
El repositorio original no declara licencia. Este proyecto reutiliza ese código con fines de interoperabilidad personal; úsalo bajo tu propio riesgo.
## Aviso
Esta app sobrescribe la configuración del operador a nivel de framework (no toca particiones; se revierte desinstalando). Técnicamente contradice las políticas del operador. Los autores no se hacen responsables del uso que se le dé.