Android P 行為變更對 WebView 的影響

年前遇到的這個問題霞势,今天年后第一天上班,在驗證別的問題的時候突然想到年前解決的這個問題厅贪,一時竟想不起當(dāng)時怎么解決的了泣崩,翻看代碼思考了一會兒才想起來睬愤,特在此記錄下劲蜻。

統(tǒng)計到的錯誤日志如下:

Process Name: 'com.xxxx.xxx’
Thread Name: 'main'
Back traces starts.

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.xxxx.xxxx/com.xuetian.player.player.live.LivePlayDocActivity}: android.view.InflateException: Binary XML file line #7 in com.xxx.xxx:layout/intro_layout: Binary XML file line #7 in com.xxx.xxx:layout/intro_layout: Error inflating class com.xuetian.common.ui.lib.widget.LollipopFixedWebView

at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3504)

at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3643)

at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)

at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:140)

at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:100)

at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2229)

at android.os.Handler.dispatchMessage(Handler.java:107)

at android.os.Looper.loop(Looper.java:238)

at android.app.ActivityThread.main(ActivityThread.java:7798)

at java.lang.reflect.Method.invoke(Native Method)

at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:512)

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:995)

Caused by: android.view.InflateException: Binary XML file line #7 in com.xxx.xxx:layout/intro_layout: Binary XML file line #7 in com.xxx.xxx:layout/intro_layout: Error inflating class com.xuetian.common.ui.lib.widget.LollipopFixedWebView

Caused by: android.view.InflateException: Binary XML file line #7 in com.xxx.xxx:layout/intro_layout: Error inflating class com.xuetian.common.ui.lib.widget.LollipopFixedWebView

Caused by: java.lang.reflect.InvocationTargetException

at java.lang.reflect.Constructor.newInstance0(Native Method)

at java.lang.reflect.Constructor.newInstance(Constructor.java:343)

at android.view.LayoutInflater.createView(LayoutInflater.java:855)

at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:1008)

at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:963)

at android.view.LayoutInflater.rInflate(LayoutInflater.java:1125)

at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1086)

at android.view.LayoutInflater.inflate(LayoutInflater.java:682)

at android.view.LayoutInflater.inflate(LayoutInflater.java:534)

at com.xuetian.player.player.live.LiveIntroComponent.initIntroView(LiveIntroComponent.java:38)

at com.xuetian.player.player.live.LiveIntroComponent.<init>(LiveIntroComponent.java:28)

at com.xuetian.player.player.live.LivePlayDocActivity.initIntroLayout(LivePlayDocActivity.java:699)

at com.xuetian.player.player.live.LivePlayDocActivity.initComponents(LivePlayDocActivity.java:678)

at com.xuetian.player.player.live.LivePlayDocActivity.initViewPager(LivePlayDocActivity.java:564)

at com.xuetian.player.player.live.LivePlayDocActivity.onCreate(LivePlayDocActivity.java:141)

at android.app.Activity.performCreate(Activity.java:7963)

at android.app.Activity.performCreate(Activity.java:7952)

at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1307)

at com.qiyukf.unicorn.i.a.callActivityOnCreate(Unknown Source:2)

at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3479)

at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3643)

at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)

at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:140)

at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:100)

at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2229)

at android.os.Handler.dispatchMessage(Handler.java:107)

at android.os.Looper.loop(Looper.java:238)

at android.app.ActivityThread.main(ActivityThread.java:7798)

at java.lang.reflect.Method.invoke(Native Method)

at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:512)

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:995)

Caused by: java.lang.RuntimeException: Using WebView from more than one process at once with the same data directory is not supported. https://crbug.com/558377

at org.chromium.android_webview.AwBrowserProcess.b(PG:11)

at D5.m(PG:33)

at D5.a(PG:48)

at D5.b(PG:16)

at com.android.webview.chromium.WebViewChromiumFactoryProvider.a(PG:32)

at com.android.webview.chromium.WebViewChromium.init(PG:12)

at android.webkit.WebView.<init>(WebView.java:435)

at android.webkit.WebView.<init>(WebView.java:359)

at android.webkit.WebView.<init>(WebView.java:342)

at android.webkit.WebView.<init>(WebView.java:329)

at com.xuetian.common.ui.lib.widget.LollipopFixedWebView.<init>(LollipopFixedWebView.java:24)

... 31 more

Back traces ends.

1疫蔓、Android Pie 行為變更——按進(jìn)程分設(shè)基于網(wǎng)絡(luò)的數(shù)據(jù)目錄

為改善 Android 9 中的應(yīng)用穩(wěn)定性和數(shù)據(jù)完整性身冬,應(yīng)用無法再讓多個進(jìn)程共用同一 WebView 數(shù)據(jù)目錄。 此類數(shù)據(jù)目錄一般存儲 Cookie滚躯、HTTP 緩存以及其他與網(wǎng)絡(luò)瀏覽有關(guān)的持久性和臨時性存儲嘿歌。
在大多數(shù)情況下,您的應(yīng)用只應(yīng)在一個進(jìn)程中使用 android.webkit 軟件包中的類丧凤,例如 WebView 和 CookieManager步脓。 例如,您應(yīng)該將所有使用 WebView 的 Activity 對象移入同一進(jìn)程仍侥。 您可以通過在應(yīng)用的其他進(jìn)程中調(diào)用 disableWebView()鸳君,更嚴(yán)格地執(zhí)行"僅限一個進(jìn)程”規(guī)則。該調(diào)用可防止 WebView 在這些其他進(jìn)程中被錯誤地初始化腿时,即使是從依賴內(nèi)容庫進(jìn)行的調(diào)用也能防止。
如果您的應(yīng)用必須在多個進(jìn)程中使用 WebView 的實例批糟,則必須先利用 WebView.setDataDirectorySuffix() 函數(shù)為每個進(jìn)程指定唯一的數(shù)據(jù)目錄后綴徽鼎,然后再在該進(jìn)程中使用 WebView 的給定實例。 該函數(shù)會將每個進(jìn)程的網(wǎng)絡(luò)數(shù)據(jù)放入其在應(yīng)用數(shù)據(jù)目錄內(nèi)自己的目錄中悄但。
注意:即使您使用 setDataDirectorySuffix()石抡,系統(tǒng)也不會跨應(yīng)用的進(jìn)程界限共享 Cookie 以及其他網(wǎng)絡(luò)數(shù)據(jù)。 如果應(yīng)用中的多個進(jìn)程需要訪問同一網(wǎng)絡(luò)數(shù)據(jù)嚎京,您需要自行在這些進(jìn)程之間復(fù)制數(shù)據(jù)隐解。 例如,您可以調(diào)用 getCookie()setCookie()帕涌,在不同進(jìn)程之間手動傳輸 Cookie 數(shù)據(jù)蚓曼。

這個問題在去年初就遇到解決了一次炸宵,解決方式為在Application的oncreat方法里調(diào)用如下代碼:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
  String processName =getProcessName();                            
  if(processName.equals("com.xxx.xxx")){
    WebView.setDataDirectorySuffix(processName);
  }
}

當(dāng)時按這種方式解決之后錯誤日志統(tǒng)計也就沒再出現(xiàn)過該錯誤土全。直到去年底使用了加固服務(wù)之后突然又出現(xiàn)了該錯誤,錯誤率飆到了1.9%裹匙,不由得龍脊一緊。當(dāng)時懷疑是加固的問題籽御,但是手上沒有手機能復(fù)現(xiàn)該問題,使用錯誤統(tǒng)計的相同機型(機型版本:PCHM10铃将、PCLM50等)都復(fù)現(xiàn)不了哑梳。后來終于找到一個同事的手機復(fù)現(xiàn)了這個問題,而且是畢現(xiàn)(一加手機:OnePlus 9R)悯仙。

從再次遇到這個問題到徹底解決這個問題耗費了將近一天的時間吠卷,期間甚至懷疑剛購買的加固服務(wù)導(dǎo)致的。不過好在解決了货岭,使得錯誤率降低到了現(xiàn)在可接受的 0.09%序攘,下面大概說一下具體情況寻拂。

2、經(jīng)過多種嘗試最終發(fā)現(xiàn)以下方式可以解決

開始解決代碼:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
  String processName =getProcessName();                            
  if(processName.equals("com.xxx.xxx")){
    WebView.setDataDirectorySuffix(processName);
  }
}

修改后最終解決代碼:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
  String processName =getProcessName(); 
  WebView.setDataDirectorySuffix(processName);
}

該設(shè)備機型與系統(tǒng)WebView版本見下圖:

00e2a34c-feb1-4e1f-add7-bcd1632b52f9.jpg

4fc19753797e61b40c357a2fcbb581cb.jpg
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末慌核,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子垫桂,更是在濱河造成了極大的恐慌粟按,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疼鸟,死亡現(xiàn)場離奇詭異庙曙,居然都是意外死亡,警方通過查閱死者的電腦和手機吴攒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門洼怔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人茴厉,你說我怎么就攤上這事』晨幔” “怎么了嗜闻?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵琉雳,是天一觀的道長。 經(jīng)常有香客問我翠肘,道長束倍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任甥桂,我火速辦了婚禮邮旷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘办陷。我一直安慰自己狡孔,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布殃恒。 她就那樣靜靜地躺著,像睡著了一般病附。 火紅的嫁衣襯著肌膚如雪亥鬓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天覆积,我揣著相機與錄音熟呛,去河邊找鬼。 笑死吗冤,一個胖子當(dāng)著我的面吹牛九府,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播肺蔚,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼勾怒,長吁一口氣:“原來是場噩夢啊……” “哼笔链!你這毒婦竟也來了腮猖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤坪创,失蹤者是張志新(化名)和其女友劉穎姐赡,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體依沮,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了辜限。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡氧急,死狀恐怖毫深,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情钾恢,我是刑警寧澤鸳址,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布稿黍,位于F島的核電站,受9級特大地震影響巡球,放射性物質(zhì)發(fā)生泄漏酣栈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一起便、第九天 我趴在偏房一處隱蔽的房頂上張望窖维。 院中可真熱鬧榆综,春花似錦铸史、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽水评。三九已至中燥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間疗涉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工绽淘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留沪铭,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓偏瓤,卻偏偏與公主長得像杀怠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子厅克,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容