Sistema Android Webview instalado pero no utilizado por aplicaciones

Descargué e instalé la última versión del sistema Android WebView de la tienda de aplicaciones en mi tableta Android (ejecutando 5.0.2).

Pero las aplicaciones siguen usando la versión anterior de webview (39.0.0.0).

¿Cómo puedo hacer que cambien?

Para obtener información, he intentado deshabilitar el anterior y se vuelve a habilitar cuando abro una aplicación que usa webview.

Por curiosidad, ¿cómo sabes qué versión de Webview está usando una aplicación?
He estado probando con varias aplicaciones, como Droidscript y WebView Browser y visité whatsmyuseragent
He leído la fuente de Lollipop y esto no debería estar sucediendo. Debe usar la última a menos que el fabricante haya reemplazado la clase WebViewFactory con la suya propia. ¿Qué dispositivo/modelo exacto y qué versión proporcionada por el fabricante está utilizando?
Hola Musafa, ¿por qué borraste tu respuesta?
Estoy usando tabletas de bajo costo, y probé en varias marcas (digiflip de flipkart, time2), voy a probar en la lenovo TAB 2 A7 en los próximos días

Respuestas (3)

No puedes cambiar esto sin root.

El marco del sistema está codificado para usar un paquete específico para 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 diferir. Independientemente, para reemplazar el WebView que se envió con su dispositivo, debe modificar este valor para que sea com.google.android.webview.

La forma "a mano" de hacer esto sería extraer el archivo framework-res.apk de su dispositivo, descompilarlo y cambiar el valor de la config_webViewPackageNamevariable de recurso. Debe estar ubicado /res/values/strings.xmldentro del .apk. Una vez que haya hecho esto, deberá volver a empaquetar todo y enviar el nuevo .apk a su dispositivo, reemplazando el anterior.

Un método alternativo que puede intentar es instalar el marco Xposed y luego usar el módulo WebViewGoogle . Si usa una ROM personalizada, también puede encontrar un paquete que modificará permanentemente los componentes necesarios del marco (o puede estar diseñado para usar WebView de Google de forma predeterminada).

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

Como punto de explicación adicional: la razón por la que System WebView está disponible en Play Store para comenzar es que los dispositivos Nexus (y posiblemente otros) se envían 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 Play Store, de modo que las OTA del sistema completo no son necesarias solo para actualizar el navegador/WebView. Hay otros componentes que Google ha migrado a Play Store actualizando de manera similar, con el razonamiento esencial de que es más rápido. Teléfono y Contactos fueron dos de los más recientes, y el artículo vinculado proporciona algunos detalles adicionales sobre por qué Google ha adoptado este enfoque.

Gracias por esta explicación ... pero, ¿cuál es el uso de esta aplicación webview del sistema Android entonces?
Los dispositivos @Clémentine Nexus (posiblemente otros) se envían preinstalados y configurados para usarlos. 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 Play Store, de modo que las OTA del sistema completo no son necesarias solo para actualizar el navegador/WebView. Hay otros componentes que Google ha migrado a Play Store actualizando de manera similar, con el razonamiento esencial de que es más rápido.
¿Por qué todas las tabletas que ejecutan lollipop o un sistema operativo más nuevo no usan esto como su sistema WebView predeterminado? ¡Suena como un desperdicio!
El control de @Clémentine Google sobre los fabricantes externos es algo limitado. Probablemente podrían optar por utilizar WebView de código cerrado de Google tal como lo hacen los dispositivos Nexus, pero pueden optar por no hacerlo por cualquier motivo. No estoy seguro de los detalles sobre cómo Google otorga licencias de sus aplicaciones de código cerrado a los OEM, pero esos términos (cualesquiera que sean) podrían ser un factor en la decisión del fabricante.
Gracias por toda esta información. Arrojando luz sobre muchas preguntas que tenía en el fondo de mi mente. Estaré buscando una tableta que lo tenga preinstalado entonces.
¿Funcionará su solución de edición .xml en dispositivos Kitkat? Si puedo falsificar la identidad del dispositivo para descargar "Android System Webview" de Play Store.
@AaronGillion No estoy seguro. Supongo que dependerá principalmente de si WebView de Google usa o no las API que se introdujeron en 5.0. De lo contrario, es posible que tenga la oportunidad de hacerlo funcionar, pero si lo hace, se bloqueará.
@eldarerathis Webkit debe compilarse en código C nativo, así que lo intentaré. Su respuesta puede ser realmente útil no para dispositivos Kitkat, sino más bien para dispositivos JB e ICS porque su vista web está realmente desactualizada. Los desarrolladores de aplicaciones que usan Phonegap pueden beneficiarse mucho de esto, si han desarrollado algo basado en Webview para una empresa, que de repente necesita compatibilidad con versiones anteriores.
Ojalá solo las aplicaciones integradas estuvieran usando la vista web integrada. Las aplicaciones instaladas desde el mercado deberían poder funcionar con la vista web actualizada y, en algunos casos, SOLO pueden funcionar con la vista web actualizada, lo que deja a los usuarios atascados cuando solo se utiliza la vista web obsoleta del sistema.
Hola, también tengo algunos problemas con el antiguo webView, ¿alguien encontró alguna solución para eso? Tengo un dispositivo pero no puedo depurarlo y no tiene playstore (Android personalizado)

Seguí la respuesta de @eldarerathis e hice una guía paso a paso sobre cómo actualizar webview en un emulador de Android 5.0. Probablemente también funcione en Android 5.1 a Android 6.0. Espero que ayude a cualquiera que desee usar una vista web 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 del SDK de Android)
  3. apktool (2.5.0) y tiempo de ejecución de Java
  4. cremallera (3.0)
  5. descomprimir (6.0)

Asegúrese de tener las variables JAVA_HOMEde ANDROID_HOMEentorno configuradas correctamente.

Pasos

  1. Cree un nuevo dispositivo virtual de Android (AVD) con Android Studio o avdmanager. Aquí, creé un dispositivo Android 5.0 con la siguiente imagen del sistema:

    Path                                        | Version | Description                                | Location
    system-images;android-21;google_apis;x86_64 | 32      | Google APIs Intel x86 Atom_64 System Image | system-images/android-21/google_apis/x86_64/
    

    El nombre AVD es

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

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

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

    $ $ANDROID_HOME/platform-tools/adb remount
    
  3. Descargue la vista web del sistema Android de su versión deseada de Internet. Por ejemplo, puede usar Android System WebView 88.0.4324.93 (x86 + x86_64) (Android 5.0+)desde apkmirror.com. El ID del paquete es com.google.android.webview, que es diferente de la vista web predeterminada del sistema ( com.android.webview). Además, asegúrese de que su paquete tenga el mismo ABI que su AVD.

  4. Extraiga el paquete webview usando unzipy empújelo y las bibliotecas nativas a la partición del sistema de su AVD:

    $ unzip <path/to/your/webview.apk>
    $ $ANDROID_HOME/platform-tools/adb shell mkdir /system/app/ChromiumWebview
    $ $ANDROID_HOME/platform-tools/adb push <path/to/your/webview.apk> /system/app/ChromiumWebview/webview.apk
    $ $ANDROID_HOME/platform-tools/adb push <path/to/your/extracted/webview.apk>/lib /system/app/ChromiumWebview/
    

    Después de realizar este paso, debería tener los siguientes archivos nuevos en su 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. Reinicie los servicios de Android para permitir que el Administrador de paquetes seleccione 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           --> the built-in and outdated webview
    package:com.google.android.webview    --> our new webview
    
  6. Compruebe si el paquete está registrado con el Administrador de paquetes. Asegúrese codePathde que , nativeLibraryPathy primaryCpuAbisean correctos:

    $ $ANDROID_HOME/platform-tools/adb shell cat /data/system/packages.xml | grep com.google.android.webview
    <package name="com.google.android.webview" codePath="/system/app/ChromiumWebview" nativeLibraryPath="/system/app/ChromiumWebview/lib" primaryCpuAbi="x86_64" secondaryCpuAbi="x86" flags="...
    
  7. Como el nombre del paquete webview predeterminado que usa el sistema operativo Android está codificado en los sistemas operativos Android más antiguos ( https://android.stackexchange.com/a/139415 ), debe modificar el marco de trabajo de Android para usar el nuevo nombre del paquete. Primero, extraiga framework-res.apkde su AVD y descompílelo usando apktool:

    $ $ANDROID_HOME/platform-tools/adb pull /system/framework/framework-res.apk
    $ apktool d framework-res.apk
    
  8. Actualice el <path/to/extracted/framework-res.apk>/res/values/strings.xmlarchivo para usar su nuevo nombre de 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 @@
         <string name="config_appsAuthorizedForSharedAccounts">;com.android.settings;</string>
         <string name="config_defaultNetworkScorerPackageName" />
         <string name="config_persistentDataPackageName" />
    -    <string name="config_webViewPackageName">com.android.webview</string>
    +    <string name="config_webViewPackageName">com.google.android.webview</string>
         <item type="string" name="timepicker_circle_radius_multiplier">0.82</item>
         <item type="string" name="timepicker_circle_radius_multiplier_24HourMode">0.85</item>
         <item type="string" name="timepicker_selection_radius_multiplier">0.16</item>
    
  9. Vuelva a empaquetar framework-res.apkusando apktool.

    $ apktool b <path/to/extracted/framework-res.apk>
    

    Es posible que haya algunos errores que deba corregir antes de poder volver a empaquetar el paquete. Por ejemplo, si te encuentras con el siguiente error:

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

    debe reemplazar <drawable name="APKTOOL_DUMMY_..." />con <item type="drawable" name="APKTOOL_DUMMY_..." />en el <path/to/extracted/framework-res.apk>/res/values-nodpi-v4/drawables.xmlarchivo y volver a intentarlo.

  10. El reenvasado framework-res.apkse coloca debajo de <path/to/extracted/framework-res.apk>/dist. Extraiga el resources.arscarchivo de él y combínelo con el original framework-res.apk:

    $ unzip <path/to/extracted/framework-res.apk>/dist/framework-res.apk resources.arsc -d .
    $ zip -0 <path/to/original/framework-res.apk> resources.arsc
    

    El original framework-res.apkque extrajo de su AVD ahora está actualizado.

  11. A continuación, reemplace framework-res.apken su AVD con nuestro framework-res.apkdispositivo actualizado (combinado) del último paso y reinicie:

    $ $ANDROID_HOME/platform-tools/adb push <path/to/original/framework-res.apk> /system/framework/framework-res.apk
    $ $ANDROID_HOME/platform-tools/adb reboot
    
  12. Finalmente, verifique si la vista web se cambia a la nueva:

Bueno, esto explica por qué siempre es más fácil usar la tienda para actualizar la vista web... demasiado malo, el emulador prohíbe el uso de Play Store.

Continuando con la respuesta anterior. Para Android 7 y versiones posteriores: extraiga el archivo framework-res.apk de su dispositivo, descompílelo y cambie el archivo /res/xml/config_webview_packages.xml, agréguele un nuevo webviewprovider.

Ejemplo config_webview_packages.xml:

<webviewproviders>
    <webviewprovider description="Android WebView" packageName="com.android.webview" availableByDefault="true" />
    <webviewprovider description="Google WebView" packageName="com.google.android.webview" availableByDefault="true">
        <signature>MIIDuzCCAqOgAwIBAgIJANi6DgBQG4ZTMA0GCSqGSIb3DQEBBQUAMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKDAtHb29nbGUgSW5jLjEQMA4GA1UECwwHQW5kcm9pZDEQMA4GA1UEAwwHd2VidmlldzAeFw0xNDA4MDgyMzIwMjBaFw00MTEyMjQyMzIwMjBaMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKDAtHb29nbGUgSW5jLjEQMA4GA1UECwwHQW5kcm9pZDEQMA4GA1UEAwwHd2VidmlldzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbtaFX0r5aZJMAbPVMAgK1ZZ29dTn91VsGxXv2hqrQo7IpqEy2JmPvPnoMsSiuTAe+UcQy8oKDQ2aYVSAd1DGIy+nSRyFTt3LSIAdwSBkB1qT4a+OqkpsR6bSNXQXQ18lCQu9gREY3h3QlYBQAyzRxw4hRGlrXAzuSz1Ec4W+6x4nLG5DG61MAMR8ClF9XSqbmGB3kyZ70A0X9OPYYxiMWP1ExaYvpaVqjyZZcrPwr+vtW8oCuGBUtHpBUH3OoG+9s2YMcgLG7vCK9awKDqlPcJSpIAAj6uGs4gORmkqxZRMskLSTWbhP4p+3Ap8jYzTVB6Y1/DMVmYTWRMcPW0macCAwEAAaNQME4wHQYDVR0OBBYEFJ6bAR6/QVm4w9LRSGQiaR5Rhp3TMB8GA1UdIwQYMBaAFJ6bAR6/QVm4w9LRSGQiaR5Rhp3TMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAEQu8QiVxax7/diEiJrgKE1LwdXsIygJK/KnaKdnYEkAQpeu/QmrLiycm+OFbL1qHJIB7OuI/PQBUtcaNSiJSCVgtwtEbZWWIdsynqG/Nf4aGOndXegSQNRH54M05sRHLoeRycPrY7xQlEwGikNFR76+5UdwFBQI3Gn22g6puJnVukQm/wXQ+ajoiS4QclrNlixoDQsZ4STLH4+Wju2wIWKFFArIhVEIlbamq+p6BghuzH3aIz/Fy0YTQKi7SA+0fuNeCaqlSm5pYSt6p5CH89y1Fr+wFc5r3iLRnUwRcy08ESC7bZJnxV3d/YQ5valTxBbzku/dQbXVj/xg69H8l8M</signature>
    </webviewprovider>
</webviewproviders>

Sobre la firma. Si webviewprovider.apk firmó la firma del sistema, puede omitir este atributo. Si la firma no es correcta, el proveedor de vista web no aparecerá en la lista disponible a través de la configuración de desarrollo del dispositivo. No cambie la firma original de webviewProvider.apk; no podrá instalar actualizaciones.

Coloque framework-res.apk en el dispositivo (necesita root).