86

Я получаю ошибки от Crashlytics, что указывает на то, что некоторые устройства отсутствуют com.google.android.webview. Как это вообще возможно?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) 

И только с устройств, работающих на Lollipop. Я тестировал его на своем Nexus 5, но я не могу воспроизвести ошибку. Я использую ProGuard

Мой MyWebView выглядит следующим образом:

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

Первопричиной наиболее быть:

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

Так что я имею в виду, что, возможно, что-то делать с ProGuard и, возможно, JavascriptInterface , Есть идеи?

EDIT: из grepcode я нашел метод 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

Я тоже вижу это в наших данных Crashlytics. В основном Lollipop, а также несколько 4.0.4. Устройства включают Nexus 7, Galaxy S5, Galaxy Discover. Предположительно ни один из них не укоренен. Как/почему устройство должно отсутствовать com.google.android.webview? Это влияет на очень небольшое количество пользователей, и у нас есть много других пользователей с этими устройствами, у которых эта проблема отсутствует. Хмм ... –

+2

То же самое здесь ... тоже не понимаю. – neteinstein

ответ

78

Вполне вероятно, что это сразу же происходит в очень короткий промежуток времени после обновления приложения WebView Android System Lollipop в.

Я видел эту ошибку в Google Play Dev Console, но так и не смог воспроизвести ее на своем Nexus 5, независимо от того, насколько я действительно пытался остановить свое приложение от доступа к системе Android WebView приложение:

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

Тогда мы получили слово, что наше приложение последовательно сбой с сообщением выше на некоторых устройствах сразу после обновления приложения System WebView, поэтому я проверил это. По-прежнему никаких результатов, ваниль Nexus 5 отказался сорвать наше приложение! Поэтому я пробовал другие телефоны от других производителей (примерно 75% наших отчетов от устройств Samsung Galaxy), и мы внезапно рушились. Моя методология тестирования:

  1. Откройте приложение, убедитесь, что отображается WebView.
  2. Откройте Play Store, перейдите к «Мои приложения» и поднимите «Android-систему WebView». Удалите обновления. Это не должно вас разорвать, но вы, , должны увидеть ваше приложение принудительного перезапуска.
  3. Откройте свое приложение и верните его после перезагрузки.
  4. Вернитесь в Play Маркет и обновите систему Android WebView.
  5. Повторно сфокусируйте свое приложение во время процесса обновления. Теперь, если вы находитесь на поврежденном устройстве , он должен потерпеть крах. Если нет, ваше приложение будет только , отодвинутым на задний план и тихо перезагруженным.

Несколько маленьких предостережений с тем, что я говорил до сих пор:

  • Наше приложение делает ошибку, запуская WebView очень рано, следовательно, почему мы получаем «не удалось создать приложение» в нашем аварийном сообщении. Пользователь даже не должен смотреть на наше приложение, чтобы оно разбилось. Я сомневаюсь, что это относится к вам, но если ваше приложение пытается перезапустить свою деятельность, содержащую WebView во время этого сценария, это объяснит это.
  • 100% наших отчетов от 5.0, я не знаю, как это могло произойти на чем-нибудь ниже Lollipop.
  • Мы видим отчеты Nexus 4 и Nexus 5 с этой ошибкой, поэтому я не знаю, почему я не могу воспроизвести их на этих устройствах. Возможно, это отдельная первопричина, но мне нужно еще раз взглянуть на это.

Короче говоря, я не сразу думаю, что вы делаете что-то неправильное с ProGuard или вашим JavascriptInterface. Я очень сильно склоняюсь к тому, чтобы обвинить прошивку в качестве основной причины большинства отчетов, что привело к тому, что должен быть плавный процесс обновления, становящийся тем, что вместо этого приводит к сбою некоторых приложений.

Редактировать: Я провел еще несколько тестов, и оказалось, что все устройства, которые не сбой, были 5.0 или 5.0.1, в то время как все устройства, которые делали сбой, были 5.0.2, t комфортно укажу пальцем на OEM-производителей.

+0

У нас есть несколько ошибок, о которых сообщалось в наших данных Crashlytics от пользователей с Android 4.0.4, 4.2.2, 4.4.2, 5.0, 5.0.1, 5.0.2 и 5.1. Это очень редко: около 30 отчетов для приложения с несколькими миллионами установок. –

+0

@RobertNekic С сопоставимым количеством установок мы только когда-либо видели это на 5.0 и 5.1, и на основании причины нашей проблемы я не вижу, как это произойдет на чем-то ниже. Я хотел бы знать, что вызывает их в частности. –

+0

Ahhh, похоже, Crashlytics бросает еще одну проблему в ту же проблему. Они показывают, что 2% - до 5.0. Для того, чтобы найти пример, потребовалось некоторое копание, и это совершенно другая основная ошибка. Оба запускают RuntimeException, раздувая веб-представление, которое достаточно близко для Crashlytics, я думаю. –

Смежные вопросы