minSdkVersion:项目支持的最低版本,新的api的发布总会带来一些新的特性,大部分是向前兼容的,但也有不兼容的,如果手机的系统低于这个版本是不能运行这个APP的。
targetSdkversion:系统为了兼容旧版本,依然保持在旧版本上的行为效果,例如设置此版本为23则需要对6.0的权限做适配,如果小于23则不用,andrid 7.0对 File 的分享启动了 StrictMode,当你想要通过 file:// 安装一个私有目录下的 apk 的时候,会抛出FileUriExposedException错误,这个时候你就需要使用 Android 提供的 FileProvider 来对此进行支持。但是这样重大的改动,只有在开发者主动将 targetSdkVersion 升级到 24 才会启动,如果 targetSdkVersion 没有被升级,会依然保持之前的行为效果,并不用担心 FileUriExposedException 异常。
compileSdkVersion: 是在开发和编译期间,给开发者使用的。用于告诉 Gradle ,使用那个 Android SDK 版本来进行编译和打包 App,如果需要使用新的 Android SDK 中的 Api,就需要更新 compileSdkVersion 对应的版本号。
而我们知道,android.jar 并不会被编译进 Apk 中,同时 compileSdkVersion 只是改变的编译行为而不会改变运行时的行为,也就是说,当 Apk 被安装在设备上之后,它就是直接和系统的 Api 交互了,编译时候的 android.jar 只是为了保证编译能通过。
当 compileSdkVersion 被修改的时候,可能会出现一些编译时候的警告和编译错误,这些错误应该都会被编译器的 Lint 检测到。注意这些并不是 Error ,而是 Warning 。但是这些 Warning 的出现都是有原因的,一定要及时修复这些 Warning,哪怕需要使用@SuppressLint或者@TargetApi进行标记它,也只是我们在确定无碍的情况下的一种处理方式。