Only a minor correction, Dalvik doesn't run Java bytecode, Java bytecode is translated to Dalvik bytecode when the app is compiled
Correct. Cheers. The point I was trying to make was mainly with regards to pragmatous:
Now, can anyone see the contradiction in criticising Android for both running apps in a virtual machine AND for the software development issues caused by having many different hardware configurations?
Android is designed to run apps in a virtual machine because Google intended Android to run on numerous different hardware types. The VM allows for hardware abstraction.
The main issue between different Android handsets is screen resolution but, as it turns out, its not that big of a deal.
The exception to this is for applications such as video players with hardware decoding and some games. These types of apps are compiled for specific hardware and use the Android NDK.