Android Google Tag Manager 死锁造成 ANR

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,626评论 25 709
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,463评论 19 139
  • 儿子挺调皮的,为了帮儿子改习惯,我认真的跟着老师学习,写亲子日记,坚持了二十多天了,在家校合育大群里,也发了十多天...
    子瀚璐菡妈妈阅读 1,488评论 0 1
  • 我们都知道,现实社会是复杂的,因为它涵盖的方方面面太多了。这个世界要想读懂它,并不是简单的一个概念就能解释清楚的...
    美丽的清晨阅读 1,651评论 0 1
  • 我所住的宿舍楼内有来自不同国家的学生,大家各忙各的学业,各过各的生活,彼此也没有太多交集。有时候,七八个来自不同国...
    827943a9c996阅读 2,523评论 0 1