项目中用到了 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);
发现有部分机型(尤其是华为)会出现 App 启动的时候出现 ANR 的情况。
查看 ANR Log 发现死锁情况
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() 有可能造成死锁,应该是和 GooglePlayService 的版本有关。要避免死锁的话不要在初始化的时候去调用 refresh 方法,删掉 refresh 即可(有变化的话本地的 Container 一般在 Release 的时候去更新,随时修改的可能性比较小,就算需要修改 refresh 方法默认会隔 12 小时调用一次,修改的内容同样会得到更新)。