Java 在Eclipse中构建多SDK Android应用程序而不丢失编译时检查

Java 在Eclipse中构建多SDK Android应用程序而不丢失编译时检查,java,android,eclipse,compatibility,conditional-compilation,Java,Android,Eclipse,Compatibility,Conditional Compilation,我正在Eclipse中开发一个Android应用程序。我想针对各种各样的设备和SDK版本(例如,我可以选择支持多点触摸)。我理解将所有新功能隔离到一个单独的类中,并利用延迟加载仅在运行时加载该类(如果主机设备实际支持该功能)的重要性 这种方法的缺点是,我必须使用我想要使用的最新特性的SDK来编译我的所有代码。这意味着,如果一些新特性泄漏到我的“版本无关”代码中,编译器将无法再捕获它 我希望能够在Eclipse中根据旧的Android SDK编译我的项目,以确保我的“版本中立”代码是正确的。如果可

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

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

我希望能够在Eclipse中根据旧的Android SDK编译我的项目,以确保我的“版本中立”代码是正确的。如果可能的话,我希望避免将构建系统移出Eclipse。我同意这个旧的SDK构建运行起来有点笨拙

我认为这可以归结为在Eclipse中执行一些条件遵从(或条件“链接”)吗?例如,在基于SDK-1.6构建的项目中,我希望将“MultiTouchHandler.java”源代码保留在构建之外。不过,我不确定在Eclipse中是否可以这样表达“构建类型”

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

相关问题 这个问题: 涵盖了类似的领域,但涉及将所有特定于版本的类移动到单独的“库”中。(我认为,在Eclipse中仍然存在多种构建类型的问题。)

这个问题:
这意味着我应该转向外部构建系统(如ant或maven),但这比偶尔尝试使用旧SDK构建要多得多。

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

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

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

调用需要API级别11(当前最小值为8):android.view.view#SetSystemMivibility

快速修复建议两种修复,要么添加一个注释来抑制警告,要么添加一个注释来声明一段代码在API 11下工作


这里有更多细节:

是的,这是一个很好的观点。我应该在我的问题中提到这一点。缺点是我丢失了对新代码的任何编译时检查(因为它的所有运行时都已解决),而且如果新方法很复杂,它会很快变得非常糟糕。但是对于我当前的代码,我需要的解决方法只是几个常量和两个简单的方法调用,所以这可能是值得的。同意。反射无疑是一种痛苦:)不幸的是,lint工具非常不可靠,通常无法正常运行或刷新。