# 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é.