美文网首页
Android Google Tag Manager 死锁造成

Android Google Tag Manager 死锁造成

作者: teletian | 来源:发表于2017-04-25 15:45 被阅读136次

    项目中用到了 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 Google Tag Manager 死锁造成

          本文链接:https://www.haomeiwen.com/subject/tgmvzttx.html