it-swarm.com.de

NameNotFoundException-Webansicht

Ich erhalte Fehlermeldungen von Crashlytics, die darauf hinweisen, dass auf einigen Geräten com.google.Android.webview fehlt. Wie ist das überhaupt möglich?

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)

Und es geht nur von Geräten, die Lollipop ausführen. Ich habe es auf meinem Nexus 5 getestet, kann den Fehler jedoch nicht reproduzieren. Ich benutze Proguard 

Mein MyWebView sieht so aus:

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) {
        }
    }
}

Die Ursache liegt meistens bei: 

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

Ich denke, es hat etwas mit proguard und vielleicht mit dem JavascriptInterface zu tun. Irgendwelche Ideen?

EDIT: Von grepcode Ich habe die Methode getFactoryClass gefunden:

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

Es ist wahrscheinlich, dass dies in einem sehr kurzen Zeitraum unmittelbar nach den Updates der Android System WebView-Anwendung von Lollipop geschieht.

Ich hatte diesen Fehler in der Google Play Dev Console gesehen, konnte ihn aber auch nie auf meinem Nexus 5 reproduzieren, unabhängig davon, wie sehr ich wirklich versuchte, meine App vom Zugriff auf die Android System WebView-App abzuhalten: 

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

Dann wurde uns mitgeteilt, dass unsere App auf einigen Geräten sofort nach der Aktualisierung der System WebView-App mit der oben genannten Meldung abgestürzt ist. Ich habe das also getestet. Immer noch keine Ergebnisse, der Vanilla Nexus 5 weigerte sich, unsere App zum Absturz zu bringen! Ich habe also andere Telefone anderer Hersteller ausprobiert (etwa 75% unserer Berichte stammen von Samsung Galaxy-Geräten) und plötzlich stürzten wir ständig ab. Meine Testmethodik:

  1. Öffnen Sie Ihre App und stellen Sie sicher, dass eine WebView angezeigt wird.
  2. Öffnen Sie den Play Store, navigieren Sie zu "Meine Apps" und rufen Sie "Android System WebView" auf. Updates deinstallieren. Dies sollte Sie nicht zum Absturz bringen, aber Sie sollten sehen, dass Ihre App einen Neustart erzwingt.
  3. Öffnen Sie Ihre App wieder und lassen Sie sie nach dem Neustart wiederherstellen.
  4. Gehen Sie zurück in den Play Store und aktualisieren Sie Android System WebView.
  5. Konzentrieren Sie Ihre App während des Aktualisierungsvorgangs neu. Wenn Sie sich auf einem betroffenen Gerät befinden, sollte es abstürzen. Wenn nicht, wird Ihre App einfach In den Hintergrund gedrückt und leise neu gestartet.

Ein paar kleine Vorbehalte mit dem, was ich bisher gesagt habe:

  • Unsere App macht den Fehler, ein WebView extrem früh zu starten, weshalb wir in unserer Absturzmeldung "keine Anwendung erstellen" bekommen. Der Benutzer muss nicht einmal auf unsere App schauen, damit sie abstürzt. Ich bezweifle, dass dies für Sie zutrifft. Wenn Ihre App jedoch versucht, ihre Aktivität mit einem WebView während dieses Szenarios neu zu starten, würde dies dies erklären.
  • 100% unserer Berichte stammen von 5.0-Geräten. Ich habe keine irdischen Anhaltspunkte, wie dies auf etwas unterhalb von Lollipop auftreten könnte.
  • Es werden Berichte über Nexus 4 und Nexus 5 mit diesem Fehler angezeigt, daher weiß ich nicht, warum ich sie auf diesen Geräten nicht reproduzieren kann. Könnte eine separate Ursache sein, aber ich muss weiter darauf eingehen.

Kurz gesagt, ich glaube nicht, dass Sie mit ProGuard oder Ihrem JavascriptInterface etwas falsch machen. Ich neige sehr stark dazu, die Firmware als Hauptursache für die Mehrheit der Berichte zu beschuldigen, was dazu führt, dass ein reibungsloser Update-Prozess zu einem Prozess wird, der stattdessen dazu führt, dass einige Apps völlig abstürzen.

Edit: Ich führte ein paar weitere Tests durch und es stellte sich heraus, dass alle Geräte, die nicht abgestürzt sind, 5.0 oder 5.0.1 sind, während alle Geräte, die abgestürzt sind, 5.0.2 waren, daher kann ich nicht bequem Richten Sie meinen Finger mehr auf OEMs.

89
Riley C

Dies ist der Fall, wenn Chrome-Updates auf Android ausgeführt werden: Während des Updates gilt das Paket nicht als installiert. Daher schlagen die Versuche, es im Paket-Manager nachzuschlagen, fehl.

Für meinen Fall blieb es eine Weile bestehen (die App stürzte ständig ab), bis ich tatsächlich {Neustart/Neustart des Geräts, dann ist alles gut.

Es gibt nichts Falsches an Ihrem Code, es geht darum, wie Updates behandelt werden.

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

0