I'll have to do a small analogy. PC vs Consoles.

The biggest idea behind the console market is that the constructor controls both the hardware and the OS that runs on it. That (theoretically) permits a very fast and simple development, since you only have one single hardware specification, a single version of the OS, and even though the constructor might have several revisions of the hardware, there is usually a great care taken so that there is a near-perfect backward compatibility. Well, in short: the constructor takes a great care so that the developers and their applications are running smoothly on any revision of the hardware and OS. The price to pay is that you're bound to the performances and capabilities of the hardware you buy, without ever being able to upgrade it.

On the PC-side though, you have the ability to tweak the hardware the way you want, and YOU are in control of the performances of your machine. You can have a 3-way SLI happily heating your room without the need for a heater anymore, any kind of motherboard with any number of CPU, the fanciest sound card or network card you want, etc... but then there's a chance that the applications you're going to try running ain't going to do that smoothly, or perfectly. Because for the developer, testing software on PC with all possible combination of hardware and operating system is a plain nightmare. So there's always the possibility that when you buy that neat game for PC, it won't run on your hardware, because you have exactly the combination of hardware/operating system/drivers revision that wasn't tested by the developer, and crashes the game.

So, what Android has to do with it ? Simple: it brings both two worlds into the worst possible way. You have a hardware platform that you can't upgrade or enhance once you've bought it, AND the designer of the operating system doesn't control it, rendering the Android fauna a deep and intricate jungle. The only things google fixed into stone was only a few loose constraints, such as having an ARM processor, a touch screen, a few mandatory buttons, or a GPS. But the rest is at the discretion of the constructor.

Let's see. First, hardware-wise. I have a T-Mobile myTouch 3G. This phone has 192MB of RAM, a 528Mhz ARM processor, a 320x480 64k color screen, no hardware keyboard, and no multitouch touchscreen. This phone is actually an HTC magic. Or maybe not. The REAL HTC Magic phone actually has 288MB of RAM. Let's see to the other side of the brand. We have the Motorola Droid X, with a 1Ghz ARM processor, a 480x854 screen, 512MB of RAM, a hardware keyboard, and a multitouch screen. And of course, in between, there's a huge hunk of phones made by different constructors, with various specific tweaks. First nightmare for application developers: the hardware diversity.

Now, about the Operating System itself. Since T-Mobile is really lazy, my phone is stuck to the 1.6 revision of Android. I could probably upgrade to a non-official version of Android, but given the number of known issues with these unofficial firmwares, that'd probably give me more troubles than it's worth. I have a friend with a Samsung Galaxy who was stuck on a 1.5 Android until he decided to go rogue and install a custom firmware. The Droid was stuck on 2.1 for a long while, whereas the latest version available out there is the 2.2. As a result, there's still a bunch of applications I can't install at all, because they now require a 2.x version of the OS, or I have to find 1.x equivalents of these applications. I can't even start to fathom the pain it must be for developers to test their applications on at least 5 different versions of the OS. It's like saying you need to write, test and publish a software that works for Windows 3.11 up to Windows 7. And of course, every constructor makes their own flavor of it, with a few tinkers to the overall thing. Without talking about details such as the touchscreen precision.

Finally, about the overall design. Well, having multitasking is nice and all, but when an application requires 90% of the CPU on an older revision of the hardware, the developer can't control the fact there might be other applications running in background. Thus resulting in an uncontrollable sluggish or even unworkable experience for the end-user. Hell, even to simply PLACE a phone call, it sometime takes me more than 2 minutes, in order to be able to reach the proper menus and all. People can make fun of the iPhone and the quality of reception of AT&T, but at least, you can reach the dialer in a few seconds and actually try to place your call. And the best of all... the OS itself isn't stable. Well, I haven't tested anything else than my 1.6 Android, but I have experienced a lot of crashes, freezes, or simply application closing without any good reason. I had the navigation freezing the entire phone while driving. Luckily, I roughly knew the route, and I had someone else in the car able to handle the phone, as it was needed to remove the battery to reboot it - reboot that effectively takes more than 5 minutes before the navigation system can be functional again, you REALLY better know the route... But this is plain unacceptable. I even had the "phone" application crashing while placing a call, dropping it for good! Talk about the iPhone 4 gripping issue, dropping call... this is worse! There's no rubber band that can solve this! And don't even get me started on Bluetooth support...

All in all, I'd say that Android was maybe a good idea to begin with, but without hard constraints on the hardware specification, and with the rush to probably try to beat Apple and their iPhone, the OS got released in the wild, half specified, without support, and worst of all, full of bugs. And it's too late now to go back and fix things. There are too many phones and revisions of Android out there now. Apple did foresee that, and their constraints are actually helping diverging the various revisions of hardware / software combinations, effectively rendering every iPhone application a breathe to develop and publish.

-UPDATE-

After receiving some feedback from various people, I decided to go forward and install a Cyanogen firmware on my phone. Okay, NOW my phone behaves like a phone. It's snappy, smooth, and I can even pinch the map! Yay.

I know it's somehow HTC and/or T-Mobile's fault, as they are lazy and won't update that phone's firmware. But I still blame that on Google, to actually let that happen. I shouldn't have to hack and use various exploits in order to flash my phone with a third party, user made firmware, just to be able to properly use my phone.

By the way, there's a reason I choose a macbook pro as a laptop. The only device I'm okay to temper with is my desktop computer, and nothing else. For small and embedded devices, I either want:

-) Everything working smooth and nice, without any pro-tweaks.

-) or Freedom to install whatever firmware I want to, without having to rely on hacks and exploits.