【问题标题】:Android compatibilty settings in AndroidManifest.xmlAndroidManifest.xml 中的 Android 兼容性设置
【发布时间】:2011-02-01 05:36:19
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 似乎在下面的讨论中结束,只是为了在清单中添加 android:xlargeScreens="true" 我必须将属性中的整个项目目标更改为 API 级别 9 并编译和分发?这不会对在所有较低版本上运行的构建造成伤害吗?我已经在清单中设置了 目前我已在其属性中将我的 eclipse 项目目标平台设置为 2.0,如这是我需要支持的最低水平。

标签: android android-manifest google-play screen-size


【解决方案1】:

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

但是more about how to use the sdk versions is heremore about uses-sdk is here

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

最好, 阿奇。

【讨论】:

  • 是的,我们可以做到这一点,但不会使用较新的 API 进行编译,这会在旧设备上的某个地方破坏应用程序,这意味着 --- 尽管旧版本支持 API,但它的实现被覆盖(可能会被优化) ) 在较新的 2.3 版本中调用旧版本中不存在的方法。
  • @Pritam 不,这不会发生。如果 api 存在(因此包含在设备上的 Android 操作系统代码中),它将像以前一样执行,如果没有固件升级,就无法对旧 api 进行优化。
  • 不,不会。更新的方法(如果可用)将用于更新的 API,但由于您不会使用它们,因此您不能因为它们而破坏东西。如果较新的 api 确实有更好的实现,那么在较新版本上运行的设备将有适当的代码来运行它。
  • @smith324 我想更清楚一点我的意思。我担心的是假设在 API 级别 1 中添加了一个名为 func1() 的方法,并在 API 级别 9 中使用随 9 一起提供的其他一些 func_new 进行了增强/优化,所以对我们来说,我们仍然使用 func1() 并在使用库 2.3 进行编译时它会顺利的。但实际上当在较低的设备上运行时,它的实际输出 .dex 文件将失败,因为编译的代码使用的是设备上不支持的较新的 func_new()。
  • 我在 1.5 设备中看到了问题,但这不是因为我们正在谈论的问题。这是因为在 1.6 之前,仅支持一种屏幕尺寸,而 1.5 设备在可绘制文件夹中查找资源,而不是可绘制-[hdpi/mdpi/ldpi] 文件夹。因此,如果我们也支持 1.5,那么我们需要将 drawable-mdpi 中的所有资源放入 drawable 目录中。
【解决方案2】:

我将其从 cmets 中移出,以便其他人在未来查看此问题时更清楚。

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

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

现在为什么会这样?如果 ListView 的 onMeasure() 方法在 2.2 中被更改,现在在 onMeasure() 中调用 betterCalculateFunction() 会怎样?为什么我的应用还能运行?

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

所以在 1.5 上你可能会看到

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

和 2.2

doStuff(你的代码)-> onMeasure (公共 API)-> 更好的计算函数(私有 功能)->完成

现在,如果您需要根据 API 级别调用可能存在或不存在的函数,那么我建议您在此处查看我的相关答案stackoverflow: gracefully downgrade your app

希望能解决一些问题。

【讨论】:

  • 谢谢。因此,在原始问题上结束,只是在清单中添加 android:xlargeScreens="true" 我必须将属性中的整个项目目标更改为 API 级别 9 并编译和分发?这对在所有较低版本上运行的构建没有任何危害?
  • 我已经在清单中设置了 目前我已经设置了我的eclipse项目目标平台的属性到 2.0,因为这是我需要支持的最低级别。
  • @Pritam 是的,但请先在 minSdk 模拟器上进行测试。你的用户会感谢你的。
【解决方案3】:

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

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

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

【讨论】:

  • 如果我们将 target 设置为 2.3 并编译,在运行配置中我们看不到 eclipse 中低于 2.3 的 avd(模拟器)。
  • @Pritam:使用 AVD 管理器启动您想要的模拟器。然后设置您的运行配置以手动选择部署目标,并在提示时选择正在运行的模拟器。这就是您可以在项目设置为 2.3 的 2.1 模拟器上运行的方式。
  • Pritam,你需要使用uses-sdk标签并定义你想要支持的minSdkVersion。看看我的答案中的链接。
  • @Ted Hopp 谢谢。实际上,我在实际设备上进行了测试,但我担心的是@achie 的以下评论。
  • @Ted Hopp 感谢您这么快回答! @Pritam - 检查 Archie 的答案,这应该可以让你到达你需要去的地方!
【解决方案4】:

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

【讨论】:

【解决方案5】:

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

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

【讨论】:

    【解决方案6】:

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

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

    【讨论】:

      【解决方案7】:

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

      【讨论】:

        猜你喜欢
        • 2011-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多