项目中用到了 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 小时调用一次,修改的内容同样会得到更新)。