Another Gingerbread Testing Image

Evening everybody. Got another testing image for you.
Changes:
  • Google apps should all be fixed now (tested with gmail particularly) — we’ve switched javascript engines and are now using V8
  • The accelerometer driver I’ve blogged about is now included in this build
  • Android codebase sync’ed to latest 2.3.3
  • Not included in this build is some preliminary work on GPS. It crashes Android (and freezes my RHOD400) so it’s been removed from the system image.
  • Proper hardware 3D driver provided in this system. Neocore still doesn’t work.
  • Gallery3D added to the build to test a possible fix for rotation issues. I’m mainly interested in results on RAPH.
Thanks again for everybody testing and providing feedback on these releases. This is signed so old data.img from our previous Gingerbread tester release may work. Again, if you have any problems, we suggest clearing out data.img before reporting them.

XDAndroid Gingerbread Accelerometer Support

Back when I started work on XDAndroid Gingerbread, I had a long list of features that were missing. One of the big entries on that list was the accelerometer. For accelerometer support, we rely on a sensors driver in the system.ext2 image that listens for events from the device.

In Gingerbread, a lot of the glue between those drivers and the Android system has changed, resulting in the incompatibilities we see now. This meant a rewrite was necessary for the driver we use. Today, I did the rewrite and got accelerometer support for Gingerbread. Those of you building from source can repo sync and get the updates now. Users will have to wait for a new system image (sorry).

The new driver is based on the HTC Passion (Nexus One) sensors driver, which is written in C++. The driver uses a few simple classes to do the heavy lifting, so the end result is a very manageable, simple and easy to understand driver. Down the line, we can also add proper proximity sensor support to the driver for Rhodium.

For developers and advanced users, the driver now resides in our device/xdandroid tree to follow upstream conventions. Please see the relevant commit for reference (and ignore the GPS change which I accidentally stuck in BoardConfig).

Thanks for reading!

XDAndroid Gingerbread Public Test Build

We’re pleased to finally release the first public testing system image of XDAndroid Gingerbread.

This is, of course, a work-in-progress build. Lots of things don’t work yet. However, what does work is working pretty well. Performance is either on-par with or an improvement over our Froyo versions. This is already a well-polished build. Gingerbread will be very nice when we get all the hardware support updated.

As I said, there is a lot that does not yet work at all. Here’s a list of known issues:

  • Google Apps will behave badly from time to time (arrrghhh noted blank window issues, for example)
  • GPS is not working (driver needs to be reimplemented) and Location services are generally missing as well
  • Accelerometer support is missing (driver needs to be reimplemented)
  • Bluetooth is not working, even on TI devices (crashes when activating – disabled in this build)
  • Other functionality and stability issues will occur

This has been signed with our release keys, which means you might be able to use a froyo data.img with it, but this is in no way supported (it’s a testing build after all). If you have issues with previous data images, start fresh and try again before reporting issues.

If you try out this build, please let us know of any issues via our IRC channel or bug tracker. Thanks!

Slaying the system_server Bug

(The following is a technical glimpse at a current XDAndroid development topic aimed at intermediate or advanced users and developers.)

Chances are if you’ve been using XDAndroid on a Rhodium, you’ve been hit by this annoying bug: the device is painfully slow from the time the XDAndroid boot animation begins. This is a bug seen mostly be Rhodium users and of varying degrees of consistency. Some people see it nearly every boot, others see it once in a handful of boots. When investigating the running environment while it’s happening, there is no interesting logcat or dmesg output, and top shows system_server hogging at least 95% of the CPU time.

An effective workaround has been to place a short phone call to the voicemail service and hang up. For whatever reason, this would cause system_server to calm down and act normal for the rest of the XDAndroid session. A more radical (and perhaps less effective) solution was to re-enable Dalvik’s JIT execution and put up with the various bugs it would potentially reintroduce. Somehow, JIT was able to mitigate the bug to the point that casual testing did not reproduce the system_server issue.

Upon further investigation by several XDAndroid team members (most notably arrrghhh and WisTilt2), the bug had been tracked down to the userland libraries used by XDAndroid for hardware support. This meant it was either an issue in the RIL, GPS or sensors (accelerometer) drivers. After even more testing by arrrghhh, who readily volunteered to test an unfinished internal Gingerbread build, it was determined that the likely culprit was the sensors driver, which remains missing in Gingerbread.

At my request, arrrghhh performed repetitive testing on our latest Froyo release (FRX04) with JIT disabled. With the sensors driver in place, the issue was reproduceable on essentially every boot. After removing the sensors driver, it could not be reproduced once. This was a very telling result, so it was time to figure out where the issue was in the sensors driver.

Finding the issue was actually relatively trivial. Such a runaway process usually indicates an uncontrolled loop. The sensors driver continuously checks for data from the sensors devices while Android is running. In our driver, the code responsible for that check is seemingly prone to infinite looping in a specific case where incomplete data is received from the sensors device. In practice, this case occurs frequently on Rhodium and sends system_server into fits. I’m guessing that making a phone call causes Android to query for a proximity sensor, which bails the sensors driver out of that loop to process the request (and then it goes back into the loop and is able to read data normally).

So, since the logic generally looked sound in the loop, the simplest and most likely solution was to add a delay while handling that corner case of incomplete data. For testing, we used an unreasonably large delay and added it in the general case for the loop, ensuring that the loop could never become a runaway in proper runtime conditions. Through more tedious testing, arrrghhh was able to confirm that the delay solved the runaway system_server issue (while making the sensors unusable).

After making that loop delay much shorter and placing it in the corner case exclusively, testing continued to show success. So it seems like the system_server bug is finally defeated. We’ve already released a new rootfs with the relevant change integrated. Give it a try and let us know how it works out, via the IRC channel or the aforementioned bug. Thanks for reading!