ANR 问题详情

android_native_glue这个有bug

遇到过,目前我也不知道问题所在。 看线程有很多,有定位切后台的打印,目前我猜测是游戏切后台,还做了一堆的事情。

目前没有可复现的环境,猜测

  1. 用到了谷歌广告sdk,广告activity显示后,游戏会退后台
    2.游戏加载过程,场景比较大?或者资源比较多导致游戏启动过程阻塞了游戏线程

如果是游戏逻辑比较耗时,可以考虑合并这个pr,然后观察下

1赞

请参考这个PR的修改

这个修改需要升级ndk版本到28么?

不需要,这是GameActivity内部的bug,参考PR微改下就行

好的好的 上线看情况

@haroel @cleverpo 有结论麻烦反馈下,谢谢。

这个问题我提过issue,Cocos引擎v386已经解决了(无亲测,无法100%确定是否解决),简而言之就是把GameActivity的 ALooper_pollAll换成 ALooper_pollOnce

3.8.6之前的版本,可根据引擎的PR【推荐】或者参考我自己DIY的做法合并引擎就可以解决 AGDK/GameActivity ANR Bug · Issue #17841 · cocos/cocos-engine

如果对Android主循环感兴趣,可以看我给Google提的issue There is a bug in AGDK/android_native_app_glue that causes an ANR. [377940980] - Issue Tracker

1赞

我们也遇到了这个问题,我们用3.8.3开始使用一直存在这个ANR问题,然后我们最近也更新到了3.8.6,观察了大概10天,新版本这个ANR问题没有下降,还是存在。我们也检查过了工程里的AndroidPlatform.cpp的确改成ALooper_pollOnce了。现在应该怎么解决呢,我们用的ndk是23.2,引擎3.8.6

升到3.8.6把 ALooper_pollAll 换成 ALooper_pollOnce并不能解决这个ANR

anr 概率确认没下降? 是否有可复现的demo ?

我们没升到386,我是基于373 DIY修改的,方案不是该ALooper,跟官方不一样, AGDK/GameActivity ANR Bug · Issue #17841 · cocos/cocos-engine

1赞

确认没有下降。我们是4月25号左右更新的版本,升级到了3.8.6。观察到今天了。 我们是自己的项目在谷■后台统计的,没有单独的demo。

好的,谢谢,那我们试试这个修改

想请教一下,我看了你的修改方案,想问一下这个 onPause函数除了要新增一些代码,还要把原来的 android_app_set_activity_state(ToApp(activity), APP_CMD_PAUSE);注释掉?

是的,切换到后台,AGDK会执行onPause函数,如果还设置CMD_PAUSE,后续ALooper就会处理这个pause命令,进而可能引发ANR

我的方案是将pause状态暂存到一个状态栈,等后续process_cmd执行,优先从状态栈中读取状态处理

哦,明白了

我们使用了这个方案并更新了一个版本,新版本显示这个ANR解决了。 @song2008_2001 官方3.8.6的 把 ALooper_pollAll 换成 ALooper_pollOnce 并不能解决这个ANR

1赞

ALooper_pollOnce其实是Google AGDK官方给的方案,估计他们是没怎么大范围测试

如果你方便提供ALooper_pollOnce的ANR堆栈信息截图,我去跟Google他们反馈下