I wrote that up once: Android targeting system
Important parts:
When compiling a Java application with a Java 7 compiler, you can’t
use it with a Java 6 interpreter. The interpreter will tell you, that
it can’t interpret the produced byte-code, even thought you’re not
using any Java 7 language features. If you want to compile with the
latest compiler but make your byte-code runnable on older JVM
instances, you’ll need to tell the compiler to do so (using the
-target-flag).
In Android, you can declare what platform-versions you support in your
manifest-file, using the <uses-sdk>
-element and it’s
android:minSdkVersion
and android:targetSdkVersion
-attributes. The
difference between those “targeting mechanics” is, that Android does
not care against which platform version the application was compiled.
If you declare your application to be compatible with API Level 4,
Android will happily install it, even if you compiled it against
Android 4.1 (API Level 16).
So in short:
- If you want your application to work with the newest Android platform, build against it.
- Use minSdkVersion to declare the lowest API Level which is supported by your application.
- As your targetSdkVersion, use the API Level against which you compiled the application.
- Use [Android] Lint to check for (possibly) unsupported API calls.
- Use conditional execution and the @TargetApi-annotation to use newer APIs when available.
When you're building your application with the newest SDK, you'll have all the Build.VERSION_CODES
available.