ANRs in Google's developer console for some old devices

I have a bunch of ANRs in Google’s developer console, they are grouped under “ANR Broadcast of Intent { act=android.intent.action.SCREEN_OFF flg=0x40000000 }”. They are typically occurring on some old devices (S5360, S5570, etc). They occur rarely, I see thousands of users of S5360 and S5570 in statistics, but only 20-30 ANRs each day for those devices.

The problem is that there are many 1-star ratings from those unhappy users with ANRs. But I do not want to remove S5360 and S5570 from the list of supported devices on Google Play, because they are working fine for many users.

Does anybody have any ideas on how to fix those ANRs? I’m not expert in cocos2dx internals, but why SCREEN_OFF may sometimes cause “Application not responding” dialog? As I know, SCREEN_OFF is sent when user turns off the device. I’m unable to reproduce the problem on my Android devices.

Below is a typical ANR report from my Google’s developer console:

DALVIK THREADS:
(mutexes: tll=0 tsl=0 tscl=0 ghl=0 hwl=0 hwll=0)
“main” prio=5 tid=1 NATIVE
| group=“main” sCount=1 dsCount=0 obj=0x400221a8 self=0xcec8
| sysTid=160 nice=0 sched=0/0 cgrp=default handle=~~1345006496
at com.android.server.SystemServer.init1
at com.android.server.SystemServer.main
at java.lang.reflect.Method.invokeNative
at java.lang.reflect.Method.invoke
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run
at com.android.internal.os.ZygoteInit.main
at dalvik.system.NativeStart.main
“Binder Thread #8” prio=5 tid=50 NATIVE
| group=“main” sCount=1 dsCount=0 obj=0x40a0bec8 self=0x35f9d8
| sysTid=2359 nice=0 sched=0/0 cgrp=default handle=3995352
at dalvik.system.NativeStart.run
“Thread-118” prio=5 tid=49 NATIVE
| group=“main” sCount=1 dsCount=0 obj=0x409eb650 self=0x32fea0
| sysTid=1956 nice=0 sched=0/0 cgrp=default handle=3787040
at android.os.MessageQueue.nativePollOnce
at android.os.MessageQueue.next
at android.os.Looper.loop
at com.google.android.gsf.Gservices$1.run
“android.hardware.SensorManager$SensorThread” prio=5 tid=46 NATIVE
| group=“main” sCount=1 dsCount=0 obj=0x40a0a6a8 self=0x248340
| sysTid=1183 nice=~~8 sched=0/0 cgrp=default handle=2017872
at android.hardware.SensorManager.sensors_data_poll(Native Method)
at android.hardware.SensorManager$SensorThread$SensorThreadRunnable.run(SensorManager.java:447)
at java.lang.Thread.run(Thread.java:1019)

“gps_libsecgps” prio=5 tid=45 NATIVE
| group=“main” sCount=1 dsCount=0 obj=0x408b5748 self=0x3af998
| sysTid=811 nice=0 sched=0/0 cgrp=default handle=3862848
at dalvik.system.NativeStart.run(Native Method)

“SoundPool” prio=5 tid=48 NATIVE
| group=“main” sCount=1 dsCount=0 obj=0x40900ca0 self=0x272480
| sysTid=508 nice=0 sched=0/0 cgrp=default handle=2019520
at dalvik.system.NativeStart.run(Native Method)

“SoundPoolThread” prio=5 tid=47 NATIVE
| group=“main” sCount=1 dsCount=0 obj=0x407e3a98 self=0x1ecf08
| sysTid=509 nice=0 sched=0/0 cgrp=default handle=3148384
at dalvik.system.NativeStart.run(Native Method)

“Binder Thread #7” prio=5 tid=44 NATIVE
| group=“main” sCount=1 dsCount=0 obj=0x40871df0 self=0x2841b0
| sysTid=318 nice=0 sched=0/0 cgrp=default handle=2629224
at dalvik.system.NativeStart.run(Native Method)

“Binder Thread #6” prio=5 tid=43 NATIVE
| group=“main” sCount=1 dsCount=0 obj=0x4086d750 self=0x280b58
| sysTid=317 nice=0 sched=0/0 cgrp=default handle=2626040
at dalvik.system.NativeStart.run(Native Method)

“pool-1-thread-1” prio=5 tid=42 WAIT
| group=“main” sCount=1 dsCount=0 obj=0x408252b0 self=0x2efd18
| sysTid=273 nice=0 sched=0/0 cgrp=default handle=3079760
at java.lang.Object.wait(Native Method)

  • waiting on <0x408349c8> (a java.lang.VMThread)
    at java.lang.Thread.parkFor(Thread.java:1424)
    at java.lang.LangAccessImpl.parkFor(LangAccessImpl.java:48)
    at sun.misc.Unsafe.park(Unsafe.java:337)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:157)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2016)
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:411)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1021)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1081)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
    at java.lang.Thread.run(Thread.java:1019)

“Binder Thread #5” prio=5 tid=41 NATIVE
| group=“main” sCount=1 dsCount=0 obj=0x407d6008 self=0x1ce208
| sysTid=267 nice=0 sched=0/0 cgrp=default handle=1861760
at dalvik.system.NativeStart.run(Native Method)

“Binder Thread #4” prio=5 tid=40 NATIVE
| group=“main” sCount=1 dsCount=0 obj=0x407f0098 self=0x204370
| sysTid=263 nice=0 sched=0/0 cgrp=default handle=1763352
at dalvik.system.NativeStart.run(Native Method)

“GpsLocationProvider” prio=5 tid=39 NATIVE
| group=“main” sCount=1 dsCount=0 obj=0x4054f7d0 self=0x247560
| sysTid=257 nice=10 sched=0/0 cgrp=bg_non_interactive handle=2389656
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:119)
at android.os.Looper.loop(Looper.java:117)
at com.android.server.location.GpsLocationProvider$GpsLocationProviderThread.run(GpsLocationProvider.java:1575)

“RefQueueWorker@org.apache.http.impl.conn.tsccm.ConnPoolByRoute@40542180” daemon prio=5 tid=38 WAIT
| group=“main” sCount=1 dsCount=0 obj=0x40548dd8 self=0x1a0288
| sysTid=249 nice=0 sched=0/0 cgrp=default handle=1704160
at java.lang.Object.wait(Native Method)

  • waiting on <0x405700c8> (a java.lang.ref.ReferenceQueue)
    at java.lang.Object.wait(Object.java:395)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:107)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:80)
    at org.apache.http.impl.conn.tsccm.RefQueueWorker.run(RefQueueWorker.java:102)
    at java.lang.Thread.run(Thread.java:1019)

“Binder Thread #3” prio=5 tid=37 NATIVE
| group=“main” sCount=1 dsCount=0 obj=0x407265d0 self=0x1b0548
| sysTid=247 nice=0 sched=0/0 cgrp=default handle=1806760
at dalvik.system.NativeStart.run(Native Method)

“ThrottleService” prio=5 tid=36 NATIVE
| group=“main” sCount=1 dsCount=0 obj=0x4080d128 self=0x206288
| sysTid=220 nice=0 sched=0/0 cgrp=default handle=1708056
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:119)
at android.os.Looper.loop(Looper.java:117)
at android.os.HandlerThread.run(HandlerThread.java:60)

“LocationManagerService” prio=5 tid=35 NATIVE
| group=“main” sCount=1 dsCount=0 obj=0x407e5848 self=0x2501c0
| sysTid=219 nice=10 sched=0/0 cgrp=bg_non_interactive handle=1713320
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:119)
at android.os.Looper.loop(Looper.java:117)
at com.android.server.LocationManagerService.run(LocationManagerService.java:556)
at java.lang.Thread.run(Thread.java:1019)

“watchdog” prio=5 tid=34 TIMED_WAIT
| group=“main” sCount=1 dsCount=0 obj=0x40519840 self=0x1b28a8
| sysTid=212 nice=0 sched=0/0 cgrp=default handle=951424
at java.lang.Object.wait(Native Method)

  • waiting on <0x40519840> (a com.android.server.Watchdog)
    at java.lang.Object.wait(Object.java:395)
    at com.android.server.Watchdog.run(Watchdog.java:404)

“backup” prio=5 tid=33 NATIVE
| group=“main” sCount=1 dsCount=0 obj=0x40804850 self=0xf3420
| sysTid=207 nice=10 sched=0/0 cgrp=bg_non_interactive handle=1710568
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:119)
at android.os.Looper.loop(Looper.java:117)
at android.os.HandlerThread.run(HandlerThread.java:60)

“AudioService” prio=5 tid=32 NATIVE
| group=“main” sCount=1 dsCount=0 obj=0x408275f0 self=0xe8b20
| sysTid=206 nice=0 sched=0/0 cgrp=default handle=953432
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:119)
at android.os.Looper.loop(Looper.java:117)
at android.media.AudioService$AudioSystemThread.run(AudioService.java:1556)

“VoldConnector” prio=5 tid=31 NATIVE
| group=“main” sCount=1 dsCount=0 obj=0x40813078 self=0x254280
| sysTid=204 nice=0 sched=0/0 cgrp=default handle=2442168
at android.net.LocalSocketImpl.readba_native(Native Method)
at android.net.LocalSocketImpl.access$400(LocalSocketImpl.java:29)
at android.net.LocalSocketImpl$SocketInputStream.read(LocalSocketImpl.java:92)
at com.android.server.NativeDaemonConnector.listenToSocket(NativeDaemonConnector.java:112)
at com.android.server.NativeDaemonConnector.run(NativeDaemonConnector.java:85)
at java.lang.Thread.run(Thread.java:1019)

“MountService” prio=5 tid=30 NATIVE
| group=“main” sCount=1 dsCount=0 obj=0x40812b18 self=0x2537b0
| sysTid=203 nice=0 sched=0/0 cgrp=default handle=2439400
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:119)
at android.os.Looper.loop(Looper.java:117)
at android.os.HandlerThread.run(HandlerThread.java:60)

“Tethering” prio=5 tid=29 NATIVE
| group=“main” sCount=1 dsCount=0 obj=0x4080dba0 self=0x252910
| sysTid=202 nice=0 sched=0/0 cgrp=default handle=2298712
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:119)
at android.os.Looper.loop(Looper.java:117)
at android.os.HandlerThread.run(HandlerThread.java:60)

“WifiService” prio=5 tid=15 NATIVE
| group=“main” sCount=1 dsCount=0 obj=0x40809df8 self=0x22e4e8
| sysTid=201 nice=0 sched=0/0 cgrp=default handle=2287136
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:119)
at android.os.Looper.loop(Looper.java:117)
at android.os.HandlerThread.run(HandlerThread.java:60)

“ConnectivityThread” prio=5 tid=28 NATIVE
| group=“main” sCount=1 dsCount=0 obj=0x407efeb0 self=0x251900
| sysTid=199 nice=0 sched=0/0 cgrp=default handle=2428392
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:119)
at android.os.Looper.loop(Looper.java:117)
at com.android.server.ConnectivityService$ConnectivityThread.run(ConnectivityService.java:239)

“NetdConnector” prio=5 tid=27 NATIVE
| group=“main” sCount=1 dsCount=0 obj=0x407ef858 self=0x250fc0
| sysTid=198 nice=0 sched=0/0 cgrp=default handle=2427752
at android.net.LocalSocketImpl.readba_native(Native Method)
at android.net.LocalSocketImpl.access$400(LocalSocketImpl.java:29)
at android.net.LocalSocketImpl$SocketInputStream.read(LocalSocketImpl.java:92)
at com.android.server.NativeDaemonConnector.listenToSocket(NativeDaemonConnector.java:112)
at com.android.server.NativeDaemonConnector.run(NativeDaemonConnector.java:85)
at java.lang.Th…

Yeah I had the same problem with Arrow Mania. My 4 sprite sheets were 1024x2048 pixels. Basically, the phone couldn’t handle it. I halved all sprite sheets and detected lower res phones and made my game run that way (wasn’t too hard as I already did that for iOS retina and non-retina phones).

It is well worth doing, most of India, Spain, eastern Europe, etc players are using these phones. In my Google Analytics two models of Galaxy Y are 3rd and 6th most popular devices.

The other thing to look out for is to make sure you are using 2.1.5 Cocos2D-x, there was also a problem with CocosDension on a number of phones like the S2 and Galaxy Y, and a black screen problem, both have now been fixed.

Gav GMTDev wrote:

Yeah I had the same problem with Arrow Mania. My 4 sprite sheets were 1024x2048 pixels. Basically, the phone couldn’t handle it. I halved all sprite sheets and detected lower res phones and made my game run that way (wasn’t too hard as I already did that for iOS retina and non-retina phones).

I’m also using smaller images for low-res screens, but ANRs are still occurring. Do you mean that with Cocos2dx 2.1.5 you have no SCREEN_OFF ANRs in developer console? I’m still using Cocos2dx 2.0.4, because it works fine for me, the only problem is ANRs.