4

我有一个要发布的应用程序,它适用于 SDK 2.0 版以上的所有 android 屏幕尺寸(较小的除外)和密度。

它也将在超大屏幕上运行。目前我已经添加了这个:

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

但我还需要添加android:xlargeScreens="true", 以使其在超大屏幕设备上的 android 市场中可见,因为默认情况下它是 false。

但要添加android:xlargeScreens我需要将我的 eclipse 目标设置更改为 2.3,因为此属性是从 API 级别 9 添加的。

那么对于这种情况,我应该如何处理我的目标编译设置呢?编译时应该是2.3吗?如果是,那么该应用程序在 2.0 版本的设备上运行时不会出现任何问题吗?

4

7 回答 7

2

我将其从评论中移出,以使其他人在将来查看此问题时更加清楚。

当同时支持新旧版本的 Android 时,尽管在每个新版本中框架中都会发生许多变化,但应用程序如何管理运行可能会令人困惑,我将在这里尝试澄清这一点。

为 1.5 sdk 编写的应用程序只能调用该 API 级别存在的函数,因此例如多点触控 api 在 1.5 中不存在并且永远不会存在。现在你说“好的,但我不需要调用任何更新的 API,我只希望我的应用程序在 2.3 中工作并支持 a2sd”我说“好的,只需更改清单中的 targetApi,设置 minSDK 并编译反对2.3,你很高兴。”

现在为什么会这样?如果ListView在 2.2 中更改了 onMeasure() 方法,现在在 onMeasure() 中调用了 betterCalculateFunction(),该怎么办?为什么我的应用程序仍然有效?

这就是Java后期绑定的优势。您会看到,Java 在到达设备并运行之前永远不会被编译,您在 Eclipse 中所做的是将其转换为字节码,其中包含一堆字节码指令,这些指令稍后由设备解释。字节码永远不会包含对 betterCalculateFunction() 的引用(除非您直接调用它。调用 onMeasure() 是间接的)。这可能会发生,因为当您的代码在设备上运行时,它会与设备上的 Android 框架链接,并且您的代码会直接调用 onMeasure(),因为它是一个面向公共的面向外部的 API。然后执行路径将进入框架并调用它需要的任何东西,然后一旦完成返回您的代码。

所以在 1.5 你可能会看到

doStuff(您的代码)-> onMeasure(公共 API)-> 完成

和 2.2

doStuff(您的代码)-> onMeasure(公共 API)-> betterCalculateFunction(私有函数)->done

现在,如果您需要根据 API 级别调用可能存在或不存在的函数,那么我建议您在此处查看我的相关答案stackoverflow:优雅地降级您的应用程序

希望能解决一些问题。

于 2011-02-01T06:54:34.230 回答
2

是的,您需要将 uses sdk 更改为 2.3,但请确保您没有使用任何不在 2.0 或任何您支持的最低 sdk 版本中的较新 api。或者如果你想使用它们,你必须使用反射。

但是更多关于如何使用 sdk 版本的信息在这里更多关于 uses-sdk 的信息在这里

我在我的应用程序中做同样的事情,并确保您在发布之前在两个[所有]版本中测试您的应用程序。

最好的,阿奇。

于 2011-02-01T05:44:59.063 回答
0

这是一个官方的 Android 开发者博客解释这是如何工作的:
http ://android-developers.blogspot.com/2010/07/how-to-have-your-cupcake-and-eat-it-too.html

总之:您可以使用最新的 XML,同时仍以向后兼容的方式支持旧的操作系统版本。

于 2011-05-24T19:40:30.827 回答
0

android:xlargeScreens 的默认值为 true,因此您无需更改任何内容 - 默认情况下,只要您的 minSdkVersion 或 targetSdkVersion 高于 4。http: //developer.android.com/guide/topics /manifest/supports-screens-element.html

于 2011-04-05T16:43:19.323 回答
0

我还没有尝试过 2.3,但这就是我对 2.2 所做的。

我为 2.2 编译并在 1.6 上进行测试,以确保一切按我的预期工作。我没有遇到任何问题。

要仔细检查,请将您的目标设置为 2.3,然后设置一个较低版本的模拟器,以确保一切正常。

于 2011-02-01T05:44:08.480 回答
0

在阅读这篇博文时,我想我对我的老问题有了答案。下面的摘录(这是从 3.2 引入的另一个清单属性“requiresSmallestWidthDp”):

“要注意的是,您必须针对 Android 3.2 或更高版本编译您的应用程序才能使用 requiresSmallestWidthDp 属性。旧版本不理解此属性并会引发编译时错误。最安全的做法是开发您的应用程序与您为 minSdkVersion 设置的 API 级别相匹配的平台。当您为构建候选版本做最后准备时,请将构建目标更改为 Android 3.2 并添加 requiresSmallestWidthDp 属性。低于 3.2 的 Android 版本会忽略该 XML 属性,因此不存在运行时失败的风险。”

于 2011-09-20T06:13:12.323 回答
-1

对于不同的屏幕,您必须创建多个 apk,然后它会减小应用程序的大小。在每个应用程序的清单中,您必须根据以下链接进行定义。 http://developer.android.com/guide/practices/screens-distribution.html

于 2011-12-21T10:39:47.587 回答