web-dev-qa-db-fra.com

NameNotFoundException webview

Je reçois des erreurs de Crashlytics qui indiquent que certains appareils manquent com.google.Android.webview Comment est-ce possible?

Java.lang.RuntimeException: Unable to start activity   ComponentInfo{com.myapp.app/com.myapp.ReaderActivity}: Android.view.InflateException: Binary XML file line #29: Error inflating class com.myapp.MyWebView
       at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2298)
       at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2360)
       at Android.app.ActivityThread.access$800(ActivityThread.Java:144)
       at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1278)
       at Android.os.Handler.dispatchMessage(Handler.Java:102)
       at Android.os.Looper.loop(Looper.Java:135)
       at Android.app.ActivityThread.main(ActivityThread.Java:5221)
       at Java.lang.reflect.Method.invoke(Method.Java)
       at Java.lang.reflect.Method.invoke(Method.Java:372)
       at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:899)
       at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:694)
Caused by: Android.view.InflateException: Binary XML file line #29: Error inflating class com.myapp.MyWebView
       at Android.view.LayoutInflater.createView(LayoutInflater.Java:633)
       at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater.createCustomViewInternal(SourceFile:206)
       at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater.access$000(SourceFile:20)
       at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater$PrivateWrapperFactory2.onCreateView(SourceFile:297)
       at Android.view.LayoutInflater$FactoryMerger.onCreateView(LayoutInflater.Java:177)
       at Android.view.LayoutInflater.createViewFromTag(LayoutInflater.Java:733)
       at Android.view.LayoutInflater.rInflate(LayoutInflater.Java:806)
       at Android.view.LayoutInflater.rInflate(LayoutInflater.Java:809)
       at Android.view.LayoutInflater.rInflate(LayoutInflater.Java:809)
       at Android.view.LayoutInflater.inflate(LayoutInflater.Java:504)
       at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater.inflate(SourceFile:60)
       at Android.view.LayoutInflater.inflate(LayoutInflater.Java:414)
       at Android.view.LayoutInflater.inflate(LayoutInflater.Java:365)
       at Android.support.v7.app.ActionBarActivityDelegateBase.setContentView(SourceFile:228)
       at Android.support.v7.app.ActionBarActivity.setContentView(SourceFile:102)
       at com.myapp.ReaderActivity.onCreate(SourceFile:120)
       at Android.app.Activity.performCreate(Activity.Java:5933)
       at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1105)
       at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2251)
       at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2360)
       at Android.app.ActivityThread.access$800(ActivityThread.Java:144)
       at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1278)
       at Android.os.Handler.dispatchMessage(Handler.Java:102)
       at Android.os.Looper.loop(Looper.Java:135)
       at Android.app.ActivityThread.main(ActivityThread.Java:5221)
       at Java.lang.reflect.Method.invoke(Method.Java)
       at Java.lang.reflect.Method.invoke(Method.Java:372)
       at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:899)
       at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:694)
Caused by: Java.lang.reflect.InvocationTargetException
       at Java.lang.reflect.Constructor.newInstance(Constructor.Java)
       at Java.lang.reflect.Constructor.newInstance(Constructor.Java:288)
       at Android.view.LayoutInflater.createView(LayoutInflater.Java:607)
       at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater.createCustomViewInternal(SourceFile:206)
       at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater.access$000(SourceFile:20)
       at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater$PrivateWrapperFactory2.onCreateView(SourceFile:297)
       at Android.view.LayoutInflater$FactoryMerger.onCreateView(LayoutInflater.Java:177)
       at Android.view.LayoutInflater.createViewFromTag(LayoutInflater.Java:733)
       at Android.view.LayoutInflater.rInflate(LayoutInflater.Java:806)
       at Android.view.LayoutInflater.rInflate(LayoutInflater.Java:809)
       at Android.view.LayoutInflater.rInflate(LayoutInflater.Java:809)
       at Android.view.LayoutInflater.inflate(LayoutInflater.Java:504)
       at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater.inflate(SourceFile:60)
       at Android.view.LayoutInflater.inflate(LayoutInflater.Java:414)
       at Android.view.LayoutInflater.inflate(LayoutInflater.Java:365)
       at Android.support.v7.app.ActionBarActivityDelegateBase.setContentView(SourceFile:228)
       at Android.support.v7.app.ActionBarActivity.setContentView(SourceFile:102)
       at com.myapp.ReaderActivity.onCreate(SourceFile:120)
       at Android.app.Activity.performCreate(Activity.Java:5933)
       at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1105)
       at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2251)
       at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2360)
       at Android.app.ActivityThread.access$800(ActivityThread.Java:144)
       at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1278)
       at Android.os.Handler.dispatchMessage(Handler.Java:102)
       at Android.os.Looper.loop(Looper.Java:135)
       at Android.app.ActivityThread.main(ActivityThread.Java:5221)
       at Java.lang.reflect.Method.invoke(Method.Java)
       at Java.lang.reflect.Method.invoke(Method.Java:372)
       at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:899)
       at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:694)
Caused by: Android.util.AndroidRuntimeException: Android.content.pm.PackageManager$NameNotFoundException: com.google.Android.webview
       at Android.webkit.WebViewFactory.getFactoryClass(WebViewFactory.Java:161)
       at Android.webkit.WebViewFactory.getProvider(WebViewFactory.Java:101)
       at Android.webkit.WebView.getFactory(WebView.Java:2185)
       at Android.webkit.WebView.ensureProviderCreated(WebView.Java:2180)
       at Android.webkit.WebView.setOverScrollMode(WebView.Java:2239)
       at Android.view.View.(View.Java:3581)
       at Android.view.View.(View.Java:3675)
       at Android.view.ViewGroup.(ViewGroup.Java:491)
       at Android.widget.AbsoluteLayout.(AbsoluteLayout.Java:55)
       at Android.webkit.WebView.(WebView.Java:538)
       at Android.webkit.WebView.(WebView.Java:483)
       at Android.webkit.WebView.(WebView.Java:466)
       at Android.webkit.WebView.(WebView.Java:453)
       at com.myapp.MyWebView.(SourceFile:31)
       at Java.lang.reflect.Constructor.newInstance(Constructor.Java)
       at Java.lang.reflect.Constructor.newInstance(Constructor.Java:288)
       at Android.view.LayoutInflater.createView(LayoutInflater.Java:607)
       at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater.createCustomViewInternal(SourceFile:206)
       at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater.access$000(SourceFile:20)
       at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater$PrivateWrapperFactory2.onCreateView(SourceFile:297)
       at Android.view.LayoutInflater$FactoryMerger.onCreateView(LayoutInflater.Java:177)
       at Android.view.LayoutInflater.createViewFromTag(LayoutInflater.Java:733)
       at Android.view.LayoutInflater.rInflate(LayoutInflater.Java:806)
       at Android.view.LayoutInflater.rInflate(LayoutInflater.Java:809)
       at Android.view.LayoutInflater.rInflate(LayoutInflater.Java:809)
       at Android.view.LayoutInflater.inflate(LayoutInflater.Java:504)
       at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater.inflate(SourceFile:60)
       at Android.view.LayoutInflater.inflate(LayoutInflater.Java:414)
       at Android.view.LayoutInflater.inflate(LayoutInflater.Java:365)
       at Android.support.v7.app.ActionBarActivityDelegateBase.setContentView(SourceFile:228)
       at Android.support.v7.app.ActionBarActivity.setContentView(SourceFile:102)
       at com.myapp.ReaderActivity.onCreate(SourceFile:120)
       at Android.app.Activity.performCreate(Activity.Java:5933)
       at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1105)
       at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2251)
       at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2360)
       at Android.app.ActivityThread.access$800(ActivityThread.Java:144)
       at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1278)
       at Android.os.Handler.dispatchMessage(Handler.Java:102)
       at Android.os.Looper.loop(Looper.Java:135)
       at Android.app.ActivityThread.main(ActivityThread.Java:5221)
       at Java.lang.reflect.Method.invoke(Method.Java)
       at Java.lang.reflect.Method.invoke(Method.Java:372)
       at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:899)
       at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:694)
Caused by: Android.content.pm.PackageManager$NameNotFoundException: com.google.Android.webview
       at Android.app.ApplicationPackageManager.getPackageInfo(ApplicationPackageManager.Java:114)
       at Android.webkit.WebViewFactory.getFactoryClass(WebViewFactory.Java:133)
       at Android.webkit.WebViewFactory.getProvider(WebViewFactory.Java:101)
       at Android.webkit.WebView.getFactory(WebView.Java:2185)
       at Android.webkit.WebView.ensureProviderCreated(WebView.Java:2180)
       at Android.webkit.WebView.setOverScrollMode(WebView.Java:2239)
       at Android.view.View.(View.Java:3581)
       at Android.view.View.(View.Java:3675)
       at Android.view.ViewGroup.(ViewGroup.Java:491)
       at Android.widget.AbsoluteLayout.(AbsoluteLayout.Java:55)
       at Android.webkit.WebView.(WebView.Java:538)
       at Android.webkit.WebView.(WebView.Java:483)
       at Android.webkit.WebView.(WebView.Java:466)
       at Android.webkit.WebView.(WebView.Java:453)
       at com.myapp.MyWebView.(SourceFile:31)
       at Java.lang.reflect.Constructor.newInstance(Constructor.Java)
       at Java.lang.reflect.Constructor.newInstance(Constructor.Java:288)
       at Android.view.LayoutInflater.createView(LayoutInflater.Java:607)
       at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater.createCustomViewInternal(SourceFile:206)
       at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater.access$000(SourceFile:20)
       at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater$PrivateWrapperFactory2.onCreateView(SourceFile:297)
       at Android.view.LayoutInflater$FactoryMerger.onCreateView(LayoutInflater.Java:177)
       at Android.view.LayoutInflater.createViewFromTag(LayoutInflater.Java:733)
       at Android.view.LayoutInflater.rInflate(LayoutInflater.Java:806)
       at Android.view.LayoutInflater.rInflate(LayoutInflater.Java:809)
       at Android.view.LayoutInflater.rInflate(LayoutInflater.Java:809)
       at Android.view.LayoutInflater.inflate(LayoutInflater.Java:504)
       at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater.inflate(SourceFile:60)
       at Android.view.LayoutInflater.inflate(LayoutInflater.Java:414)
       at Android.view.LayoutInflater.inflate(LayoutInflater.Java:365)
       at Android.support.v7.app.ActionBarActivityDelegateBase.setContentView(SourceFile:228)
       at Android.support.v7.app.ActionBarActivity.setContentView(SourceFile:102)
       at com.myapp.ReaderActivity.onCreate(SourceFile:120)
       at Android.app.Activity.performCreate(Activity.Java:5933)
       at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1105)
       at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2251)
       at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2360)
       at Android.app.ActivityThread.access$800(ActivityThread.Java:144)
       at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1278)
       at Android.os.Handler.dispatchMessage(Handler.Java:102)
       at Android.os.Looper.loop(Looper.Java:135)
       at Android.app.ActivityThread.main(ActivityThread.Java:5221)
       at Java.lang.reflect.Method.invoke(Method.Java)
       at Java.lang.reflect.Method.invoke(Method.Java:372)
       at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:899)
       at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:694)

Et ce n'est que des appareils exécutant Lollipop. Je l'ai testé sur mon Nexus 5, mais je ne peux pas reproduire l'erreur. J'utilise proguard 

Mon MyWebView ressemble à ceci:

public class MyWebView extends WebView {

    public static final String tag = MyWebView.class.getName();
    private HtmlJSInterfaceNew js;

    public MyWebView(Context context) {
        super(context);
        Gd = new GestureDetector(context, sogl);
        init();
    }

    public MyWebView(Context context, AttributeSet attrs) {
        super(context, attrs);
        Gd = new GestureDetector(context, sogl);
        init();
    }

    public MyWebView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        Gd = new GestureDetector(context, sogl);
        init();
    }

    @SuppressLint("NewApi")
    private void init() {
        setPadding(0, 0, 0, 0);
        MyWebViewClient myWebViewClient = new MyWebViewClient();        
        this.setWebViewClient(myWebViewClient);
        setWebChromeClient(new MyWebChromeClient());
        if(!isInEditMode())
        {
            getSettings().setAllowFileAccess(true);
            getSettings().setJavaScriptCanOpenWindowsAutomatically(false);
            getSettings().setJavaScriptEnabled(true);
            WebSettings webSettings = getSettings();

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                webSettings.setAllowContentAccess(false);
            }

            webSettings.setUseWideViewPort(true);


        }


    }
    public void addMyJavascriptInterface(HtmlJSInterfaceNew htmlJSInterface, String string) {
        js = htmlJSInterface;
        addJavascriptInterface(htmlJSInterface, string);
    }

    public class MyWebChromeClient extends WebChromeClient
    {
        public void onProgressChanged(WebView view, int progress) {
        }
    }
}

La cause fondamentale la plus être: 

Android.util.AndroidRuntimeException: Android.content.pm.PackageManager$NameNotFoundException: com.google.Android.webview
       at Android.webkit.WebViewFactory.getFactoryClass(WebViewFactory.Java:161)

Je pense donc que cela pourrait avoir quelque chose à voir avec proguard et peut-être l'interface Javascript. Des idées?

EDIT: De grepcode J'ai trouvé la méthode getFactoryClass:

private static Class<WebViewFactoryProvider> getFactoryClass() throws ClassNotFoundException {
        Application initialApplication = AppGlobals.getInitialApplication();
        try {
            // First fetch the package info so we can log the webview package version.
            String packageName = getWebViewPackageName();
            sPackageInfo = initialApplication.getPackageManager().getPackageInfo(packageName, 0);
            Log.i(LOGTAG, "Loading " + packageName + " version " + sPackageInfo.versionName +
                          " (code " + sPackageInfo.versionCode + ")");

            // Construct a package context to load the Java code into the current app.
            Context webViewContext = initialApplication.createPackageContext(packageName,
                    Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);
            initialApplication.getAssets().addAssetPath(
                    webViewContext.getApplicationInfo().sourceDir);
            ClassLoader clazzLoader = webViewContext.getClassLoader();
            Trace.traceBegin(Trace.TRACE_TAG_WEBVIEW, "Class.forName()");
            try {
                return (Class<WebViewFactoryProvider>) Class.forName(CHROMIUM_WEBVIEW_FACTORY, true,
                                                                     clazzLoader);
            } finally {
                Trace.traceEnd(Trace.TRACE_TAG_WEBVIEW);
            }
        } catch (PackageManager.NameNotFoundException e) {
            // If the package doesn't exist, then try loading the null WebView instead.
            // If that succeeds, then this is a device without WebView support; if it fails then
            // swallow the failure, complain that the real WebView is missing and rethrow the
            // original exception.
            try {
                return (Class<WebViewFactoryProvider>) Class.forName(NULL_WEBVIEW_FACTORY);
            } catch (ClassNotFoundException e2) {
                // Ignore.
            }
            Log.e(LOGTAG, "Chromium WebView package does not exist", e);
            throw new AndroidRuntimeException(e);
        }
    }
102

Il est probable que cela se produise très peu de temps après les mises à jour de l'application Android System WebView de Lollipop.

J'avais déjà vu cette erreur dans la console de développement de Google Play, mais je n'avais jamais réussi à la reproduire sur mon Nexus 5, peu importe combien j'avais vraiment essayé d'empêcher mon application d'avoir accès à l'application Android System WebView: 

Java.lang.RuntimeException: Unable to create application com.uninteresting.app.name:
    Android.util.AndroidRuntimeException: Android.content.pm.PackageManager$NameNotFoundException: com.google.Android.webview

Nous avons ensuite appris à Word que notre application plantait constamment avec le message ci-dessus sur certains appareils immédiatement après la mise à jour de l'application System WebView. Je l'ai donc testée. Toujours pas de résultats, le Vanilla Nexus 5 a refusé de planter notre application! J'ai donc essayé d'autres téléphones d'autres fabricants (environ 75% de nos rapports sont issus d'appareils Samsung Galaxy) et tout à coup, nous nous sommes écrasés. Ma méthodologie de test:

  1. Ouvrez votre application, assurez-vous qu'une WebView est affichée.
  2. Ouvrez le Play Store, accédez à "Mes applications" et affichez "Système Android WebView." Désinstallez les mises à jour. Cela ne devrait pas vous bloquer, mais vous devriez voir votre application redémarrer de force.
  3. Ouvrez votre application de sauvegarde et laissez-la récupérer après le redémarrage.
  4. Retournez dans le Play Store et mettez à jour Android System WebView.
  5. Recentrez votre application pendant le processus de mise à jour. Maintenant, si vous êtes sur un périphérique affecté, il devrait planter. Sinon, votre application sera simplement repoussée à l'arrière-plan et redémarrée discrètement.

Quelques petites mises en garde avec ce que j'ai dit jusqu'à présent:

  • Notre application commet l'erreur de démarrer une WebView extrêmement tôt, ce qui explique pourquoi nous sommes "incapables de créer une application" dans notre message d'erreur. L'utilisateur n'a même pas besoin de regarder notre application pour que celle-ci plante. Je doute que cela s’applique à vous, mais si votre application tente de redémarrer son activité contenant une WebView pendant ce scénario, cela s’explique.
  • 100% de nos rapports proviennent d'appareils 5.0, je n'ai aucune idée de ce qui pourrait se produire sous Lollipop.
  • Nous voyons des rapports de Nexus 4 et Nexus 5 avec cette erreur, donc je ne sais pas pourquoi je ne peux pas la reproduire sur ces appareils. Peut-être une cause fondamentale distincte, mais je dois approfondir cette question.

En bref, je ne pense pas que vous fassiez immédiatement des erreurs avec ProGuard ou votre interface Javascript. Je suis très fortement enclin à blâmer le micrologiciel comme étant la cause première de la majorité des rapports, ce qui devrait constituer un processus de mise à jour en douceur devenant un processus qui entraînerait le blocage total de certaines applications.

Edit: / J'ai fait quelques tests supplémentaires et il s'avère que tous les périphériques qui ne sont pas tombés en panne sont 5.0 ou 5.0.1, alors que tous les périphériques qui sont tombés en panne étaient 5.0.2. pointez mon doigt vers les constructeurs OEM.

89
Riley C

Cela se produit lorsque les mises à jour de Chrome sur Android: lors de la mise à jour, le package n'est pas considéré comme installé et les tentatives de recherche dans le gestionnaire de packages échouent.

Pour mon cas, il a persisté pendant un certain temps (l'application s'est effondrée) jusqu'à ce que je me rende en fait {redémarrage/redémarrage de l'appareil}, alors tout va bien.

Il n'y a rien de mal avec votre code, c'est juste comment les mises à jour sont gérées.

Source: https://bugs.chromium.org/p/chromium/issues/detail?id=506369

0
Al-Kathiri Khalid