Question

I have an app to release which works on all android screen-sizes (except smaller) and densities above SDK version 2.0.

It will also run on extra large screens. Currently I have added this:

<supports-screens
        android:largeScreens="true"
        android:normalScreens="true"
        android:smallScreens="false"
        android:anyDensity="true" 
    />

But I also need to add android:xlargeScreens="true" , to allow it visible in android market on extra large screen devices, since by default it is false.

But to add android:xlargeScreens I need to change my eclipse targetsettings to 2.3 as this attribute was added from API level 9.

So what should I do with my target compilation settings for this scenario ? Should it be 2.3 while compiling ? If yes, then will the app not give any problems while running on devices with 2.0 version ?

Was it helpful?

Solution 6

While reading this blog post I guess I have an answer on my old question. An extract below (which is for another manifest attribute "requiresSmallestWidthDp" introduced from 3.2):

"The catch is that you must compile your application against Android 3.2 or higher in order to use the requiresSmallestWidthDp attribute. Older versions don’t understand this attribute and will raise a compile-time error. The safest thing to do is develop your app against the platform that matches the API level you’ve set for minSdkVersion. When you’re making final preparations to build your release candidate, change the build target to Android 3.2 and add the requiresSmallestWidthDp attribute. Android versions older than 3.2 simply ignore that XML attribute, so there’s no risk of a runtime failure."

OTHER TIPS

Yes you need to change the uses sdk to 2.3 but make sure that you are not using any newer apis which are not in 2.0 or whatever your minimum supported sdk version is. Or in case you want to use them you have to use reflection.

But more about how to use the sdk versions is here and more about uses-sdk is here.

I do the same in my application and make sure you test your application in both[all] the versions before you release.

Best, Achie.

I'm moving this from the comments to make it more clear for others looking at this question in the future.

When supporting both old and new versions of Android it can be confusing how applications manage to run despite many things change with in the frameworks during each new release, I'm going to try and clarify this here.

An application written for the 1.5 sdk can only call functions that exist for that API level, so for instance the multi touch api's didn't exist in 1.5 and never will. Now you say "Ok but I don't need to call any newer APIs, I just want my app to work in 2.3 and have a2sd support" And I say "Ok, just change your targetApi in the manifest, set the minSDK and compile against 2.3 and you're good to go."

Now why does that work? What if the onMeasure() method for ListView was changed in 2.2 and now calls betterCalculateFunction() within onMeasure()? Why does my app still work?

This is the advantage of late binding in Java. You see, Java is never compiled until it reaches a device and is running, what you are doing in Eclipse is converting it to byte code which contains a bunch of byte code instructions that are later interpreted by the device. The byte code will NEVER contain a reference to betterCalculateFunction() though (unless you directly call it. Calling onMeasure() is indirect). This can happen because when your code is running on the device it gets linked against the Android framework on the device and your code calls onMeasure() directly because it is a public outward facing API. The path of execution will then enter the framework and call whatever it needs to, then once its done return to your code.

So on 1.5 you might see

doStuff (your code) -> onMeasure (public API) -> done

and 2.2

doStuff (your code) -> onMeasure (public API) -> betterCalculateFunction (private function) ->done

Now if you need to call functions that may or may not exist depending on API level then I suggest you look at a related answer of mine here stackoverflow: gracefully downgrade your app

Hope that clears some things up.

I haven't tried 2.3, but that's what I do with 2.2.

I compile for 2.2 and test on 1.6 to make sure everything works how I'm expecting. I haven't run in to any issues with it.

To double check, set your target for 2.3 and then setup an emulator for a lower rev version to make sure it all works.

The default value for android:xlargeScreens is true, so you don't have to change anything - it's on by default, as long as your minSdkVersion or targetSdkVersion is higher than 4. http://developer.android.com/guide/topics/manifest/supports-screens-element.html

Here is an official Android developer blog explanation of how this works:
http://android-developers.blogspot.com/2010/07/how-to-have-your-cupcake-and-eat-it-too.html

In summary: you can use the newest XML whilst still supporting the older OS versions in a back compatible way.

For different screens you have to create multiple apk then it reduces size of your application.In each application's manifest you have to define according to following link. http://developer.android.com/guide/practices/screens-distribution.html

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top