应该编译sdk低于目标sdk

wes*_*ton 8 android

关于SO的压倒性建议是编译SDK通常应该与目标SDK匹配.

同样,建议将此[compileSdk]与目标sdk版本匹配.

... CompileSDK(通常等于目标SDk版本)版本.

这里明确的建议是:

通常,您应该针对应用程序可以支持的最低版本的平台编译应用程序.

我总是编译sdk匹配目标sdk,但自从阅读以来我意识到我和许多SO答案都是错误的.

我的问题是,使它们匹配有什么害处,或者反过来说,拥有最低编译sdk版本的优势是什么?

Com*_*are 6

关于SO的压倒性建议是编译SDK通常应该与目标SDK匹配.

真?我认为在新创建的项目之外,很少有生产Android应用程序如此配置,新项目向导倾向于为这些项目设置相同的值.

使它们匹配的危害是什么

使它们匹配没有特别的危害.使它们不匹配没有特别的危害.这一切都取决于你在写什么以及你想要什么样的行为.

例如,在Android 6.0引入了一个新的运行权限模型,在那里你必须将代码添加到您的应用程序向用户请求权限的危险,一切从WRITE_EXTERNAL_STORAGEREAD_CONTACTS.但是,仅在targetSdkVersion23或更高时使用.如果你现在无法处理代码更改,那么你应该特别留下targetSdkVersion更低的代码,比如22.

但是,与此同时,也许您想要使用v23版本的关键Android支持库,例如appcompat-v7.一般来说,您需要compileSdkVersion匹配正在使用的支持库的主要版本,因为它们可能引用了类,方法,常量等仅在其中可用的类compileSdkVersion.

因此,这将是您特别不想compileSdkVersion匹配的情况targetSdkVersion.

拥有最低编译sdk版本的优势是什么?

如今,恕我直言,几乎没有任何优势.

早在2008 - 2011年,一个常见的(尽管是有缺陷的)建议是compileSdkVersion匹配minSdkVersion(或者,实际上,他们的Eclipse/Ant等价物,因为Android Studio当时不存在).这是因为我们缺少工具来自动告诉我们我们是否使用了在我们compileSdkVersion(例如11)中有效的东西,但是我们没有一直使用minSdkVersion(例如,4).将这两个值设置为相等意味着如果您尝试使用比其更新的东西,则会出现编译器错误minSdkVersion.缺点是您无法使用您的功能集,minSdkVersion无法逐步增强您的应用程序,以利用较新设备上提供的新功能.

如今,构建工具(特别是Lint)会对你大吼大叫,如果你尝试使用那些在你的有效compileSdkVersion但不能一直有效的东西minSdkVersion,所以你知道要进行适当的Build.VERSION.SDK_INT检查以确保你只使用更新的东西在较新的设备上,并在旧设备上优雅地降级.