1.緒論
Binary XML file line #29: Error inflating class android.webkit.WebView…這種錯誤,你見過麼?最近公司應用(雲電腦)在各個應用市場比較火,用的人也多,在後臺統計的錯誤日誌裏,出現了個奇葩的bug,它就是WebView加載網頁閃退bug。大部分出現在一加、三星、OPPO手機中,不知道大家有沒有遇到過,下面是錯誤詳細信息:
android.view.InflateException: Binary XML file line #29: Error inflating class android.webkit.WebView
at android.view.LayoutInflater.createView(LayoutInflater.java:620)
at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:57)
at android.view.LayoutInflater.onCreateView(LayoutInflater.java:669)
...//由於篇幅原因,省略無關錯誤日誌
Caused by: java.lang.UnsupportedOperationException
at com.android.webview.nullwebview.NullWebViewFactoryProvider.createWebView(NullWebViewFactoryProvider.java:41)
at android.webkit.WebView.ensureProviderCreated(WebView.java:2058)
at android.webkit.WebView.setOverScrollMode(WebView.java:2116)
at android.view.View.<init>(View.java:3461)
at android.view.View.<init>(View.java:3517)
at android.view.ViewGroup.<init>(ViewGroup.java:470)
at android.widget.AbsoluteLayout.<init>(AbsoluteLayout.java:52)
at android.webkit.WebView.<init>(WebView.java:498)
下面是引用WebView的佈局文件:
好可怕!WebView是系統api提供的,竟然會找不到!這個時候,好方…….
我們可能會想到手機系統出現問題了,有可能是用戶刷系統了,或者用戶把手機root後系統弄壞了,還有可能就是廠商定製的手機系統本身就存在問題。
2.解決思路
對於上面的猜想,歸納起來就是手機系統有問題了。我們可能想到的解決辦法就是不用系統的webView,用第三方的網頁加載庫實現功能,比如騰訊提供的瀏覽器內核SDK,如果你需求只是用來加載網頁,功能簡單的話,這個是可行的,如果需要實現複雜的功能,那這個SDK也是會有很多坑,其中這個SDK不支持64位運行環境的。
剛猜測手機系統出現問題了,那爲什麼手機自帶瀏覽器訪問網頁又沒事呢?看來我們得去研究下自帶瀏覽器了,我們拿出現過這個異常的手機把它root掉,然後拷出自帶瀏覽器apk,進行反編譯,查看源碼…這個過程有些繁瑣就不講解了,直接說結果,結果如下:
手機自帶瀏覽器也是用系統api的webView來實現加載網頁的。
擦…你這不是在撮我麼?那系統就沒問題纔對啊?
還沒說完,別激動!
其實這個就可以說明系統還是有webView這個api的,我無意間看到手機自帶瀏覽器的libs目錄下發現沒有64位庫的文件夾如:arm64-v8a、mips64、x86_64,那這就說明這個應用只支持32位運行環境。由此 大概可以猜想我們應用爲啥在這個手機上報錯了。
首先,這個手機是支持64位的,然後我們應用也適配了64位運行環境,那我們應用就是在64位運行環境下運行,然而打開網頁就報錯了。
報錯就說明系統提供的webView Api 只能在32位運行環境下運行,不兼容64位。
那麼 這問題怎麼解呢?
我們可以把應用裏適配的64位系統的庫和目錄全刪掉,試試…
經過驗證,是沒問題的,可以正常打開網頁。不過讓64位系統運行32位的應用,性能會有點點損失的。
到這裏分析就結束了,如果有什麼疑問,歡迎留言交流!如果沒有的話就給筆者點個讚唄! ^_^