android webview這個坑貨-之一

android上webivew是個坑貨,無疑!以前就曾出現(xiàn)過好幾次莫名其妙的發(fā)出signal退出進(jìn)程的例子,你退就退對應(yīng)的activity就行了,為啥要把整個進(jìn)程干掉?這回遇到的是一個crash,基本都在8.x機(jī)器上,而且絕大部分都是華為和榮耀機(jī)器,比如DUB-AL00占比三分之一。堆棧如下:

>>> backtrace <<<
#00 pc 014a2d98  /data/hw_init/system/app/WebViewGoogle/WebViewGoogle.apk!libwebviewchromium.so (offset 0x44f9000)
>>> registers <<<
r0  ba5b37b4  r1  ba5b37b4  r2  00004cce  r3  ce4fffe9
r4  00004d44  r5  d00906e8  r6  13c80010  r7  b8abe5e8
r8  13c801c8  r9  bb861800  r10 138d3f18  r11 00000000
ip  cffdb264  sp  b9f7f420  lr  ce4ffe53  pc  cec50d98

>>> stack <<<
     b9f7f3e0  e838bb40  [anon:libc_malloc]
     b9f7f3e4  00000000
     b9f7f3e8  bc4f1534  /dev/ashmem/dalvik-LinearAlloc (deleted)
     b9f7f3ec  00000043
     b9f7f3f0  ce4fffe9  /data/hw_init/system/app/WebViewGoogle/WebViewGoogle.apk!libwebviewchromium.so
     b9f7f3f4  00004d44
     b9f7f3f8  d00906e8  [anon:.bss]
     b9f7f3fc  13c80010  /dev/ashmem/dalvik-main space (region space) (deleted)
     b9f7f400  b8abe5e8  [anon:.bss]
     b9f7f404  13c801c8  /dev/ashmem/dalvik-main space (region space) (deleted)
     b9f7f408  bb861800  [anon:libc_malloc]
     b9f7f40c  ce4ffe53  /data/hw_init/system/app/WebViewGoogle/WebViewGoogle.apk!libwebviewchromium.so
     b9f7f410  d00906f0  [anon:.bss]
     b9f7f414  13c80010  /dev/ashmem/dalvik-main space (region space) (deleted)
     b9f7f418  b8abe5e8  [anon:.bss]
     b9f7f41c  cec50d83  /data/hw_init/system/app/WebViewGoogle/WebViewGoogle.apk!libwebviewchromium.so
#00  b9f7f420  d00906ec  [anon:.bss]
     b9f7f424  d00906e8  [anon:.bss]
     b9f7f428  b8abe5e8  [anon:.bss]
     b9f7f42c  cec50de5  /data/hw_init/system/app/WebViewGoogle/WebViewGoogle.apk!libwebviewchromium.so
     b9f7f430  bb861800  [anon:libc_malloc]
     b9f7f434  138d3f18  /dev/ashmem/dalvik-main space (region space) (deleted)
     b9f7f438  00000000
     b9f7f43c  e831b3a9  /system/lib/libart.so (art_jni_dlsym_lookup_stub+8)
     b9f7f440  13b4a700  /dev/ashmem/dalvik-main space (region space) (deleted)
     b9f7f444  13c80010  /dev/ashmem/dalvik-main space (region space) (deleted)
     b9f7f448  00271a65
     b9f7f44c  13b4a700  /dev/ashmem/dalvik-main space (region space) (deleted)
     b9f7f450  13c80010  /dev/ashmem/dalvik-main space (region space) (deleted)
     b9f7f454  cec4d21f  /data/hw_init/system/app/WebViewGoogle/WebViewGoogle.apk!libwebviewchromium.so (Java_org_chromium_ui_base_Clipboard_nativeInit+6)
     b9f7f458  b8abe5e8  [anon:.bss]
     b9f7f45c  b87efbad  /data/dalvik-cache/arm/data@hw_init@system@app@WebViewGoogle@WebViewGoogle.apk@classes.dex

另外還有一個信息,crash的線程是在一個我用HandlerThread寫的后臺處理線程類A,這個類調(diào)用的地方不多,大概七八處。

解決思路:
一、先復(fù)現(xiàn)
根據(jù)上報的機(jī)型model和日志里的信息,發(fā)現(xiàn)是搜索某個特定的劇后crash的,找到相應(yīng)的機(jī)器后,確實能復(fù)現(xiàn),是個第三方的劇的網(wǎng)頁,進(jìn)去后播放沒問題,但是如果做些點擊的操作就90%以上概率會crash,而且,同樣的8.x機(jī)器,非上報機(jī)型的華為或榮耀不能復(fù)現(xiàn)。
但是,同樣的機(jī)型,使用同樣sdk的公司內(nèi)另一個app卻沒事。
二、可能性

  1. sdk版本不一致,或者其它接入方面不同導(dǎo)致我們有問題,另一個app沒問題
  2. 調(diào)用方式不同導(dǎo)致兩個app異同
  3. 其它原因。

對于1,嘗試各方面對齊另一個app后,未果,一樣crash。
對于2,找遍了各種調(diào)用方式上異同,比如傳參等,未果,一樣crash
那看起來是3了,但是不敢面對這個現(xiàn)實哈哈。

嘗試通過breadpad來恢復(fù)堆棧,不可行,沒有chrome的帶symbol的so庫。
想來想去,還是回到crash本身,為啥每次都在那個線程類A里,是上報系統(tǒng)不準(zhǔn)還是確實和線程A有關(guān),反正調(diào)用A的地方也不多,那索性都給注釋了,再試,果然沒問題,那接下來就簡單了挨個排除就行了,最后發(fā)現(xiàn)是在那個線程里會讀取剪貼板的地方有問題,不讀剪貼板就行了?;剡^頭看堆棧:

/data/hw_init/system/app/WebViewGoogle/WebViewGoogle.apk!libwebviewchromium.so (Java_org_chromium_ui_base_Clipboard_nativeInit+6)

剛好可以對上,所以猜測,是非主線程里讀取了剪貼板了,導(dǎo)致webview在主線程里對剪貼板相關(guān)操作時崩潰,具體源碼沒去看了,有興趣的可以研究下。

嗯,其實一開始就應(yīng)該把線程A和堆棧里的Clipboard聯(lián)想起來的。
解決方案:
線程A里調(diào)用剪貼板的地方,換成在主線程里調(diào)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容