20 votos

Sistema Android Webview instalado pero no usado por aplicaciones

Descargué e instalé la última versión de android system WebView desde la tienda de aplicaciones en mi tableta Android (con sistema operativo 5.0.2).

Pero las aplicaciones siguen utilizando la versión antigua de WebView (39.0.0.0).

¿Cómo puedo hacer que cambien?

Para información, he intentado desactivar la versión antigua, pero se vuelve a activar cuando abro una aplicación que utiliza WebView.

2 votos

Por curiosidad, ¿cómo sabes qué versión de Webview está utilizando una aplicación?

1 votos

He estado probando con varias aplicaciones, como Droidscript y WebView Browser y visité whatsmyuseragent

0 votos

He revisado el código fuente de Lollipop y esto no debería estar ocurriendo. Debería usar la última versión a menos que el fabricante haya reemplazado la clase WebViewFactory con la suya propia. ¿Qué dispositivo/modelo exacto y versión suministrada por el fabricante estás utilizando?

21voto

David Negron Puntos 971

No puedes cambiar esto sin ser root.

El marco del sistema está codificado para utilizar un paquete específico para las aplicaciones que solicitan un componente WebView. De forma predeterminada (en AOSP) utiliza el valor com.android.webview, que es la versión que se compila durante el proceso de compilación de AOSP. En dispositivos de fabricantes que modifican este componente, el nombre del paquete puede ser diferente. Sin embargo, para reemplazar el WebView que viene con tu dispositivo, debes modificar este valor para que en su lugar sea com.google.android.webview.

La forma "manual" de hacer esto sería extraer el archivo framework-res.apk de tu dispositivo, descompilarlo y cambiar el valor de la variable de recurso config_webViewPackageName. Debería estar ubicado en /res/values/strings.xml dentro del .apk. Una vez hecho esto, necesitarías volver a empaquetar todo y enviar el nuevo .apk a tu dispositivo, reemplazando el anterior.

Un método alternativo que puedes intentar es instalar el marco Xposed y luego usar el módulo WebViewGoogle. Si usas una ROM personalizada, es posible que también puedas encontrar un paquete que modifique permanentemente los componentes de framework necesarios (o que esté construido para usar el WebView de Google de forma predeterminada).

Mi hipótesis sería que esta restricción existe en parte porque el sistema depende de que exista una implementación de WebView de alguna forma, por lo que si un usuario pudiera modificarla, podría afectar al sistema de formas extrañas. También habría implicaciones de seguridad al permitir que las aplicaciones anulen el WebView del sistema, como un actor malintencionado que intenta proporcionar uno malicioso sin que el usuario lo sepa.

Como punto de explicación adicional: la razón por la que el WebView del Sistema está disponible en la Play Store es que los dispositivos Nexus (y posiblemente otros) vienen con él preinstalado y configurado para su uso. Es, en efecto, el WebView del sistema para esos dispositivos. Por lo tanto, Google puede proporcionar actualizaciones de WebView para estos dispositivos a través de la Play Store para que no sea necesario realizar actualizaciones completas del sistema solo para actualizar el navegador/WebView. Hay otros componentes que Google ha migrado a la Play Store para actualizar de manera similar, con la razón básicamente siendo que es más rápido. Phone and Contacts fueron dos de los más recientes, y el artículo enlazado proporciona algunos detalles adicionales sobre por qué Google ha tomado este enfoque.

1 votos

Gracias por esta explicación.. pero, ¿cuál es el uso de esta aplicación Android System WebView entonces?

1 votos

@Clémentine Los dispositivos Nexus (posiblemente otros) vienen con él preinstalado y configurado para usarlo. Es, en efecto, el WebView del sistema para esos dispositivos. Por lo tanto, Google puede proporcionar actualizaciones de WebView para estos dispositivos a través de Google Play Store para que no sea necesario realizar OTAs completos solo para actualizar el navegador/WebView. Hay otros componentes que Google ha migrado a actualizaciones de Google Play Store de manera similar, con el razonamiento básicamente siendo que es más rápido.

1 votos

¿Por qué todas las tabletas con sistema operativo Lollipop o más reciente no utilizan esto como su WebView del sistema por defecto? ¡Suena como un desperdicio!

3voto

Nelson Yeung Puntos 16

He seguido la respuesta de @eldarerathis y he creado una guía paso a paso sobre cómo actualizar webview en un emulador Android 5.0. Probablemente funcione en Android 5.1 a Android 6.0 también. Espero que ayude a cualquier persona que desee utilizar un webview más reciente en dispositivos Android antiguos.

https://gist.github.com/ppoffice/9ce9790708eeabbec1281467e25139e4

Herramientas

  1. emulador (30.3.5) (a través de Android SDK)
  2. adb (30.0.5) (a través de Android SDK)
  3. apktool (2.5.0) y Java runtime
  4. zip (3.0)
  5. unzip (6.0)

Asegúrate de tener las variables de entorno JAVA_HOME y ANDROID_HOME configuradas correctamente.

Pasos

  1. Crea un nuevo Dispositivo Virtual Android (AVD) utilizando Android Studio o avdmanager. Aquí, creé un dispositivo Android 5.0 con la siguiente imagen del sistema:

    Ruta                                        | Versión | Descripción                                | Ubicación
    system-images;android-21;google_apis;x86_64 | 32      | Imagen del sistema Google APIs Intel x86 Atom_64 | system-images/android-21/google_apis/x86_64/

    El nombre del AVD es

    $ emulator -list-avds
    Pixel_2_API_21
  2. Inicia el AVD y haz que su partición del sistema sea escribible:

    $ $ANDROID_HOME/tools/emulator @Pixel_2_API_21 -writable-system

    Y cuando el AVD se inicia, vuelve a montar su partición del sistema usando adb:

    $ $ANDROID_HOME/platform-tools/adb remount
  3. Descarga el Android System Webview de la versión deseada de internet. Por ejemplo, puedes usar Android System WebView 88.0.4324.93 (x86 + x86_64) (Android 5.0+) de apkmirror.com. La identificación del paquete es com.google.android.webview, que es diferente al webview del sistema por defecto (com.android.webview). Además, asegúrate de que tu paquete tenga la misma ABI que tu AVD.

  4. Extrae el paquete webview usando unzip y empújalo junto con las bibliotecas nativas a la partición del sistema de tu AVD:

    $ unzip 
    $ $ANDROID_HOME/platform-tools/adb shell mkdir /system/app/ChromiumWebview
    $ $ANDROID_HOME/platform-tools/adb push  /system/app/ChromiumWebview/webview.apk
    $ $ANDROID_HOME/platform-tools/adb push  /system/app/ChromiumWebview/

    Después de este paso, deberías tener los siguientes archivos nuevos en tu AVD:

    $ANDROID_HOME/platform-tools/adb shell ls -lR /system/app/ChromiumWebview/lib                                                             
    
    /system/app/ChromiumWebview/lib:
    drwxr-xr-x root     root              2021-01-27 00:36 x86
    drwxr-xr-x root     root              2021-01-27 00:36 x86_64
    
    /system/app/ChromiumWebview/lib/x86:
    -rw-r--r-- root     root        43360 1979-12-31 00:00 libchromium_android_linker.so
    -rw-r--r-- root     root         3680 1979-12-31 00:00 libcrashpad_handler_trampoline.so
    -rw-r--r-- root     root     78167008 1979-12-31 00:00 libwebviewchromium.so
    
    /system/app/ChromiumWebview/lib/x86_64:
    -rw-r--r-- root     root        44896 1979-12-31 00:00 libchromium_android_linker.so
    -rw-r--r-- root     root         5104 1979-12-31 00:00 libcrashpad_handler_trampoline.so
    -rw-r--r-- root     root     78545528 1979-12-31 00:00 libwebviewchromium.so
  5. Reinicia los servicios de Android para que el Administrador de Paquetes tome nuestro nuevo paquete webview:

    $ $ANDROID_HOME/platform-tools/adb shell stop
    $ $ANDROID_HOME/platform-tools/adb shell start
    $ $ANDROID_HOME/platform-tools/adb shell pm list packages | grep webview
    package:com.android.webview           --> el webview integrado y obsoleto
    package:com.google.android.webview    --> nuestro nuevo webview
  6. Verifica si el paquete está registrado con el Administrador de Paquetes. Asegúrate de que codePath, nativeLibraryPath y primaryCpuAbi sean correctos:

    $ $ANDROID_HOME/platform-tools/adb shell cat /data/system/packages.xml | grep com.google.android.webview
    https://android.stackexchange.com/a/139415),
    el nombre del paquete webview por defecto utilizado por el SO Android está codificado en el sistema,
    necesitas modificar el framework de Android para usar el nuevo nombre del paquete.
    Primero, extrae framework-res.apk de tu AVD y descompílalo usando apktool:
    $ $ANDROID_HOME/platform-tools/adb pull /system/framework/framework-res.apk
    $ apktool d framework-res.apk

`* Actualiza el archivo/res/values/strings.xml` para usar tu nuevo nombre del paquete webview del sistema:

    --- res/values/strings.xml   2021-01-27 00:53:05.000000000 -0500
    +++ res/values/strings.xml   2021-01-27 00:54:38.000000000 -0500
    @@ -70,7 +70,7 @@
         ;com.android.settings;

    -    com.android.webview
    +    com.google.android.webview
         0.82
         0.85
         0.16
  • Empaqueta de nuevo framework-res.apk usando apktool.

    $ apktool b 

    Puede que haya algunos errores que necesites corregir antes de que el paquete pueda ser empaquetado de nuevo. Por ejemplo, si te encuentras con el siguiente error:

    Error: String types not allowed (at 'APKTOOL_DUMMY_34e' with value '').

    deberías reemplazar con en el archivo /res/values-nodpi-v4/drawables.xml y volver a intentarlo.

  • El framework-res.apk empaquetado de nuevo se coloca en /dist. Extrae el archivo resources.arsc de allí y combínalo con el framework-res.apk original:

    $ unzip /dist/framework-res.apk resources.arsc -d .
    $ zip -0  resources.arsc

    El framework-res.apk original que extrajiste de tu AVD ahora está actualizado.

  • Después, reemplaza el framework-res.apk en tu AVD con nuestro framework-res.apk actualizado (fusionado) del último paso y reinicia el dispositivo:

    $ $ANDROID_HOME/platform-tools/adb push  /system/framework/framework-res.apk
    $ $ANDROID_HOME/platform-tools/adb reboot
  • Finalmente, verifica si el webview se ha cambiado al nuevo: ``

0 votos

Bien, esto explica por qué siempre es más fácil usar la Tienda para actualizar el Webview... lástima que el emulador prohíba el uso de la Play Store.

1voto

Xetius Puntos 10445

Qué WebView se utiliza depende principalmente del desarrollador de la aplicación.

La larga explicación está disponible en Migrating to WebView in Android 4.4. También hay una explicación decente en AndroidPolice.com - WebView Is Now Unbundled From Android And Free To Auto-Update From Google Play.

Explicación

La versión corta es que desde Android 4.4, el WebView puede actualizarse a través de la Play Store fuera del ciclo de lanzamiento de Android. Sin embargo, la versión antigua integrada se mantiene para soportar aplicaciones más antiguas y no romper la compatibilidad.

El desarrollador de la aplicación debe dirigirse al SDK 19 (Android 4.4) o más reciente, y utilizar WebView.class proporcionado por el SDK estándar. Si el desarrollador hace eso, y el dispositivo que ejecuta la aplicación es 4.4 o más reciente, la versión de APK (Google Play) del WebView debería utilizarse y se actualizará automáticamente con la versión de la Play Store.

Pero si alguna de las condiciones anteriores no se cumple, o el fabricante modificó los archivos principales, o el desarrollador utiliza una librería de soporte, es posible que todavía se utilice la versión más antigua integrada del WebView en su lugar.

Cómo resolverlo

Para que Clémentine resuelva su problema particular, ponerse en contacto con el soporte de la aplicación en cuestión y solicitar que actualicen su aplicación para admitir el WebView basado en Chromium más reciente (configurando su SDK objetivo en 19 o superior) es la forma más fácil de solucionar el problema. Aunque depende del desarrollador de la aplicación, lo cual sabemos que no siempre funciona. (Yo soy uno de esos desarrolladores de aplicaciones. Intentamos, pero no siempre tenemos el tiempo para mantener todas nuestras aplicaciones constantemente actualizadas.)

0voto

sheepdog Puntos 106

Continuando con la respuesta anterior. Para android 7 y superior: extrae el archivo framework-res.apk de tu dispositivo, descompílalo y cambia el archivo /res/xml/config_webview_packages.xml, agregando un nuevo proveedor de webview.

Ejemplo config_webview_packages.xml:

        MIIDuzCCAqOgAwIBAgIJANi6DgBQG4ZTMA0GCSqGSIb3DQEBBQUAMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKDAtHb29nbGU ... 

Sobre la firma. Si webviewprovider.apk tiene la firma del sistema puedes omitir este atributo. Si la firma no es correcta, el proveedor de webview no aparecerá en la lista disponible a través de la configuración de desarrollo del dispositivo. No cambies la firma original de webviewProvider.apk, no podrás instalar actualizaciones.

Coloca framework-res.apk en el dispositivo (necesitas permisos de root).

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X