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);
}
}
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:
Quelques petites mises en garde avec ce que j'ai dit jusqu'à présent:
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.
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