web-dev-qa-db-ja.com

NameNotFoundException webview

一部のデバイスで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);
        }
    }
108

これは、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デバイスからのものです)突然突然クラッシュしました。私のテスト方法:

  1. アプリを開き、WebViewが表示されていることを確認します。
  2. Playストアを開き、「マイアプリ」に移動して、「AndroidシステムWebView」を表示します。更新プログラムをアンインストールします。これでクラッシュすることはありませんが、アプリの強制再起動が表示されるはずです。
  3. アプリをバックアップして開き、再起動から回復させます。
  4. Playストアに戻り、Android System WebViewを更新します。
  5. 更新プロセス中にアプリに再度焦点を合わせます。影響を受けるデバイスを使用している場合、クラッシュするはずです。そうでない場合、アプリはバックグラウンドにプッシュされ、静かに再起動されます。

私がこれまでに言ったことに関するいくつかの小さな警告:

  • 私たちのアプリは、WebViewを非常に早く起動するという間違いを犯します。そのため、クラッシュメッセージに「アプリケーションを作成できません」と表示されます。ユーザーは、クラッシュするためにアプリを見る必要さえありません。これはあなたには当てはまらないと思いますが、このシナリオでアプリがWebViewを含むアクティビティを再起動しようとすると、それが説明されます。
  • レポートの100%は5.0デバイスからのものであり、Lollipopの下でこれがどのように発生するのか、まったくわかりません。
  • Nexus 4とNexus 5でこのエラーが報告されているので、これらのデバイスで再現できない理由はわかりません。別の根本的な原因かもしれませんが、それをさらに検討する必要があります。

要するに、ProGuardまたはJavascriptInterfaceで間違ったことをしているとすぐには思いません。私は、大部分のレポートの根本原因としてファームウェアを非難することに非常に強く傾倒しており、その結果、スムーズなアップデートプロセスが、一部のアプリを完全にクラッシュさせるプロセスになります。

編集:さらにテストを実行しましたが、クラッシュしなかったデバイスはすべて5.0または5.0.1でしたが、クラッシュしたデバイスはすべて5.0.2だったため、 OEMを気楽に指さすことはもうありません。

96
Riley C

これはAndroidのchrome更新時に発生します。更新中、パッケージはインストール済みとしてカウントされないため、パッケージマネージャーで検索しようとすると失敗します。

私の場合、実際にデバイスを再起動/再起動するまで(アプリがクラッシュし続けました)、それで問題ありません。

コードに問題はありません。更新の処理方法だけです。

ソース: https://bugs.chromium.org/p/chromium/issues/detail?id=506369

0