Fix #2999258: ANR in Settings after every reboot
The main problem here was in the error recovery when we are waiting for a process to start but it has failed for some reason. The code was just setting mPendingBroadcast to null, but this would cause an eventual ANR because the state was not set back to IDLE so we would continue waiting for the broadcast without trying to restart its process. Now we set it to idle. We also need to reset the "nextReceiver" index, so there is a new mPendingBroadcastRecvIndex variable holding what it should be set back to. While digging into this, I found a number of other lesser problems: - There is a race when booting the system where we set mSystemReady to true before restarting the upgrade processes. This could allow a broadcast to happen between those two and its process to immediately be removed. To fix this, there is a new mProcessesReady that is set once we are truly ready to start launching processes. - There were various places where we were calling sendBroadcastLocked() without the flag to send only to receivers... if this is called before mProcessesReady is set, then we would end up sticking any process for the broadcast on the holding list to not get launched until later (and hang up all broadcasts as they want for it). Now we always make sure to set this appropriately. - sendBroadcastInPackage() was not doing all of the validation that sendBroadcast() does. And of course a bunch of new debugging logs that were done in the course of tracking this down. Change-Id: I6134bbd94fdb73db8b693507b29499eae012d543
Loading
Please register or sign in to comment