1. 背景
项目中采用了 new WebView 的方案初始化,再添加到 WebViewContainer,上线后,报了个崩溃问题,记录下。
2. 问题堆栈
Fatal Exception: android.content.res.Resources$NotFoundException: String resource ID #0x2040003
at android.content.res.Resources.getText(Resources.java:322)
at android.content.res.Resources.getString(Resources.java:420)
at com.android.org.chromium.content.browser.ContentViewCore.setContainerView(ContentViewCore.java:684)
at com.android.org.chromium.content.browser.ContentViewCore.initialize(ContentViewCore.java:608)
at com.android.org.chromium.android_webview.AwContents.createAndInitializeContentViewCore(AwContents.java:674)
at com.android.org.chromium.android_webview.AwContents.setNewAwContents(AwContents.java:823)
at com.android.org.chromium.android_webview.AwContents.<init>(AwContents.java:662)
at com.android.org.chromium.android_webview.AwContents.<init>(AwContents.java:597)
at com.android.webview.chromium.WebViewChromium.initForReal(WebViewChromium.java:319)
at com.android.webview.chromium.WebViewChromium.access$100(WebViewChromium.java:104)
at com.android.webview.chromium.WebViewChromium$1.run(WebViewChromium.java:271)
at com.android.webview.chromium.WebViewChromium$WebViewChromiumRunQueue.drainQueue(WebViewChromium.java:131)
at com.android.webview.chromium.WebViewChromium$WebViewChromiumRunQueue$1.run(WebViewChromium.java:118)
at com.android.org.chromium.base.ThreadUtils.runOnUiThread(ThreadUtils.java:144)
at com.android.webview.chromium.WebViewChromium$WebViewChromiumRunQueue.addTask(WebViewChromium.java:115)
at com.android.webview.chromium.WebViewChromium.init(WebViewChromium.java:268)
at android.webkit.WebView.<init>(WebView.java:591)
at android.webkit.WebView.<init>(WebView.java:526)
at android.webkit.WebView.<init>(WebView.java:509)
at android.webkit.WebView.<init>(WebView.java:496)
at android.webkit.WebView.<init>(WebView.java:486)
问题发生在安卓5.0 的手机上。
3. 原因分析:
Context.getAssets() 和 Context.getResources().getAssets() 返回不相同的 AssetManager 对象。 Context.getAssets()返回的 AssetManager无法访问其他包(包括系统WebView包)中的资源,导致 WebView 崩溃。
4. 解决方案:
网上对该问题的解决:依赖 androidx.appcompat:appcompat:1.1.0,在5.0系统 webview 的存在这样bug,可以升级 androidx.appcompat:appcompat 解决。
此外,如果项目中升级 androidx.appcompat:appcompat 成本高,可以在 WebView Activity 重写方法getAssets,如下:
@Override
public AssetManager getAssets() {
if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP_MR1) {
return getResources().getAssets();
} else {
return super.getAssets();
}
}