在SO上的普遍建议是编译SDK通常应该与目标SDK匹配。但我认为除了新创建的项目,很少有生产Android应用程序会这样配置。
如果让它们匹配有什么害处呢?实际上,让它们匹配或不匹配没有特别的害处。这完全取决于你正在编写什么以及你想要什么行为。
例如,Android 6.0引入了一个新的运行时权限模型,你必须向用户请求危险权限的代码,从WRITE_EXTERNAL_STORAGE到READ_CONTACTS。但是,只有在targetSdkVersion为23或更高版本时才使用此功能。如果你现在无法处理这个代码更改,你可以将targetSdkVersion保持在较低的值,如22。
然而,同时,也许你想使用关键的Android支持库v23版本,比如appcompat-v7。一般来说,你希望你的compileSdkVersion与你正在使用的支持库的主要版本匹配,因为它们可能引用只在那个compileSdkVersion中可用的类、方法、常量等。
因此,在这种情况下,你明确不想让compileSdkVersion与targetSdkVersion匹配。
现在,我个人认为,现在几乎没有优势可以得到最低的compile sdk版本了。
早在2008-2011年,一个普遍(尽管有缺陷)的建议是将 compileSdkVersion
与 minSdkVersion
(或者实际上,它们的Eclipse / Ant等价物,因为当时还不存在Android Studio)保持一致。这是因为我们缺乏工具自动告诉我们是否使用了在我们的 compileSdkVersion
(比如11)中有效但到我们的 minSdkVersion
(比如4)不可用的东西。将这两个值设为相等意味着如果你尝试使用比 minSdkVersion
新的东西,你会得到编译器错误。缺点是您被困于您的 minSdkVersion
的功能集,并且无法逐步增强您的应用程序以利用新设备上可用的更新功能。
现在,构建工具(特别是Lint)会警告您,如果您尝试使用在 compileSdkVersion
中有效但到 minSdkVersion
不可用的内容,因此您知道要放入适当的 Build.VERSION.SDK_INT
检查,以确保您仅在新设备上使用新功能并在旧设备上优雅地降级。