blame linux?
Don't get me wrong I've been a linux user for about 16 years now, and linux on the desktop for at least 12 of those.. but I suspect a decent part of the problem is changing(breaking) the driver interfaces in the kernels as they come out significantly increasing the amount of work required to support a new android, instead of just dropping the older binary code on top of the newer kernel. Hard core open source folks say just release the source, a lot of times that is not feasible(and even with source it only solves part of the problem).
*I am not complaining* (learned to live with it), I've been an android user for almost 5 days now (WebOS before that). But I do believe it was a sufficiently large contributor for linux never making any inroads on desktop market share (because you really had to rely on drivers that came with the distribution - and distributions for the most part seemed bad about back porting driver updates to support new hardware). Their "solution" is to upgrade to a newer distro (and take other downsides that may come with that, all I want is a newer driver). For me it's not a big deal I just compile the driver(s) myself. Obviously that doesn't work for a normal user :)
An example I use is Intel e1000e(which is fully open source) driver and Ubuntu 10.04 LTS. They haven't updated the e1000e driver I suspect since 10.04 came out, and each time a kernel update occurred I have to compile a new driver. On my desktop/laptop I just disabled kernel upgrades now (even though desktop LTS is end of life the kernel and non desktop related things still get updates). I have absolutely no interest in going to a newer Ubuntu, maybe I'll go to mint or something when the time comes(which at this point I think is when I do my next hardware refresh), or maybe generic Debian which I use on all of my personal servers.
I suspect not many folks outside of the tech community care if their android devices get major OS upgrades.
It seems like the track record in general for major OS upgrades on mobile devices isn't that hot anyway, seem to get lots of breakage.
of course something like a stable binary interface to drivers is probably a boring, hard thing to get right so developers shift the blame to someone else, because they are lazy(and in some cases not being paid). I had hoped a decade ago this problem would of been solved by now but it seems that it'll never get fixed.