I just found this handy directory of available Android devices over at
Google:
http://www.google.com/phone/#
I personally have the Nexus One (sadly not available any more) which I
use on T-Mobile. I love it. If I had to get another phone right now,
I'm probably look seriously at the Samsung Vibrant, which is the T-
Mobile version of the Galaxy S.
I'd definitely recommend against considering any phone that isn't at
least running Android 2.1 at this point (and preferably 2.2).
The Android software stack is a (non-standard) Linux kernel hosting a
(non-standard) Java VM (called Dalvik) that provides a (semi-standard)
Java SE environment. To be more precise, the kernel is Linux, but
Google maintains their own fork, but their changes to support a lot of
the features needed for a mobile device environment have not been
folded back into the mainline kernel. It's possible this may happen in
the future. The Dalvik VM uses a different bytecode than the standard
Java VM, ostensibly for efficiency in memory constrained environments,
but also possibly as a dodge around various legal issues. Google
provides a bytecode translator as part of their SDK, so code compiled
with standard java compiles can be transliterated. This of course also
assumes API compatibility. Android provides most of the standard Java
SE 1.6 API, with the major exception being the UI framework. Android
uses its own custom UI framework.
There is also an NDK (mentioned earlier) that supports native code
development. Since all the current Android handsets use an ARM CPU of
some sort, this is also reasonably portable.
As far as using JVM languages other than Java, the major gating factor
would probably be if the runtime for that language depends on runtime
bytecode synthesis (which see Jython). In contrast, I've heard of
people successfully using Scala to write Android code.
As far as the native environment goes, if you are interested in that,
you'll probably make sure you get a phone that is easy to root. Both
for the purpose of being able to install community built ROMs
(customized versions of the software stack) and having full shell
access to your device. Then again, for my own purposes, I've never
needed to do that.
Unlike iOS devices, it's not necessary to crack your device to run
"unapproved" apps on it. The Android App store is the preferred
method of software distribution, but all that is necessary to download
and run apps from other sources is to go into settings on your device
and check one box that says "I take responsibility for running random
third party software on my device". How remarkably grown up. Also
while Android apps can be signed, it is not required to do so to run
them on a device. Again, unlike iOS devices, where app signing is done
by Apple to control whose apps are available on their phone, app
signing on Android is merely done to signify what developer the app
came from. The only real benefit of app signing is that apps from the
same developer are allowed root around in each others private storage,
which is otherwise not allowed. Apps may of course always share
public storage.
-wilhelm