【问题标题】:Building multi-SDK Android apps in Eclipse without losing compile-time checks在 Eclipse 中构建多 SDK Android 应用程序而不会丢失编译时检查
【发布时间】:2011-11-30 07:57:58
【问题描述】:

我正在 Eclipse 中开发一个 Android 应用程序。我想针对各种设备和 SDK 版本(例如,我可以选择支持多点触控)。我理解 recommended approach 将所有新功能隔离到一个单独的类并利用延迟加载仅在主机设备实际支持该功能时才在运行时加载该类。

这种方法的缺点是我必须使用我想要使用的最新功能的 SDK 来编译我的所有代码。这意味着如果某些新功能泄漏到我的“版本中性”代码中,编译器将无法再捕获它。

我希望能够在 Eclipse 中针对较旧的 Android SDK 编译我的项目,以确保我的“版本中立”代码正常。如果可能的话,我想避免将我的构建系统移出 Eclipse。我可以接受这个旧的 SDK 版本运行起来有点尴尬。

我认为这归结为在 Eclipse 中进行一些条件编译(或条件“链接”)?例如,在针对 SDK-1.6 构建的项目中,我想将“MultiTouchHandler.java”源代码排除在构建之外。不过,我不确定是否可以在 Eclipse 中表达这样的“构建类型”。

hacky 解决方案似乎只是手动更改项目的 SDK 版本、重建和查看错误,并忽略“预期”错误。矫枉过正的解决方案似乎是编写我自己的 ant/maven/make 构建脚本。

相关问题

这个问题: Versioning and common code-bases with Eclipse 涵盖类似的基础,但涉及将所有特定于版本的类移动到单独的“库”中。 (我认为我仍然会在 Eclipse 中遇到多种构建类型的问题。)

这个问题: Build multiple project configurations with eclipse 暗示我应该迁移到外部构建系统(如 ant 或 maven),但这比不时尝试使用旧 SDK 构建要多得多。

【问题讨论】:

    标签: java android eclipse compatibility conditional-compilation


    【解决方案1】:

    一种不太干净/性能较差的方法是使用反射来访问您需要的较新的 api,而不是尝试通过延迟加载直接引用它们。这应该允许您针对较低的 sdk 级别进行编译。

    【讨论】:

    • 是的,这是一个好点。我应该在我的问题中提到这一点。缺点是我失去了对新代码的任何编译时检查(因为它的所有运行时都已解决),如果新方法很复杂,它会很快变得非常难看。但是对于我当前的代码,我需要的解决方法只是几个常量和两个简单​​的方法调用,所以它可能是值得的。
    • 同意。反思绝对是一种痛苦:)
    【解决方案2】:

    2012 年 2 月 (v17) 对 ADT 中的 Lint 工具的更新应该有助于解决这个问题,而无需多次构建。当应用程序以旧的最低 SDK 为目标,但针对最新的 SDK 进行编译(这是推荐的做法)时,lint 工具会注意到是否调用了对较新的 SDK 的调用。如果您确信调用正常(因为您已将其隐藏在运行时 SDK_INT 检查或其他原因之后),您可以快速修复注释以防止出现警告。

    例如,在我的代码中,我调用了 API 11 中引入的 View.setSystemUiVisibility,但我的目标是 API 8。运行 Lint 显示:

    调用需要 API 级别 11(当前最低为 8):android.view.View#setSystemuiVisibility

    QuickFix 建议了两种修复方式,一种是添加抑制警告的注解,另一种是添加一个注解来声明一段代码在 API 11 中工作。

    更多详情:http://tools.android.com/recent/lintapicheck

    【讨论】:

    • 不幸的是,lint 工具非常不可靠,并且经常无法正常运行或刷新。
    猜你喜欢
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    相关资源
    最近更新 更多