項(xiàng)目中用到了 GTM,在 Application 中有 GTM 的初始化操作,如下
TagManager tagManager = TagManager.getInstance(context);
tagManager.setVerboseLoggingEnabled(true);
PendingResult<ContainerHolder> pending =
tagManager.loadContainerPreferNonDefault(context.getString(R.string.gtm_container_id),
R.raw.gtm_container);
pending.setResultCallback(containerHolder -> {
ContainerHolderSingleton.setContainerHolder(containerHolder);
ContainerHolderSingleton.getContainerHolder().refresh();
}, 2, TimeUnit.SECONDS);
發(fā)現(xiàn)有部分機(jī)型(尤其是華為)會出現(xiàn) App 啟動的時(shí)候出現(xiàn) ANR 的情況。
查看 ANR Log 發(fā)現(xiàn)死鎖情況
main
waiting to lock <0x0c4d723e>
locked <0x0fbcb89f>
pool-5-thread-1
waiting to lock <0x0fbcb89f>
locked <0x0c4d723e>
并且 Log 中有定位到下面一行
ContainerHolderSingleton.getContainerHolder().refresh();
Google 了一下蛋逾,有類似情況 https://productforums.google.com/forum/#!topic/tag-manager/wlPpNKPXvu8凝垛。
意思就是說 refresh() 有可能造成死鎖懊悯,應(yīng)該是和 GooglePlayService 的版本有關(guān)蜓谋。要避免死鎖的話不要在初始化的時(shí)候去調(diào)用 refresh 方法,刪掉 refresh 即可(有變化的話本地的 Container 一般在 Release 的時(shí)候去更新炭分,隨時(shí)修改的可能性比較小桃焕,就算需要修改 refresh 方法默認(rèn)會隔 12 小時(shí)調(diào)用一次,修改的內(nèi)容同樣會得到更新)捧毛。