web-dev-qa-db-fra.com

Android WebView a commencé à planter sur Android 9

Bonjour expert Android:

Nous avons une Android et notre flux de travail de base est comme ci-dessous

  1. L'utilisateur reçoit un lien par e-mail ou SMS
  2. L'utilisateur clique sur le lien et une page s'ouvre sur Chrome ou Android navigateur par défaut et possède un bouton nommé REJOINDRE
  3. L'utilisateur clique sur ce bouton REJOINDRE et notre application est lancée et une page s'affiche en vue Web demandant à l'utilisateur d'entrer le prénom, le nom et le téléphone/e-mail puis l'utilisateur clique sur un bouton nommé LANCER
  4. Nous validons les informations - si l'utilisateur est nouveau, nous créons un enregistrement, cet utilisateur existe, nous le mettons à jour, etc., puis affichons un popup informant que sa session sera enregistrée.
  5. Dès que l'utilisateur clique sur OK dans la fenêtre contextuelle, puis le contrôle existe la vue Web et l'utilisateur est sur une page native Android.

Problème Dès que le bouton OK est tapé sur la vue Web où notre page d'application native se lancerait normalement jusqu'à il y a quelques semaines, l'application se bloque et nous serions ramenés au début de la page Web en demandant nous d'entrer les détails.

Veuillez noter les mises en garde ci-dessous:

  • Tout d'abord, cela ne se produit que dans le cas de Android 9. Nous l'avons testé sur Samsung Galaxy S8 et S9. Et cela ne se produit pas à chaque fois mais cela se produit assez régulièrement, Je dirais même parfois 2 fois sur 3. Dans le meilleur des cas, c'est arrivé 2 fois sur 10 mais ça arrive.
  • Ce code fonctionne avec succès depuis environ un an et nous n'avons jamais eu ce problème. Cela n'a commencé qu'à se produire au cours des 3-4 dernières semaines.
  • Nous avons également une application iOS, où le même problème n'est pas observé.

Voici un extrait de code qui peut vous aider - Voici comment nous chargeons la vue Web.

webview = findViewById(R.id.webview);
    webview.setVisibility(View.VISIBLE);
    final ProgressDialog pd = ProgressDialog.show(ActivtyName.this, "", "Please wait", true);
    webview.setGeolocationEnabled(true);
    webview.setMixedContentAllowed(true);
    webview.getSettings().setJavaScriptEnabled(true);
    webview.getSettings().setDomStorageEnabled(true);
    webview.getSettings().setLoadWithOverviewMode(true);

    webview.setWebChromeClient(new WebChromeClient()

======= Nous remplaçons de nombreuses méthodes ici, suivies par

webview.setWebViewClient(new WebViewClient()

======= Nous remplaçons les méthodes ici.

Une idée de ce qui pourrait se passer? Nous avons essayé de regarder les journaux pendant le débogage via le mode USB, mais nous ne voyons pas grand-chose dans les journaux, sauf ce qui est affiché sur la console Android comme ci-dessous:

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
pid: 0, tid: 0 >>> com.a****d.xyzapp <<<

backtrace:

#00  pc 0000000001b61620  /data/app/com.Android.chrome-DpcaMBOCm2oa08upmw1Tug==/base.apk

Voici le journal plus détaillé demandé:

2019-05-18 11:58:01.694 23217-23217/com.a**d.xyzapp.debug A/chromium: 

[FATAL:crashpad_client_linux.cc(404)] Render process (28925)'s crash wasn't handled by all associated  webviews, triggering application crash.
Fatal signal 5 (SIGTRAP), code 1 (TRAP_BRKPT), fault addr 0x7ab7b9d620 in tid 23217 (atientapp.debug), pid 23217 (atientapp.debug) (edited) 
16
cooler

Dans votre cas, le processus de rendu se bloque et il n'est pas tué par le système.

Donc, comme décrit ici , si vous remplacez

onRenderProcessGone(WebView view,
            RenderProcessGoneDetail detail)

ci-dessus, alors detail.didCrash() contiendra true dans votre cas. Dans ce cas, Renderer s'est bloqué en raison d'une erreur interne, telle qu'une violation d'accès à la mémoire. L'application elle-même se bloque après avoir détecté un plantage du moteur de rendu.

Pour gérer le plantage et permettre à votre application de continuer à s'exécuter, vous devez suivre les étapes ci-dessous: -

  1. Détruisez l'instance WebView actuelle.
  2. Spécifiez votre logique métier comment votre application peut continuer à s'exécuter.
  3. Remplacez onRenderProcessGone et retournez true .

Problème Dès que le bouton OK est tapé sur la vue Web où notre page d'application native se lancerait normalement jusqu'à il y a quelques semaines, l'application se bloque et nous être ramené au début de la page Web en nous demandant d'entrer les détails.

En effet, si un moteur de rendu se bloque lors du chargement d'une page Web particulière, une nouvelle tentative de chargement de cette même page peut entraîner un nouvel objet WebView présentant le même comportement de blocage de rendu.

Vérifiez le code ce lien pour plus d'informations.

J'espère que cela vous aidera.

4
Pravin Divraniya

Utilisez-vous la plate-forme publicitaire mopub? si c'est le cas, ils ont ce bug associé à leur sdk.
Il est généralement lié à un bogue dans la page Web qui est en cours de chargement.
Il y a également un changement dans le fonctionnement de la vue Web par rapport à Android 8.0 ci-dessus. Il est désormais basé sur plusieurs processus, ce qui vous donne également le pouvoir de gérer ce type d'erreurs (le rendu a disparu , de mémoire et bien d'autres).
Vous devez implémenter ce remplacement

public boolean onRenderProcessGone(WebView view, RenderProcessGoneDetail detail)

Plus de détails à ce sujet sont ici

Mise à jour: Si vous utilisez mopub ou même webview, Android 9.0 bloque tout le trafic non-https. Envisagez d'utiliser une alternative comme mopub a implémenté ici .

1
Vanshaj Daga

Cela semble être un problème de mémoire, ce que je peux trouver dans quelques-uns des threads.

Pour ce faire, dans votre fragment/activité de visualisation Web remplacez onLowMemory () et ajoutez un journal.

@Override
public void onLowMemory() {
    Log.d("TAG_MEMORY", "Memory is Low");
    super.onLowMemory();
}

Essayez maintenant de reproduire le crash, et si onLowMemory () est appelé alors c'est la cause première. Peut-être que certaines pages Web sont trop de mémoire.

0
TheAnkush

J'espère que c'est le même problème que j'ai rencontré plus tôt. Il y a plusieurs changements dans Android 9 en ce qui concerne la sécurité. Donc, fondamentalement, par défaut, il bloque toutes les URL et les domaines à utiliser dans l'application qui ne sont pas sécurisés ou certifiés SSL.

TLS réseau activé par défaut Si votre application cible Android 9 ou supérieur, la méthode isCleartextTrafficPermitted () renvoie false par défaut. Si votre application doit activer le texte clair pour des domaines spécifiques, vous devez explicitement définir cleartextTrafficPermitted sur true pour ces domaines dans la configuration de sécurité réseau de votre application.

Soit vous devez rendre ce domaine certifié SSL et ajouter ce code dans le manifeste

<applicaton ....>
<uses-library
            Android:name="org.Apache.http.legacy"
            Android:required="false" />
</application>

ajoutez également le code ci-dessous dans le bloc des dépendances du fichier build.gradle de votre application:

dependencies {
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
}

et si vous n'êtes pas à l'aise avec la sécurisation de votre domaine pour le moment, vous pouvez également exclure ce domaine dans la configuration réseau. La procédure détaillée est mentionnée dans cette page

Configuration de sécurité pour Android

0
Raja chakraborty