Thursday, March 29, 2012

The Connection Between ICS, Battery Life Issues, and VOIP

Most of the smartphone owning population doesn't know or care about VOIP, or Voice Over IP.  They get phone calls through their cell provider (not to mention the phone itself), solely over cell tower signals, and that's that.  But as some know, there is another dimension to calling, and that is the world of VOIP.

VOIP allows a phone or computer user to make and receive phone calls over any medium that can carry IP.  This includes not only your 3G/4G data plan, but via a Wi-Fi signal at home, work, or in many public places.  It also means that you can make and receive these phone calls without necessarily being tied to a certain company or contract.  You can even use your own hardware to host these calls, and connect these calls to the outside world in a variety of ways in an openly-competitive market (in contrast to the world of cell carriers).  In short, VOIP is most likely the future of all calling, though the cell carriers will do their damnedest to delay this inevitability as long as possible.

As an Android user and VOIP fanatic, intrigued by the possibilities of combining cell and VOIP for the ultimate voice connectivity, I am constantly fiddling with my phone settings, and trying what most would consider to be "experimental" configurations.  Besides my usual cell phone number and contract, I have had at least the following VOIP connections configured on my phone in one form or another, since I got my first Android phone 2 years ago:
  • SIP connection to a cloud hosted PBX (
  • Google Voice via Groove IP app (VOIP over Google Talk/Jabber/XMPP protocol)
  • SIP connection to my home Asterisk box server 
  • SIP connection to various other Asterisk boxes, such as those built for clients, test and demo units, etc.
  • Maybe some other stuff that I am forgetting
On Froyo and earlier, I used to use a third party SIP client (namely Sipdroid), as that was the only option.  I remember when Gingerbread came out and had native SIP support.  I was rather excited about that, since it meant two things:

  • As a memory starved OG Moto Droid owner, I was hopeful that this might offer a way to support my SIP habit without having to keep a 3rd party app running background all the time.  It also would be a little more elegant/less clunky.
  • Obviously this was a step forward for the VOIP world, if Google felt it was worthy enough to build it into the OS.
So since Gingerbread came out, I have been using the native SIP client on some level.  It's always worked pretty well, albeit with some reduced functionality and configurability (without getting into too many specifics right now), but simpler is sometimes better anyway.   All of this worked pretty well, on my OG Moto Droid running Gingerbread.  My phone would connect automatically to my home asterisk box when I got home, so I could use my phone like a cordless extension.  When I was away, the local IP address would be unreachable, and it would automatically disconnect.  I also had my work number through, and I had configured SIPdroid to connect to that.

Over the last few months, some things have changed.
  1. I switched to GrooveIP exclusively for my work number
  2. I decided to stop using a 3rd party SIP clients
  3. I moved our home number to the cloud PBX
  4. I got a Galaxy Nexus running Ice Cream Sandwich
I'm not sure about the exact order in which all of this stuff happened.  I had about a month or so of good time with my new GNex, but at some point, this is what I started having:

That's my phone chewing through over half the battery life in under 4 hours.  The only information I could get from the phone about why this was happening:

"Android OS".   Not very helpful.  After searching, searching, searching, online, I only found that other people were complaining about the same exact thing, and that this appears to be referred to in the singular as "the ICS battery bug/issue".  So that's what I had to work with.  With many different apps that are part of my regular Android setup, finding the culprit was like looking for a needle in a haystack.  The only other clue I had was this:

On Wi-Fi, the battery consumption was much BETTER, even normal(-ish).  At least what I would consider normal for a modern, powerful phone.

I spent the next month or more trucking around my charger and 2 spare batteries just to keep my phone running while I was traveling.  The phone would get extremely hot in my pocket, to the point where it was uncomfortable to even keep it there!

I decided that I wanted to unlock & root my phone, and install Codename Android (a highly customizable ROM for the Galaxy Nexus).  My reasoning was varied, but mainly I got tired of waiting around for updates. To my knowledge, Verizon still hasn't issue an update from 4.0.2, which has an NFC tag formatting bug, and some other known problems.  Having a custom ROM that is updated often gave me occasion to format my phone on a fairly regular basis.  I noticed the problem came back after I formatted and installed the latest version of ICS (4.0.3).  After a couple more tries, I eventually broke up the initial setup of all my config and apps into 3 or 4 parts.  Between each part, I would give it a rest and see if it had the issue. By process of elimination, I found out that it wasn't any of my apps at all that triggered this problem, it was my configuration of the native SIP client in ICS.  Furthermore, it was the native SIP client's connection to, which is maintained regardless of whether I am at home or away, connected to Wi-Fi or not (cloud connection).

Before I go any further, I should point out that I DID check the box that reads "receive incoming calls (reduces battery life)", so I suppose I asked for it on some level.  Also, I guess someone could also point out that it really was "Android OS" that was consuming all this battery life, so the chart wasn't lying.  However, I'll point out that this is not the first time I have configured my Android phone this way, and I never witnessed this issue when I was running 3rd party SIP clients.

So to wrap it up, I have reached the following conclusions:

  • Something about ICS uses a ton of power (at least as compared to 3rd party SIP clients) when the native SIP client is maintaining a connection over 3G/4G, but not when using Wi-Fi.  
  • Google really needs to break up the Android OS category in the battery usage report a little bit, so that users can see whether/which something that they have control over is consuming battery %.  There are lot of other people trying to figure out what the heck in this category is causing their problem, and it's causing a tough PR issue for ICS.
  • There really should be an option in the native SIP client config not to connect over 3G/4G
  • SIP was not designed to be used over 3G/4G data connections.  It is a busy protocol, sending keep-alive packets every 30 seconds or so, constantly using the radio and keeping the phone awake, even when there is no call going on.  The future of mobile VOIP will not necessarily be based on SIP/RTP (and probably won't be).

I am back to running a 3rd party SIP client, CSIPSimple, and excellent and highly configurable SIP client that allows me to better control when it connects to my cloud PBX.  Since then, my battery life is back to "normal".  On an average day, I use my phone 10-14 hours and I still have at least 25% battery left when I put it on charge for the night.

One more conclusion I reached: the world of mobile VOIP still seems to be in its infancy, as I could not find one other report of someone connecting the infamous "ICS battery bug" to this issue.  If a lot of people were using the native SIP client in Android, I would think this information would have been much more accessible.