Explain behavior of Unix sleep() function executed on Android

235 views Asked by At

I am currently compiling and executing some C++ code on a rooted Android device. I use adb (adb shell). To compile my code, I don't use the NDK, but I cross-compile with CMake

I'm using the function sleep(seconds) of unistd.h.

I've experienced some curious behaviors with that function on Android: Basically, I have a for loop in which I std::cout something and then call sleep(x).

If I call sleep(1), the behavior is the one expected: The program waits 1 second, and then executes the next instructions.

If I call sleep(2), the behavior isn't the one expected. The program gets stuck on that instruction for ever.... until I hit a key on my PC keyboard (not the device's one), and then it gets stuck on the next sleep(2)... until I hit a key, etc...

This behavior happens only when the device screen is off. As soon as I click on the power button to turn the screen on, the program resumes and has the expected behavior.

N.B: The behavior is the same with usleep(useconds)

I have tried to see where the limit is between 1 and 2 seconds: 1.5s, 1.25s, 1.125s -> always stay blocked | 1.0625s -> ~50% chance of staying blocked.

Obviously, there is something that prevents a thread to wake up if it sleeps more than 1 seconds (at least 2). So my question would be, does anyone have any idea of why this is happening, and has a detailed explanation of the process ?

Thank you !

1

There are 1 answers

2
Matt Cobb On

Android puts applications in the background when they aren't doing any user interaction - unix sleep and java timers etc. won't wake them up. You have to use an android alarm or runnable postDelayed handler.