Failed to load WebView provider: No WebView installed

系统中已经集成了Chrome及WebviewGoogle,但是在打开个别使用到WebView的应用的时候,还是会出现应用FC,如:

Setting->System->About phone->Legal information,点击Thirdpart licenses等会出现FC。

且在开发者选项中WebView implementation那一条上会显示none,正常来说是显示Chrome。

直接上log:

01-02 03:05:31.501 25622 25622 E WebViewFactory: Chromium WebView package does not exist
01-02 03:05:31.501 25622 25622 E WebViewFactory: android.webkit.WebViewFactory$MissingWebViewPackageException: Failed to load WebView provider: No WebView installed
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at android.webkit.WebViewFactory.getWebViewContextAndSetProvider(WebViewFactory.java:319)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at android.webkit.WebViewFactory.getProviderClass(WebViewFactory.java:383)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at android.webkit.WebViewFactory.getProvider(WebViewFactory.java:194)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at android.webkit.WebView.getFactory(WebView.java:2530)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at android.webkit.WebView.ensureProviderCreated(WebView.java:2525)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at android.webkit.WebView.setOverScrollMode(WebView.java:2590)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at android.view.View.<init>(View.java:4574)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at android.view.View.<init>(View.java:4706)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at android.view.ViewGroup.<init>(ViewGroup.java:597)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at android.widget.AbsoluteLayout.<init>(AbsoluteLayout.java:55)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at android.webkit.WebView.<init>(WebView.java:643)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at android.webkit.WebView.<init>(WebView.java:588)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at android.webkit.WebView.<init>(WebView.java:571)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at android.webkit.WebView.<init>(WebView.java:558)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at java.lang.reflect.Constructor.newInstance0(Native Method)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at java.lang.reflect.Constructor.newInstance(Constructor.java:334)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at android.view.LayoutInflater.createView(LayoutInflater.java:647)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at com.android.internal.policy.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:58)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at android.view.LayoutInflater.onCreateView(LayoutInflater.java:720)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:788)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:419)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at android.app.Activity.setContentView(Activity.java:2715)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at com.android.htmlviewer.HTMLViewerActivity.onCreate(HTMLViewerActivity.java:58)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at android.app.Activity.performCreate(Activity.java:7091)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at android.app.Activity.performCreate(Activity.java:7082)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1215)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2734)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2859)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at android.app.ActivityThread.-wrap11(Unknown Source:0)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1592)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at android.os.Handler.dispatchMessage(Handler.java:106)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at android.os.Looper.loop(Looper.java:164)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at android.app.ActivityThread.main(ActivityThread.java:6518)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at java.lang.reflect.Method.invoke(Native Method)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
01-02 03:05:31.501 25622 25622 E WebViewFactory: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
01-02 03:05:31.503 25622 25622 D AndroidRuntime: Shutting down VM
--------- beginning of crash
01-02 03:05:31.504 25622 25622 E AndroidRuntime: FATAL EXCEPTION: main
01-02 03:05:31.504 25622 25622 E AndroidRuntime: Process: com.android.htmlviewer, PID: 25622
01-02 03:05:31.504 25622 25622 E AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.htmlviewer/com.android.htmlviewer.HTMLViewerActivity}: android.view.InflateException: Binary XML file line #22: Binary XML file line #22: Error inflating class android.webkit.WebView
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2781)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2859)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at android.app.ActivityThread.-wrap11(Unknown Source:0)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1592)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at android.os.Handler.dispatchMessage(Handler.java:106)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at android.os.Looper.loop(Looper.java:164)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at android.app.ActivityThread.main(ActivityThread.java:6518)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at java.lang.reflect.Method.invoke(Native Method)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: Caused by: android.view.InflateException: Binary XML file line #22: Binary XML file line #22: Error inflating class android.webkit.WebView
01-02 03:05:31.504 25622 25622 E AndroidRuntime: Caused by: android.view.InflateException: Binary XML file line #22: Error inflating class android.webkit.WebView
01-02 03:05:31.504 25622 25622 E AndroidRuntime: Caused by: java.lang.reflect.InvocationTargetException
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at java.lang.reflect.Constructor.newInstance0(Native Method)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at java.lang.reflect.Constructor.newInstance(Constructor.java:334)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at android.view.LayoutInflater.createView(LayoutInflater.java:647)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at com.android.internal.policy.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:58)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at android.view.LayoutInflater.onCreateView(LayoutInflater.java:720)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:788)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:419)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at android.app.Activity.setContentView(Activity.java:2715)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at com.android.htmlviewer.HTMLViewerActivity.onCreate(HTMLViewerActivity.java:58)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at android.app.Activity.performCreate(Activity.java:7091)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at android.app.Activity.performCreate(Activity.java:7082)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1215)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2734)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2859)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at android.app.ActivityThread.-wrap11(Unknown Source:0)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1592)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at android.os.Handler.dispatchMessage(Handler.java:106)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at android.os.Looper.loop(Looper.java:164)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at android.app.ActivityThread.main(ActivityThread.java:6518)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at java.lang.reflect.Method.invoke(Native Method)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: Caused by: android.util.AndroidRuntimeException: android.webkit.WebViewFactory$MissingWebViewPackageException: Failed to load WebView provider: No WebView installed
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at android.webkit.WebViewFactory.getProviderClass(WebViewFactory.java:423)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at android.webkit.WebViewFactory.getProvider(WebViewFactory.java:194)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at android.webkit.WebView.getFactory(WebView.java:2530)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at android.webkit.WebView.ensureProviderCreated(WebView.java:2525)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at android.webkit.WebView.setOverScrollMode(WebView.java:2590)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at android.view.View.<init>(View.java:4574)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at android.view.View.<init>(View.java:4706)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at android.view.ViewGroup.<init>(ViewGroup.java:597)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at android.widget.AbsoluteLayout.<init>(AbsoluteLayout.java:55)
01-02 03:05:31.504 25622 25622 E AndroidRuntime: 	at android.webkit.WebView.<init>(WebView.java:643)
01-02 03:05:31.505 25622 25622 E AndroidRuntime: 	at android.webkit.WebView.<init>(WebView.java:588)
01-02 03:05:31.505 25622 25622 E AndroidRuntime: 	at android.webkit.WebView.<init>(WebView.java:571)
01-02 03:05:31.505 25622 25622 E AndroidRuntime: 	at android.webkit.WebView.<init>(WebView.java:558)
01-02 03:05:31.505 25622 25622 E AndroidRuntime: 	... 28 more
01-02 03:05:31.505 25622 25622 E AndroidRuntime: Caused by: android.webkit.WebViewFactory$MissingWebViewPackageException: Failed to load WebView provider: No WebView installed
01-02 03:05:31.505 25622 25622 E AndroidRuntime: 	at android.webkit.WebViewFactory.getWebViewContextAndSetProvider(WebViewFactory.java:319)
01-02 03:05:31.505 25622 25622 E AndroidRuntime: 	at android.webkit.WebViewFactory.getProviderClass(WebViewFactory.java:383)
01-02 03:05:31.505 25622 25622 E AndroidRuntime: 	... 40 more
01-02 03:05:31.509 17549 17633 W ActivityManager:   Force finishing activity com.android.htmlviewer/.HTMLViewerActivity

因为现在都是使用的Chrome中自带的Webview,一般来说集成了Chrome的话是不会出现这种No WebView installed问题,且系统还集成了WebviewGoogle。

我们知道,系统是通过获取config_webview_packages.xml文件中定义的WebView:在SystemImpl.java的构造函数中:

private SystemImpl() {
        int numFallbackPackages = 0;
        int numAvailableByDefaultPackages = 0;
        int numAvByDefaultAndNotFallback = 0;
        XmlResourceParser parser = null;
        List<WebViewProviderInfo> webViewProviders = new ArrayList<WebViewProviderInfo>();
        try {
            parser = AppGlobals.getInitialApplication().getResources().getXml(
                    com.android.internal.R.xml.config_webview_packages);//解析这个文件
            XmlUtils.beginDocument(parser, TAG_START);
            while(true) {
                XmlUtils.nextElement(parser);
                String element = parser.getName();
                if (element == null) {
                    break;
                }
                if (element.equals(TAG_WEBVIEW_PROVIDER)) {
                    String packageName = parser.getAttributeValue(null, TAG_PACKAGE_NAME);
                    if (packageName == null) {
                        throw new AndroidRuntimeException(
                                "WebView provider in framework resources missing package name");
                    }
                    String description = parser.getAttributeValue(null, TAG_DESCRIPTION);
                    if (description == null) {
                        throw new AndroidRuntimeException(
                                "WebView provider in framework resources missing description");
                    }
                    boolean availableByDefault = "true".equals(
                            parser.getAttributeValue(null, TAG_AVAILABILITY));//availableByDefault要为true
                    boolean isFallback = "true".equals(
                            parser.getAttributeValue(null, TAG_FALLBACK));//isFallback 要为true
                    WebViewProviderInfo currentProvider = new WebViewProviderInfo(
                            packageName, description, availableByDefault, isFallback,
                            readSignatures(parser));
                    if (currentProvider.isFallback) {
                        numFallbackPackages++;
                        if (!currentProvider.availableByDefault) {
                            throw new AndroidRuntimeException(
                                    "Each WebView fallback package must be available by default.");
                        }
                        if (numFallbackPackages > 1) {
                            throw new AndroidRuntimeException(
                                    "There can be at most one WebView fallback package.");
                        }
                    }
                    if (currentProvider.availableByDefault) {
                        numAvailableByDefaultPackages++;
                        if (!currentProvider.isFallback) {
                            numAvByDefaultAndNotFallback++;
                        }
                    }
                    webViewProviders.add(currentProvider);
                }
                else {
                    Log.e(TAG, "Found an element that is not a WebView provider");
                }
            }
        } catch (XmlPullParserException | IOException e) {
            throw new AndroidRuntimeException("Error when parsing WebView config " + e);
        } finally {
            if (parser != null) parser.close();
        }
        if (numAvailableByDefaultPackages == 0) {
            throw new AndroidRuntimeException("There must be at least one WebView package "
                    + "that is available by default");
        }
        if (numAvByDefaultAndNotFallback == 0) {
            throw new AndroidRuntimeException("There must be at least one WebView package "
                    + "that is available by default and not a fallback");
        }
        mWebViewProviderPackages =
                webViewProviders.toArray(new WebViewProviderInfo[webViewProviders.size()]);
    }

然后查看frameworks/base/core/res/res/xml/config_webview_packages.xml文件中对使用的webview进行声明,仅仅只有:

<webviewprovider description="Android WebView" packageName="com.android.webview" availableByDefault="true">

然后把设备中的frameworks-res.apk拉取出来,反编译资源文件后查看config_webview_packages.xml中的配置,跟frameworks/base/core/res/res/xml/config_webview_packages.xml文件是一致的,所以确定了就是由于config_webview_packages.xml没有配置好导致。

接着查看集成GMS包的地方是否有进行overlay,一般集成GMS包的路径为:vendor/partner_gms,overlay一般是放在这个路径的/products/gms_overlay等路径下(Google释放出来的GMS包中各个路径就是这样的),查看这个路径下的overlay,发现是没有对config_webview_packages.xml进行覆盖的。

那这样的话系统就是使用的frameworks/base/core/res/res/xml/config_webview_packages.xml文件中申明的webview,但是查看

SystemImpl中对config_webview_packages.xml的解析,frameworks/base/core/res/res/xml/config_webview_packages.xml是没有满足条件的webview的(需要availableByDefault="true" isFallback="true")。所以系统会报出Chromium WebView package does not exist。

故需要把Chrome及WebviewGoogle添加进去:

<webviewproviders>
    <!-- The default WebView implementation -->
    <!--[BUGFIX]-Mod-BEGIN by mengqin.zhang,09/29/2018,task 7040859-->
    <!--<webviewprovider description="Android WebView" packageName="com.android.webview" availableByDefault="true">
    </webviewprovider>-->
    <webviewprovider description="Chrome Stable" packageName="com.android.chrome" availableByDefault="true">
        <!-- Ignore this package on user/release builds unless preinstalled. -->
    </webviewprovider>
    <webviewprovider description="Google WebView" packageName="com.google.android.webview" availableByDefault="true" isFallback="true">
        <!-- Ignore this package on user/release builds unless preinstalled. -->
    </webviewprovider>
    <!--[BUGFIX]-Mod-END by mengqin.zhang,09/29/2018,task 7040859-->
</webviewproviders>

这样就OK啦~

其实出现这个问题的根本原因是集成GMS包的同事没有把GMS包中product目录下的overlay集成完整,一般来说,GMS包中提供的overlay(vendor/partner_gms/products/webview_overlay/frameworks/base/core/res/res/xml/config_webview_packages.xml)会覆盖frameworks/base/core/res/res/xml/config_webview_packages.xml文件,GMS包中提供的config_webview_packages.xml内容为:

<?xml version="1.0" encoding="utf-8"?>
<!-- WebView providers in order of preference -->
<!-- Signature checks are ignored if the package is preinstalled or if this is a userdebug or eng
    build. If no signature is provided, the package can provide a WebView implementation only on userdebug/eng builds or if it's preinstalled -->
<webviewproviders>
    <webviewprovider description="Chrome Stable" packageName="com.android.chrome" availableByDefault="true">
        <!-- Ignore this package on user/release builds unless preinstalled. -->
    </webviewprovider>
    <webviewprovider description="Google WebView" packageName="com.google.android.webview" availableByDefault="true" isFallback="true">
        <!-- Ignore this package on user/release builds unless preinstalled. -->
    </webviewprovider>
    <webviewprovider description="Chrome Beta" packageName="com.chrome.beta">
        <signature>xxxxx签名是有的,省略啦~~~~~~</signature>
    </webviewprovider>
    <webviewprovider description="Chrome Dev" packageName="com.chrome.dev">
        <signature>xxxxxxx签名是有的,省略啦~~~~~~</signature>
    </webviewprovider>
    <webviewprovider description="Chrome Canary" packageName="com.chrome.canary">
        <signature>xxxxxxxx签名是有的,省略啦~~~~~~</signature>
    </webviewprovider>
    <webviewprovider description="Chrome Debug" packageName="com.google.android.apps.chrome">
        <!-- Ignore this package on user/release builds unless preinstalled. -->
    </webviewprovider>
</webviewproviders>

另,如果在GMS包overlay中没有提供这个config_webview_packages.xml,且frameworks/base/core/res/res/xml/config_webview_packages.xml也只有默认的Android WebView,没有声明以上六个Chrome及WebView,还会导致CTS/GTS跑不过~

猜你喜欢

转载自blog.csdn.net/hanhan1016/article/details/82994244
今日推荐