86

Ricevo errori da Crashlytics che indica che alcuni dispositivi mancano com.google.android.webview. Com'è possibile?NameNotFoundException webview

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) 

Ed è solo da dispositivi che eseguono Lollipop. L'ho provato sul mio Nexus 5, ma non riesco a riprodurre l'errore. Sto usando Proguard

mio MyWebView si presenta così:

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 causa principale più BE:

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

Così sto pensando che potrebbe avere qualcosa a che fare con Proguard e forse il JavascriptInterface . Qualche idea?

EDIT: da grepcode ho trovato il metodo 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); 
     } 
    } 
+1

Sto vedendo anche questi nei nostri dati di Crashlytics. Principalmente Lollipop ma anche alcuni 4.0.4. I dispositivi includono Nexus 7, Galaxy S5, Galaxy Discover. Presumibilmente nessuno di loro è radicato. Come/perché mancherebbe un dispositivo com.google.android.webview? Sta interessando un numero molto piccolo di utenti e abbiamo molti altri utenti con questi dispositivi che NON hanno questo problema. Hmm ... –

+2

Anche qui ... non capisco neanche. – neteinstein

risposta

78

E 'probabile che questo sta accadendo nel lasso di tempo molto breve immediatamente dopo gli aggiornamenti delle applicazioni WebView sistema Android di lecca-lecca.

Avevo visto questo errore nella Dev Console di Google Play, ma non ero mai stato in grado di riprodurlo sul mio Nexus 5, indipendentemente da quanto ho davvero provato a impedire alla mia app di accedere a Android System WebView app:

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

Poi abbiamo saputo che la nostra applicazione è stata costantemente in crash con il messaggio di cui sopra su alcuni dispositivi subito dopo gli aggiornamenti app WebView sistema, così ho provato che. Ancora nessun risultato, la vaniglia Nexus 5 si è rifiutata di mandare in crash la nostra app! Così ho provato altri telefoni di altri produttori (circa il 75% dei nostri rapporti provengono da dispositivi Samsung Galaxy) e improvvisamente ci siamo fermati in modo consistente. La mia metodologia di prova:

  1. Apri la tua app, assicurati che sia visualizzata una WebView.
  2. Apri Play Store, passa a "Le mie app" e visualizza "Sistema Android WebView". Disinstalla gli aggiornamenti. Questo non dovrebbe bloccarti, ma tu dovresti vedere il riavvio forzato dell'app.
  3. Aprire l'app di backup e lasciarlo ripristinare dal riavvio.
  4. Torna al Play Store e aggiorna la visualizzazione del sistema Android.
  5. Ri-concentra l'app durante il processo di aggiornamento. Ora, se sei su un dispositivo interessato da , dovrebbe bloccarsi. In caso contrario, la tua app sarà appena inviata in background e riavviata in modalità silenziosa.

qualche piccolo distinguo con quello che ho detto finora:

  • La nostra applicazione fa l'errore di avviare una WebView molto presto, quindi, perché si arriva "in grado di creare applicazioni" nel nostro messaggio di arresto anomalo. L'utente non ha nemmeno bisogno di guardare la nostra app per farlo andare in crash. Dubito che questo si applica a te, ma se la tua app tenta di riavviare la sua attività contenente una WebView durante questo scenario, ciò spiegherebbe.
  • 100% dei nostri rapporti sono da 5.0 dispositivi, non ho idea di come questo possa accadere su qualcosa sotto Lollipop.
  • Vediamo rapporti di Nexus 4 e Nexus 5 con questo errore, quindi non so perché non riesco a riprodurlo su quei dispositivi. Potrebbe essere una causa alla radice separata, ma ho bisogno di approfondire la questione.

In breve, non penso immediatamente che stai facendo qualcosa di non corretto con ProGuard o la tua JavaScriptInterface. Mi sto appoggiando molto intensamente a dare la colpa al firmware come la causa alla radice della maggior parte dei report, il che si traduce in un processo di aggiornamento regolare che diventa invece un problema che causa alcune crash app.

Modifica: Ho eseguito alcuni altri test e si scopre che tutti i dispositivi che non sono stati bloccati sono 5.0 o 5.0.1, mentre tutti i dispositivi che si sono bloccati erano 5.0.2, quindi posso ' t più facilmente puntare il dito sugli OEM.

+0

Abbiamo una manciata di questi errori riportati nei nostri dati Crashlytics dagli utenti con Android 4.0.4, 4.2.2, 4.4.2, 5.0, 5.0.1, 5.0.2 e 5.1. È molto raro: circa 30 rapporti per un'app con diversi milioni di installazioni. –

+0

@RobertNekic Con un numero paragonabile di installazioni, lo abbiamo visto solo su 5.0 e 5.1, e in base alla causa del nostro problema, non riesco a vedere come si verificherebbe su qualcosa di più basso. Mi piacerebbe sapere cosa sta causando quelli in particolare. –

+0

Ahhh, sembra che Crashlytics stia risolvendo un altro problema nello stesso problema. Mostrano che il 2% è pre-5.0. Ci sono voluti alcuni scavi per trovare un esempio ... ed è un errore di fondo totalmente diverso. Entrambe innescano una RuntimeException che gonfia la webview che è abbastanza vicina per Crashlytics, immagino. –