Android Google Tag Manager 死锁造成 ANR

项目中用到了 GTM,在 Application 中有 GTM 的初始化操作,如下

TagManager tagManager = TagManager.getInstance(context);
tagManager.setVerboseLoggingEnabled(true);

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

你可能感兴趣的:(Android Google Tag Manager 死锁造成 ANR)