一部のデバイスでcom.google.Android.webviewが欠落していることを示すエラーがCrashlyticsから発生しています。それはどのように可能ですか?
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でテストしましたが、エラーを再現できません。私はプロガードを使用しています
私の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)
それで、私はそれがプロガードや多分JavascriptInterfaceと関係があるのではないかと考えています。何か案は?
編集: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);
}
}
これは、LollipopのAndroid System WebViewアプリケーションが更新された直後の非常に短い時間枠で発生している可能性があります。
このエラーはGoogle Play Dev Consoleで見ましたが、アプリがAndroidへのアクセスを実際にどれだけ止めようとしても、Nexus 5でも再現できませんでした。システムWebViewアプリ:
Java.lang.RuntimeException: Unable to create application com.uninteresting.app.name:
Android.util.AndroidRuntimeException: Android.content.pm.PackageManager$NameNotFoundException: com.google.Android.webview
その後、システムWebViewアプリが更新された直後に、一部のデバイスで上記のメッセージが表示されてアプリが常にクラッシュすることをWordに知らせたので、テストしました。まだ結果はありませんが、Vanilla Nexus 5はアプリのクラッシュを拒否しました!だから私は他のメーカーの他の電話を試してみました(私たちのレポートのおよそ75%はSamsung Galaxyデバイスからのものです)突然突然クラッシュしました。私のテスト方法:
私がこれまでに言ったことに関するいくつかの小さな警告:
要するに、ProGuardまたはJavascriptInterfaceで間違ったことをしているとすぐには思いません。私は、大部分のレポートの根本原因としてファームウェアを非難することに非常に強く傾倒しており、その結果、スムーズなアップデートプロセスが、一部のアプリを完全にクラッシュさせるプロセスになります。
編集:さらにテストを実行しましたが、クラッシュしなかったデバイスはすべて5.0または5.0.1でしたが、クラッシュしたデバイスはすべて5.0.2だったため、 OEMを気楽に指さすことはもうありません。
これはAndroidのchrome更新時に発生します。更新中、パッケージはインストール済みとしてカウントされないため、パッケージマネージャーで検索しようとすると失敗します。
私の場合、実際にデバイスを再起動/再起動するまで(アプリがクラッシュし続けました)、それで問題ありません。
コードに問題はありません。更新の処理方法だけです。
ソース: https://bugs.chromium.org/p/chromium/issues/detail?id=506369