One of the big problems between Android and the Linux kernel community has been an inability to communicate effectively. James noted that Android "did everything we told them not to, and won big." One might also argue that Nokia did everything the community told them to, and lost big. So perhaps part of the problem was that the Linux community did not understand the mobile arena all that well (this certainly applies to me, given my server background).
For its part, the Android community has not always explained its requirements clearly. From what I can see, the Android community was in fact doing its level best, but their (clearly superior) knowledge of the mobile arena includes subconscious as well as conscious components. When people ask them what they need, the Android guys dutifully list out their conscious knowledge. When a Linux hacker cranks out a patch, the result will be unsatisfactory: unless the hacker is luckier than anyone deserves, the patch will fail to meet the requirements in the subconscious list. The Android developer then says "We told you exactly what to do, how could you mess it up so badly???" while the hapless Linux community member says "I did exactly what you told me, but you changed the requirements!!!" This sequence of events clearly will not do much to build trust between the Android and the Linux communities.
By the way, this problem is not specific to the Android folks: Those of us at Sequent had exactly the same problem explaining parallel programming. And some might argue that we still do have this problem!
How can this problem be addressed?
Training at Sequent surrounded new engineers with experienced parallel programmers. Over the course of a few months, the implicit knowledge buried on our subconscious minds would flow to the new engineer. Unfortunately, this apprenticeship model relies on there being lots of experienced engineers and only a few trainees, so it might quite some time for the few Android developers to train the huge number of Linux kernel hackers.
Another approach is to accept the fact that getting Android functionality into the Linux kernel will be an iterative process. A big part of the purpose of the first N patches is not so much to implement the functionality, but rather to learn what the requirements actually are. This approach can work very well, but it clearly requires considerable patience on the part of both the Android developer and the Linux kernel hacker.
Both these approaches take a lot of time. But given that the Android folks have optimized their patchset for forward porting, perhaps we can afford to take the time needed to get it right.