Fragmentwhat?
Lets start by the basics, in case you don’t know it. Fragmentation (as it names implies), for this case, relates to an operating system platform without a homogeneous OS version.
In English? Not everybody has the same version of the same OS. Maybe out of ten people, seven have Androids devices, but out of those seven, three might be in version 2.3, two of them have version 4.1 and only two of them with the latest version. Thus, an Android app might not behave the same or even function on some of those 7 people. But why?
Each new version of any operating system has improvements and drops some older ways of doing things. So what might have worked on an earlier version doesn’t work now, and vice-versa. Therefor, in order to make an app to work across most Android versions, the app has to be branched out to comply for each version of it. Needless to say, branching out its cumbersome and costly, as it needs to be designed and tested for each variant.
The previous not taking into account the hardware itself in Android, which is quite extensive and plural. Making and testing an app, even with the same Android version of OS, behaves differently.
History
However, the funny thing is that in personal computing, this has always been the case. In the beginning there were the PCs, initially they were bare bones. As time passed and they progressed, video (namely color) and audio was added to them, but not in an uniform way. For video there were two “standards” (CGA & EGA). For audio, there was no standard! Each audio board function as they thought it should. Hence, when developing software for PCs, it was necessary from the get go to decide which standard (path) the software was going to take (support). Trying to support all of them was impractical. And so, the PC industry grew out of that as we know today, thus the mandatory word: Requirements, for any software.
Today the audio has been standardized, and the video is a descendant of VGA, however things moved to 3D Graphic cards and software: NVIDIA vs. ATI, OpenGL vs. DirectX. Specially on games and on graphics applications, it might support one or the other, rarely both. For the same economical and practical reasons as previously stated.
So the PC thrived under this fragmented model, but somehow for Android is a doomsday scenario. Yeah right!
Other platforms
On top of all this, the other mobile platforms are also fragmented, the thing is they’re not as much. Windows Phone between 7 & 8 is quite different, BB 10 OS a completely new approach than those previous version of BB. And last but not least iOS.
Yes, 90% of iOS users are under the “same” version, however many people forget or ignores to comment that not all iOS versions are the same. In order for iOS 6 to fit on an old but trusty iPhone 3GS, some corners (features) were cut. So even if an app fully supports iOS 6 features, these features will not show up on an iPhone 3GS, worst, it will have to be tested on this phone to see if really behaves as it should and if nothing breaks apart. And that not taking into consideration (for example) that the iPad 1 is stuck with iOS 5 forever, due to memory (RAM) limitations (or so its said). So, if someone is designing an iPad app, it has to be branched for iPad 1 and following ones. Which bring us to square one.
Fragmentation really affects developments only if the apps is using the cutting edge of the OS, for an app not doing that much of complex things, a broader reach can be taken. If the developer is and indie one, then narrowing which devices are covered is the path to follow, on the contrary if the software is coming from a well establish entity, it should have enough resource to cover a lot of ground.
Anyway, computing has always lived with fragmentation, whether we have been aware of it or not.